Company
교육 철학

인공신경망 ANN 이해하기

딥러닝(Deep Learning)이 무엇인지, 어떤 기법이 있는지 알아보고 나서 파이토치(PyTorch) 기본 코딩 스타일을 알아봅니다. 이어서 딥러닝을 수행하는 프로세스와 최소한의 통계 지식, 시각화 기법을 알아봅니다. 빠르게 딥러닝을 알아가는 시간이 될 겁니다.
딥러닝 입문은 총 3개 장입니다. 1장에서 딥러닝 한눈에 살펴보기, 2장에서 인공 신경망 ANN 이해하기, 3장에서 간단한 신경망 만들기를 학습합니다.

인공 신경망 ANN(Artificial Neural Network) 이해하기 ❶

인공 신경망을 이용한 딥러닝 기초 지식을 설명합니다. 먼저 인공 신경망이 어떻게 동작하는지, 어떻게 발전해왔는지 알아봅시다. 그다음은 신경망끼리 비교해 어떤 신경망이 더 좋은 성능을 갖고 있는지 성능을 비교하는 방법을 알아봅시다. 마지막으로 인공지능이 어떤 방식으로 학습하는지를 알아보겠습니다.
2장 인공 신경망 ANN 이해하기는 총 3편입니다.

핵심 용어 미리보기

1.
인공 뉴런(퍼셉트론)은 입력값과 가중치, 편향을 이용해 출력값을 내는 수학적 모델입니다.
2.
단층 인공 신경망은 퍼셉트론을 하나만 사용하는 인공 신경망입니다.
3.
다층 인공 신경망은 퍼셉트론을 여러 개 사용하는 인공 신경망입니다.
4.
입력값을 표현하는 입력층, 신경망의 출력을 계산하는 출력층, 입력층 이후부터 출력층 전까지는 은닉층입니다.
5.
가중치는 입력의 중요도를 나타내고 편향은 활성화의 경계가 원점으로부터 얼마나 이동할지를 결정합니다.
6.
활성화 함수는 해당 뉴런의 출력을 다음 뉴런으로 넘길지를 결정합니다. 시그모이드 함수는 뉴런 의 출력값을 0과 1 사이로 고정합니다.
7.
손실 함수는 정답과 신경망의 예측의 차이를 나타내는 함수입니다.
8.
경사 하강법은 손실을 가중치에 대해 미분한 다음, 기울기의 반대 방향으로 학습률만큼 이동시키 는 알고리즘입니다.
9.
오차 역전파는 올바른 가중치를 찾기 위해 오차를 출력층으로부터 입력층까지 전파하는 방식입 니다.
10.
오버피팅은 과적합이라고도 합니다. 학습에 사용한 데이터에 최적화되게 학습되어서 다른 데이 터에 대한 예측 성능이 떨어지는 경우를 의미합니다.
11.
기울기 소실은 출력층으로부터 멀어질수록 역전파되는 오차가 0에 가까워지는 현상입니다.

1. 퍼셉트론

인공 신경망(Artificial Neural Network, ANN)은 사람의 신경망을 본떠서 만든 알고리즘입니다. 가장 처음 등장한 인공 신경망은 1943년 워렌 스터기스 맥컬록(Warren Sturgis McCulloch)과 월터 피츠(Walter Pitts)가 만든 퍼셉트론(Perceptron)입니다. 퍼셉트론은 인공 뉴런을 뜻하며, 사람의 뇌세포(뉴런)를 수학적으로 표현한 겁니다. 인공 신경망은 퍼셉트론, 즉 인공 뉴런의 집합체로 하나의 뉴런이 존재하면 단층 신경망, 여럿을 조합하면 다층 신경망이라고 부릅니다. 퍼셉트론의 동작 과정을 자세히 알아봅시다.
퍼셉트론, 인공 뉴런, 인공 신경망: 퍼셉트론, 혹은 인공 뉴런은 인간의 뇌세포를 수학적으로 표현한 알고리즘입니다. 퍼셉트론을 이용해 만든 모든 구조물을 인공 신경망이라고 부릅니다. 퍼셉트론을 하나만 사용하면 단층 신경망, 여러 개 사용하면 다층 신경망이라고 부릅니다.
▼ 한눈에 보는 퍼셉트론 동작 원리
퍼셉트론은 ① 입력층, ② 노드(인공 뉴런), ③ 출력층으로 구성됩니다. 뇌세포는 다른 뇌세포로부터 일정 강도 이상(임곗값)의 자극(입력)을 받지 않으면 다음 뇌세포로 정보를 전달하지 않습니다. 인공 신경망 역시 입력값에 가중치를 곱해 더해준 다음, 활성화 함수를 이용해 다음 노드에 정보를 전달할지 말지를 결정합니다. 가중치는 중요한 입력값을 더 키우고, 중요하지 않은 입력값을 줄이는 등, 입력에 대한 중요도를 나타내는 숫자입니다. 그림에서 보면 ❶ 입력값( x1, x2)에 대응하는 ❷ 가중치(w1, w2)가 각각 곱해진 다음, ❹ 활성화 함수(F)의 입력으로 사용되었습니다. 이때 더해지는 ❸ 편향은 활성화 함수의 임곗값을 이동시키는 역할을 합니다. 활성화를 거친 후 얻어지는 값을 ❺ 출력값이라고 부릅니다. ❻ 또한 입력값과 가중치를 곱해서 얻은 가중합이 활성화 함수의 입력으로 사용됩니다.
활성화 함수로는 시그모이드 함수(Sigmoid Function)를 사용합니다. 시그모이드 함수는 실수 전체의 모든 입력에 대해 출력이 0과 1 사이의 실수만을 갖게 됩니다. 시그모이드 함수를 사용하는 이유는 인공 신경망의 출력을 확률로써 다루고 싶기 때문입니다. 확률 또한 값이 0과 1 사이로 표현되기 때문에 활성화 함수로 시그모이드 함수를 이용합니다.
퍼셉트론의 출력값 y는 F(x1w 1 + xw2 + b)가 됩니다. 여기서 F(x1w 1 + xw2 + b)는 활성화 함수입니다. 여기서 가중합 a는 a = (x1w 1 + xw2 + b)로 표현됩니다.
▼ 시그모이드 함수
앞의 그림에서 사용한 입력값은 총 2개였습니다. 즉 y값은 x1과 x2로 표현할 수 있다는 뜻입니다. 가중치(w1, w2)는 변하는 값이 아니라 고정된 상수이므로, 뉴런의 가중합(a)을 그림으로 나타내면 다음과 같습니다.
▼ 입력값의 변화에 따른 가중합의 변화
가중치가 변함에 따라 위 그래프에서 직선의 기울기와 위치가 변할 겁니다. 뉴런의 계산 결과인 a의 값에 의해 직선의 아래에 있는지 혹은 위에 있는지 결정을 내릴 수 있기 때문에 위와 같은 직선을 결정 경계라고도 부릅니다. 그럼 결정 경계를 이용해 어떤 문제를 해결할 수 있을까요? 다음과 같은 데이터가 주어져 있다고 합시다.
▼ 결정 경계를 이용한 데이터 분류의 예
앞의 그림과 같은 데이터가 주어졌을 때 직선을 이용하면 0과 1을 구분할 수 있습니다. 적당한 가중치가 주어진다면 그림과 같은 결정 경계를 만들 수 있고, 입력에 따라 결정 경계의 값보다 크다면 1로, 작다면 0으로 구분할 수 있습니다. 또한 이 결정 경계를 만들기 위해 하나의 퍼셉트론을 이용했으므로 이런 구조를 단층 신경망이라고 부릅니다.

2. 다층 신경망으로 단층 신경망 한계 극복하기

단층 신경망은 다양한 형태의 데이터를 분류할 수 있습니다. 그러나 모든 형태의 데이터에 대해 분류할 수 있을까요? 아쉽지만 단층 신경망은 분류 가능한 데이터 형태보다 분류할 수 없는 데이터 형태가 더 많습니다. 다음과 같은 (단층 신경망으로 분류할 수 없는) 데이터의 분포를 생각해봅시다.
▼ 단층 신경망으로 분류할 수 없는 데이터의 예
위와 같은 형태의 데이터를 XOR 데이터라고 부릅니다. 여기서 선을 하나 그어서 0과 1을 분류할 수 있을까요? 불가능합니다. XOR는 배타적 논리 연산, 즉 x1과 x2 중 하나만 1일 때 결과가 1인 경우를 말합니다. 1969년 마빈 민스키(Marvin Minsky)가 퍼셉트론이 XOR 문제를 풀 수 없다는 사실을 수학적으로 증명했습니다.
▼ XOR 진리표
그래서 등장한 것이 바로 다층 신경망입니다. 단층 신경망이 하나의 직선을 이용해 데이터를 분류하는 반면, 다층 신경망은 선을 여러 번 그어서 데이터를 분류합니다. 이제 다층 신경망이 어떤 방식으로 데이터를 분류하는지 알아봅시다.
▼ 다층 신경망이 XOR 데이터를 분류하는 방법
앞에서 직선 하나로는 XOR를 분류할 수 없다고 말씀드렸습니다. 그렇기 때문에 직선을 여러 개 사용하여 데이터를 분류해야 합니다.
다층 신경망이 직선을 사용해서 XOR 문제를 해결하려면, 직선 여러 개를 이용해 데이터의 분포를 바꿔줄 필요가 있습니다. 이를 기저 벡터 변환이라고 합니다. 기저 벡터를 변환하는다는 뜻은 좌표계에서 하나의 점을 표현하는 기준을 바꿔준다는 뜻입니다. 왼쪽 데이터 좌표평면에서는 x1과 x2가 기준입니다. 기준을 빨간선과 파란선으로 바꿔주면 데이터 좌표평면상의 모든 점이 결정 경계 좌표평면상(오른쪽)으로 이동하게 됩니다. 이런 과정을 여러 번 반복하는 것이 바로 다층 신경망이 데이터를 분류하는 방식입니다. 이제부터 간단하게 직선 2개를 이용해 분류가 가능한 분포를 만들어줄 겁니다.
먼저 두 직선(파란선과 빨간선)을 그어줍니다. 이 두 선은 각각이 결정 경계가 되어 선보다 위에 있는 값은 1을, 작은 값은 0을 반환한다고 가정합시다. ❹ 의 1이 빨간선 아래에 있다고 헷갈리지 마세요. 아직은 계산의 중간 단계에 있기 때문에 정답값은 고려하지 않아도 됩니다. 정답값은 모든 계산이 끝난 신경망의 최종 출력에서만 고려합니다.
두 좌표평면은 각각 축이 다르게 설정되어 있습니다. ① 데이터 좌표평면은 x1과 x2를 표현하는 축인 것에 반해, ② 결정 경계 좌표평면은 가로축이 빨간선의 결괏값, 세로축은 파란선의 결괏값을 나타내고 있습니다. ①번 좌표평면에 있는 점을 ②번 좌표평면으로 옮길 수 있다면 선 하나로도 1과 0을 구분지을 수 있습니다(1장에서 선은 ‘데이터를 표현하는 직선인 가설’이라고 말씀드렸습니다. 즉 다층 신경망도 마지막에 데이터를 분류하려면 선(가설)이 하나이어야 합니다). 왼쪽 좌표평면상의 점을 어떻게 오른쪽 좌표평면으로 이동시킬 수 있을까요?
먼저 1 위치에 있는 1을 보겠습니다. 데이터 좌표평면상의 점을 보면 파란선과 빨간선, 양쪽보다 위쪽에 위치해 있습니다. 따라서 결정 경계 좌표평면에 표시된 위치(결정 경계 좌표평면 상 (1, 1)의 위치)로 이동합니다. 2 와 3 위치에 있는 0을 보겠습니다. 데이터 좌표평면에 표시된 두 점 모두 파란선보다는 아래에, 빨간선보다는 위에 위치해 있습니다. 따라서 두 점 모두 결정 경계 좌표평면에 표시된 위치(결정 경계 좌표평면 상 (1, 0)의 위치)로 이동합니다. 마지막으로 4 위치에 있는 1을 보겠습니다. 데이터 좌표평면 상에 표시된 점은 파란선과 빨간선보다 아래에 위치해 있기 때문에 결정 경계 좌표평면 상에 표시된 위치(결정 경계 좌표평면 상 (0, 0)의 위치)로 이동합니다. 이제 결정 경계 좌표평면상의 0과 1의 위치를 살펴보면 그림과 같이 하나의 (노란색) 직선으로 구분할 수 있게 되었습니다. 이렇게 좌표를 바꾸는 것이 ‘기저 벡터 변환’입니다.
기저 벡터 변환: 좌표계에서 점을 표현하는 기준(기저 벡터)을 다른 벡터로 변환하는 기법
기저 벡터는 공간을 표현하는 벡터의 집합을 의미합니다. 즉, 데이터 좌표평면에서는 (x1, 0)과 (0, x2 )를 기저 벡터로 사용했다면, 결정 경계 좌표평면의 기저 벡터는 데이터 좌표평면에서의 빨간선과 파란선이 되는 겁니다. 빨간선과 파란선은 x1과 x2로 표현할 수 있기 때문에, 결정 경계 좌표평면상의 점도 x1과 x2로 표현할 수 있게 됩니다.
이처럼 직선 하나로 구분이 불가능한 데이터 분포도 직선을 여러 개 이용하면 구분할 수 있습니다. 직선 하나를 사용하면 단층 퍼셉트론single layer perceptron, 여러 층에 걸쳐 퍼셉트론이 분포되어 있으면 다층 퍼셉트론(MLPMulti Layer Perceptron)입니다. 비슷하게 하나의 층이 존재하는 신경망을 단층 신경망, 여러 층이 존재하는 신경망을 다층 신경망이라고 부릅니다. 퍼셉트론보다 신경망이 더 넓은 범위를 이르는 용어이므로 이후에는 구분 없이 ‘신경망’으로 부르겠습니다. 단층 신경망과 다층 신경망을 그림으로 알아보겠습니다.
▼ 단층 신경망과 다층 신경망의 구분
다층 신경망은 입력층, 은닉층, 출력층으로 구성됩니다. 1 입력층은 데이터가 들어오는 층입니다. 2 은닉층은 굳이 값을 알 필요가 없기 때문에 출력값을 숨긴다 해서 붙여진 이름입니다. 신경망의 하나의 층에서의 노드의 수를 ‘층의 너비’, 층의 개수를 ‘층의 깊이’라고 합니다. 3 출력층은 신경망 오른쪽으로 전달되는데, 이 방향으로 정보가 전달되는 것을 순전파라고 말합니다.
순전파(forward propagation): 데이터가 입력층으로부터 출력층까지 순서대로 전달되는 것을 의미합니다. 출력층의 출력을 계산할 때 순전파 결과와 역전파에 사용할 기울기도 계산합니다. 딥러닝이 메모리를 많이 사용하는 까닭은 가중치를 수정하는 데 사용하는 계산값을 모두 저장하기 때문입니다.
????TIP: GPU 메모리가 부족할 때는 은닉층의 너비를 줄이는 것보다 은닉층의 깊이를 줄이는 것이 더 효과적일 수 있습니다. 계산 결과를 저장하는 데 가장 많은 메모리를 사용하기 때문입니다.

인공 신경망 ANN 이해하기 ❷

인공 신경망을 이용한 딥러닝 기초 지식을 설명합니다. 먼저 인공 신경망이 어떻게 동작하는지, 어떻게 발전해왔는지 알아봅시다. 그다음은 신경망끼리 비교해 어떤 신경망이 더 좋은 성능을 갖고 있는지 성능을 비교하는 방법을 알아봅시다. 마지막으로 인공지능이 어떤 방식으로 학습하는지를 알아보겠습니다.
2장 인공 신경망 ANN 이해하기는 총 3편입니다.

3. 인공 신경망의 학습 확인해보기

이번에는 인공 신경망이 어떻게 학습하는지, 데이터를 0과 1로 분류하는 신경망을 구성해 알아보겠습니다. 약간의 수식이 나오지만 고등 수학 수준이므로 집중만 하면 이해하는 데 문제가 없을 겁니다.
입력층에서 다음과 같이 x1과 x2를 입력받는 신경망이라고 가정하겠습니다.
▼ 실습에 사용할 데이터
다음과 같이 입력층, 은닉층, 출력층, 가중치와 편향을 가지는 신경망을 임의로 만들어보았습니다.
은닉층과 출력층의 뉴런은 아래 공식을 이용해 출력값을 계산합니다.
모든 단계에서 활성화 함수는 0 이상이면 1을 출력하고, 0보다 작다면 0을 출력하는 이진분류 함수를 이용하겠습니다.
먼저 은닉층의 값을 구하겠습니다.
이 계산식을 이용해서 첫 번째 입력값(x1, x2)으로 은닉층값(a1과 *a2)*을 계산하겠습니다.
이렇게 모든 연산에 적용하면 a1과 a2 값은 다음과 같습니다.
출력값을 구하는 공식은 다음과 같습니다.
여기서 w5과 w6는 그림에서 -11로 나와 있습니다.
Note: 출력층은 출력값을 내보내는 층이기 때문에 구조적으로는 은닉층과 동일합니다. 그래서 똑같이 가중치와 편향이 존재합니다. 활성화 함수는 사용자 임의대로 사용하는 함수라서 이번 예제에서는 굳이 수식이 필요하지 않은 매우 간단한 함수를 이용했습니다.
이 식에 첫 번째 은닉층값을 적용하면 다음과 같습니다.
모든 값에 대한 결과는 다음과 같습니다.
y’는 신경망의 출력입니다. 정답인 y와 비교하면 값이 일치하는 것을 알 수 있습니다. 따라서 신경망이 제대로 데이터를 분류한 겁니다. 이렇게 신경망에 제대로 된 가중치를 준다면 복잡한 형태의 데이터 분포 역시 해결할 수 있습니다. 그렇다면 복잡한 데이터를 분류하는 데 사용할 가중치와 편향을 어떻게 찾을 수 있을까요?

4. 손실 함수로 올바른 가중치 찾기

이번 절에서는 제대로 된 가중치를 찾는 방법을 알아보겠습니다. 다음 그림에서 두 직선(결정 경계) 모두 입력 데이터를 분류할 수 있습니다. 어떤 선이 더 잘 분류한 걸까요?
▼ 두 결정 경계의 비교
어떤 직선이 나은 결정 경계인지를 알 수 있는 지표가 있을 겁니다. 예를 들어 하나의 점으로부터 직선까지의 거리를 오차라고 가정했을 때, 이 오차의 제곱의 평균이 작을수록 데이터를 잘 분류했다고 할 수 있습니다. 이렇게 오차를 구하는 함수를 오차 함수 혹은 손실 함수(Loss Function)라고 하며, 손실 함수의 값이 결정 경계의 성능을 간접적으로 나타냅니다.
▼ 결정 경계까지의 거리(오차)
즉 가장 좋은 결정 경계는 오차가 가장 적은 결정 경계라고 정의하는 겁니다. 대표적인 손실 함수는 평균 제곱 오차, 크로스 엔트로피 오차 등이 존재하며 상황에 맞게 사용해야 합니다.
▼ 대표적인 손실 함수

5. 경사 하강법과 오차 역전파로 최적의 값 찾기

다층 신경망은 단층 신경망이 분류하지 못하는 데이터의 분포도 분류할 수 있습니다. 그러나 데이터 분포가 복잡해지면 은닉층 깊이를 늘리거나, 은닉층의 뉴런 개수를 늘리게 되는데, 그러면 은닉층마다 데이터를 구분해내는 데 사용할 가중치를 구하기 어려워집니다. 손실 함수는 독립변수가 신경망의 가중치와 편향인 함수이며, 최적의 직선을 찾으려면 오차가 가장 적은 최적화된 가중치와 편향을 찾아야 합니다. 최적의 직선을 찾는다는 말은 결국 방정식을 푼다는 의미고, 가중치와 편향이 늘어날수록 풀어야 하는 방정식의 복잡도는 기하급수적으로 증가하기 때문에 어려워지는 겁니다. 따라서 최적의 직선을 찾는 새로운 방법이 필요합니다. 경사 하강법과 오차 역전파를 이용해 해결할 수 있습니다. 이 둘을 이용해 최적의 값을 찾는 방법을 설명하면서 약간의 수식이 등장합니다. 역시나 중학 수학 수준이므로 집중만 하면 이해하는 데 문제가 없을 겁니다.
다음은 앞에서 사용한 다층 신경망입니다.
▼ 이전 예제에서 사용한 다층 신경망
여기서 뉴런의 출력이 계산되는 부분을 자세히 봅시다.
위 식을 행렬로 나타내면 다음과 같이 나타낼 수 있습니다. 가중치와 편향을 바꿀 수 있게 변수로 바꿔주면 다음과 같이 쓸 수 있습니다.
위 식에서 알 수 있듯이 뉴런의 출력은 가중치와 편향에 대한 함수입니다. 그렇다면 a1과 a2를 이용해 이 신경망의 출력을 표현해보겠습니다.
이제 신경망의 출력값을 구했기 때문에 손실을 계산할 수 있습니다. 손실 함수는 L로, 신경망의 예측값은 y, 실젯값을 y′로 나타내겠습니다.

5.1 경사 하강법

이제 손실을 줄이는 방향으로 가중치를 변경해 나가야 합니다. 경사 하강법이라는 알고리즘을 이용하겠습니다. 경사 하강법은 손실 함수를 미분해서 손실 함수의 경사면을 따라 조금씩 이동해나간다고 해서 붙여진 이름입니다. 기울기의 반대 방향으로, 즉 기울기 값에 -1을 곱한 값만큼 변수의 값을 이동시키면서 최솟값에 조금씩 다가가는 알고리즘입니다.
경사 하강법(gradient descent): 함수의 기울기(경사)를 구하고 경사의 반대 방향으로 계속 이동시켜 최솟값에 이를 때까지 반복시키는 학습 방법
경사 하강법에서는 시작점으로부터 어느 정도 이동할지를 손실 함수의 기울기와 학습률(Learning Rate)로 결정합니다. 시작점의 기울기를 알아내려면 손실 함수를 미분해야 합니다. 기울기가 음의 기울기라면 가중치가 양의 방향으로 이동해야 한다는 뜻이고, 기울기가 양의 기울기라면 가중치가 음의 방향으로 이동해야 한다는 뜻입니다.
▼ 경사 하강법
이때 가중치는 시작점으로부터 기울기 크기만큼 이동하게 되는데, 학습률을 이용해 더 많이 이동하거나 더 적게 이동할 수 있습니다. 이것을 수식으로 나타내면 다음과 같습니다.
여기서 y는 가중치에 관한 함수라는 것을 주의해주세요. 위 수식의 α가 학습률입니다. w′은 가중치의 새로운 값을 의미합니다. 이때 학습률과 기울기를 곱하면 가중치가 변하는 크기를 나타내는 보폭이 됩니다.
학습률(learning rate)과 보폭(step size): 보폭은 학습률과 기울기의 곱으로 표현됩니다. 즉 기울기가 클수록 보폭도 커지고, 기울기가 작을수록 보폭도 작아집니다.
그럼 큰 학습률을 설정하면 빠르게 학습될까요? 학습률이 너무 크면 최솟값을 지나쳐버릴 가능성이 높습니다. 반대로 너무 작게 설정하면 최솟값에 도달하기까지 지나치게 많은 반복을 하게 되겠죠. 따라서 적절한 학습률을 설정해줘야 합니다. 어떤 값이 가장 좋을지는 알 수 없기 때문에 반복적으로 학습률을 바꿔가며 최적의 학습률을 찾아가야 합니다.
▼ 학습률 크기에 따른 수렴 속도

5.2 오차 역전파

앞에서 살펴본 수식은 하나의 가중치를 업데이트하는 수식이었습니다. 실제로는 수십만 개의 가중치가 있기 때문에 손실 함수를 사용해 일일이 가중치에 대해 미분해서 값을 수정하는 일은 어렵습니다. 그렇다면 어떻게 해야 할까요?
오차 역전파 알고리즘(Error Backpropagation)을 이용하면 해결할 수 있습니다. 오차 역전파 알고리즘은 신경망의 출력층으로부터 입력층까지 오차가 거슬러 전달됩니다. 정보의 방향이 순전파와 반대가 되므로 오차가 역전파한다라고 합니다. 오차 역전파에 경사하강법이 사용됩니다.
오차 역전파(error backpropagation): 정답과 신경망이 예측한 값과의 오차를 최소화하는 가중치를 찾는 알고리즘. 미분의 연쇄 법칙을 이용해 출력층에 가까운 가중치부터 수정해나간다.
▼ 미분의 연쇄 법칙을 이용하여 오차를 역전파!
가중치는 원래의 값에서 기울기만큼의 값을 뺀 새로운 값을 얻게 됩니다. 미분의 연쇄 법칙에 의해 층을 거칠수록 기울기가 누적되어 곱해지게 됩니다. 입력층에 가까운 가중치일수록 누적되는 기울기가 늘어나게 되며, 그렇게 입력층까지 기울기가 역전파되어 신경망의 모든 가중치를 수정해나가는 겁니다.

오차 역전파 상세 설명

오차 역전파는 신경망 학습의 핵심 알고리즘입니다. 이 알고리즘이 어떻게 작동하는지 더 자세히 살펴보겠습니다.

미분의 연쇄 법칙

오차 역전파의 핵심은 미분의 연쇄 법칙(Chain Rule)입니다. 합성함수의 미분은 각 함수를 미분한 값들의 곱으로 나타낼 수 있습니다.
예를 들어, z = f(y)이고 y = g(x)일 때: dz/dx = (dz/dy) × (dy/dx)
이 원리를 신경망에 적용하면, 최종 손실 함수로부터 각 층의 가중치까지의 기울기를 계산할 수 있습니다.

역전파 계산 과정

앞서 본 다층 신경망 예제에서 가중치를 업데이트하는 과정을 단계별로 살펴보겠습니다:
1.
출력층에서 손실 계산: 먼저 신경망의 예측값 y와 실젯값 y′의 차이로 손실 L을 계산합니다.
2.
출력층 가중치의 기울기 계산: 손실 함수를 출력층의 가중치로 미분합니다. ∂L/∂w₃, ∂L/∂w₄
3.
은닉층 가중치의 기울기 계산: 연쇄 법칙을 적용하여 은닉층 가중치의 기울기를 계산합니다. ∂L/∂w₁, ∂L/∂w₂
4.
가중치 업데이트: 계산된 기울기와 학습률을 사용하여 모든 가중치를 동시에 업데이트합니다.

기울기 소실 문제

오차 역전파를 사용할 때 주의해야 할 점이 있습니다. 층이 깊어질수록 기울기가 계속 곱해지면서 입력층에 가까운 층으로 갈수록 기울기가 매우 작아질 수 있습니다. 이를 기울기 소실(Gradient Vanishing) 문제라고 합니다.
반대로 기울기가 너무 커지는 기울기 폭발(Gradient Exploding) 문제도 발생할 수 있습니다.
해결 방법: ReLU 같은 활성화 함수 사용, 배치 정규화(Batch Normalization), 잔차 연결(Residual Connection) 등의 기법으로 이러한 문제를 완화할 수 있습니다.

2.1. Sigmoid 함수

활성화 함수 중 Sigmoid 함수를 예로 들어보겠습니다(그림 2 참고). 그림 2의 우측 그래프에서 볼 수 있듯이, Sigmoid 함수의 미분 값은 입력값이 \(0\)일 때 가장 크지만 \(0.25\)에 불과하고 \(x\) 값이 크거나 작아짐에 따라 기울기는 거의 \(0\)에 수렴하는 것을 확인하실 수 있습니다. 따라서, 역전파 과정에서 Sigmoid 함수의 미분값이 거듭 곱해지면 출력층과 멀어질수록 Gradient 값이 매우 작아질 수밖에 없습니다. 더불어, \(e\)(exponential)는 컴퓨터가 계산할 때 정확한 값이 아닌 근사값으로 계산해야 되기 때문에 역전파 과정에서 점차 학습 오차까지 증가하게 됩니다. 결국 Sigmoid 함수를 활용하면 모델 학습이 제대로 이루어지지 않게 됩니다.
그림 2. Sigmoid 함수 원형과 미분 그래프

2.2. tanh 함수

역전파 과정에서 Sigmoid 함수가 층이 많아질수록 효과적으로 학습되지 않는 한계점을 개선하기 위한 방법 중 하나로 tanh 함수가 제안되었습니다. Simoid 함수와 다르게, tanh 함수는 \(0\)을 기준으로 출력 값이 최대 \(1\), 최소 \(-1\) 사이의 값을 갖도록 출력값의 범위를 2배 늘렸습니다. 그림 3 내 우측 그래프에서 볼 수 있듯이, 이를 통해 미분값이 sigmoid 함수에 비해 훨씬 커졌습니다. 하지만, 그럼에도 tanh 함수 역시 \(x\) 값이 크거나 작아짐에 따라 기울기 크기가 크게 작아지게 떄문에 기울기 소실 문제를 방지하는 데 어려움이 있습니다. 기울기 소실 문제를 해결한 활성화 함수로 ReLU가 제안되었습니다. 다음 섹션에서 ReLU에 대해 자세히 다룹니다.
그림 3. tanh 함수 원형과 미분 그래프

3. 기울기 소실의 해결방법

Simoidtanh 함수 모두 기울기 소실 문제가 있었습니다.  ReLU 함수는 이러한 문제를 해결하기 위해 제안되었습니다. 본 섹션에서는 기본적인 ReLU 함수와 변형된 ReLU 함수에 대해 알아봅니다.

3.1. ReLU 함수

아래의 그림 4에 우측 그래프에서 보실 수 있듯이, 입력값이 양수일 경우, 입력값에 상관 없이 항상 동일한 미분 값은 \(1\)입니다. 즉, 역전파 과정에서 기울기가 소실되는 문제를 해결할 수 있습니다. 더불어, ReLU 함수는 Simoidtanh 함수처럼 특별한 연산이 필요 없이 단순히 임계값(\(0\))에 따라 출력값이 결정되므로 연산 속도 또한 빠르다는 특징이 있습니다.
그림 4. ReLU 함수 원형과 미분 그래프
하지만 ReLU 함수 역시 한계점이 존재합니다. 입력값이 음수일 경우 미분값은 항상 \(0\)입니다. 즉, 입력값이 음수인 뉴런은 다시 회생시키기 어렵다는 한계가 있습니다. 이러한 문제를 '죽어가는 ReLU(Dying ReLU)'라고 부릅니다.

3.2. Leaky ReLU 함수

ReLU 함수에서 발생하는 Dying ReLU 현상을 보완하기 위해 다양한 변형된 ReLU 함수가 제안되었습니다. 그중에서 Leaky ReLU에 대해 알아봅니다. Leaky ReLU는 입력값이 음수일 때 출력값을 \(0\)이 아닌 \(0.001\)과 같은 매우 작은 값을 출력하도록 설정합니다. 수식은 다음과 같습니다.
max(ax,x) max(ax, x)
여기서 \(a\)는 \(0.01, 0.001\)과 같이 작은 값 중 하나로 하이퍼파라미터입니다(그림 5 참고). Leaky는 사전적으로 '(물이나 연기 등이)새어 나가는' 같은 의미가 있습니다. 여기서 말하는 '새어 나가는' 정도는 입력값이 음수인 경우의 기울기를 나타냅니다. 이처럼 \(a\)는 \(0\)이 아닌 값이기 때문에 입력값이 음수라도 기울기가 \(0\)이 되지 않아 뉴런이 죽는 현상을 방지할 수 있습니다.
그림 5. Leaky ReLU

실제 구현에서의 오차 역전파

다행히도 PyTorch와 같은 딥러닝 프레임워크는 자동 미분(Automatic Differentiation) 기능을 제공합니다. 개발자가 직접 기울기를 계산하는 복잡한 수식을 구현할 필요 없이, 순전파 과정만 정의하면 역전파는 자동으로 처리됩니다.
# PyTorch에서의 자동 미분 예제 import torch # 가중치 텐서 생성 (requires_grad=True로 설정) w = torch.tensor([1.0, 2.0], requires_grad=True) x = torch.tensor([3.0, 4.0]) # 순전파 y = torch.sum(w * x) loss = (y - 10) ** 2 # 역전파 (자동으로 기울기 계산) loss.backward() # 계산된 기울기 확인 print(w.grad) # 가중치의 기울기가 자동으로 계산됨
Python
복사

경사 하강법과 오차 역전파의 관계

경사 하강법은 "어느 방향으로 얼마나 이동할지"를 결정하는 최적화 알고리즘이고, 오차 역전파는 "각 가중치의 기울기를 효율적으로 계산하는" 방법입니다. 두 알고리즘이 함께 작동하여 신경망 학습이 이루어집니다:
1.
오차 역전파로 모든 가중치의 기울기를 계산
2.
경사 하강법으로 기울기를 사용하여 가중치를 업데이트
3.
이 과정을 반복하여 손실을 최소화
이렇게 오차 역전파와 경사 하강법을 결합하면, 수백만 개의 가중치를 가진 복잡한 신경망도 효율적으로 학습시킬 수 있습니다.

4. 오버피팅(Overfitting)과 정규화

신경망이 학습 데이터에만 과도하게 최적화되어 새로운 데이터에 대한 성능이 떨어지는 현상을 오버피팅(과적합)이라고 합니다. 오버피팅은 딥러닝 모델 개발에서 가장 흔하게 마주치는 문제 중 하나입니다.

4.1. 오버피팅의 원인

오버피팅은 주로 다음과 같은 상황에서 발생합니다:
모델이 너무 복잡한 경우: 파라미터 수가 너무 많으면 학습 데이터의 노이즈까지 학습하게 됩니다.
학습 데이터가 부족한 경우: 충분한 데이터가 없으면 일반화 능력이 떨어집니다.
학습을 너무 오래 진행한 경우: 에포크 수가 너무 많으면 학습 데이터에만 특화되어 버립니다.

4.2. 오버피팅 방지 방법

오버피팅을 방지하기 위한 여러 정규화(Regularization) 기법이 있습니다.

4.2.1. 드롭아웃(Dropout)

드롭아웃은 학습 과정에서 무작위로 일부 뉴런을 비활성화하는 기법입니다. 각 학습 단계마다 특정 비율(예: 50%)의 뉴런을 임의로 제거하여, 특정 뉴런에 과도하게 의존하는 것을 방지합니다.
# PyTorch에서 Dropout 사용 예제 import torch.nn as nn model = nn.Sequential ( nn.Linear(784, 256), nn.ReLU(), nn.Dropout(0.5), # 50% 확률로 뉴런 비활성화 nn.Linear(256, 10) )
Python
복사

4.2.2. 조기 종료(Early Stopping)

검증 데이터의 손실이 더 이상 감소하지 않을 때 학습을 중단하는 방법입니다. 이를 통해 학습 데이터에만 과적합되는 것을 방지할 수 있습니다.

4.2.3. L1/L2 정규화

손실 함수에 가중치의 크기에 대한 패널티 항을 추가하여 가중치가 너무 커지는 것을 방지합니다. L1 정규화는 가중치의 절댓값 합을, L2 정규화는 가중치의 제곱합을 손실 함수에 더합니다.

4.2.4. 데이터 증강(Data Augmentation)

이미지의 경우 회전, 이동, 크기 조정 등을 통해 학습 데이터를 인위적으로 늘리는 방법입니다. 더 많은 데이터로 학습하면 일반화 성능이 향상됩니다.

4.3. 언더피팅(Underfitting)

오버피팅의 반대 개념으로 언더피팅이 있습니다. 모델이 너무 단순하거나 학습이 부족하여 학습 데이터조차 제대로 학습하지 못하는 현상입니다. 이 경우 모델의 복잡도를 높이거나 학습 시간을 늘려야 합니다.
딥러닝의 기초 지식을 훑어봤습니다. 인공 신경망은 들어온 입력에 가중치를 곱한 다음 편향을 더해, 활성화 함수의 입력으로 사용하는 알고리즘입니다. 뉴런이 하나인 단층 신경망은 분류하지 못하는 데이터의 분포가 있지만, 뉴런을 여러 개 갖는 다층 신경망을 이용하면 분류할 수 있습니다.
인공 신경망의 성능은 손실 함수를 이용해 비교할 수 있습니다. 손실이 적을수록 좋은 신경망이라고 볼 수 있습니다. 하지만 학습용 데이터를 완벽하게 분류하는 것은 오버피팅이 되므로 조금의 오차는 있는 것이 좋았습니다. 손실을 줄이기 위해서 경사 하강법을 이용해 오차 역전파를 진행합니다. 경사 하강법은 출력층부터 입력층까지 미분한 값들을 점점 곱해가면서 가중치를 수정합니다. 하지만 활성화 함수로 이용하는 시그모이드 함수의 도함수는 최대값이 0.25로 곱할수록 점점 기울기가 줄어들게 됩니다. 이를 해결 하기위해 ReLU함수를 이용했습니다.
딥러닝은 결과를 해석하는 일은 쉽지 않습니다. 똑같은 코드를 누가 실행하느냐에 따라 결과가 바뀌고, 성능이 좋게 나오면 운이 좋아서 그런 건지, 아니면 지금 데이터에 한해서만 성능이 좋은 건지 알기 어렵습니다. 이 책을 통해 여러 딥러닝 신경망을 만들며 실력을 갈고 닦으면 여러분만의 해석이 가능해지게 됩니다.
참고문헌