BACK-PROPAGATION
개요
우리는 앞서 단일 퍼셉트론의 한계와 다층 퍼셉트론에서 비선형 분류를 수행하는 과정에 대해서 알아봤다.
그 과정에서 우리는 Feed Forward 방식으로 output을 내보내는데, 여기서 우리는 실제 출력 값과 오차에 대한 Cost Function 을 계산할 수 있다.
Forward 방식에서 우리는 예측값 $\hat{y}$ 를 내놓는다. 여기서 우리는 기본적인 오차제곱 합 형태를 통해 비용 함수를 정의하여 $\sum_i^n(y_i - \hat{y_i})^2$ 를 계산한 후 Cost를 구할 수 있다.
이러한 비용함수를 정의하여 우리는 각 가중치와 편향을 최적화 시킬 수 있는데, 이렇게 최적화 시키는 방식에 대해서 차근차근 알아보자.
신경망 가정하기
각 뉴런의 노드를 0~1 사이의 값을 갖는 것이라고 생각해보자. 또한 우리가 직면한 문제를 분류 문제라고 가정해보자.
이제 간단한 신경망에서 Forward 방식으로 어떻게 진행되는지 살펴보자
여기서 $\sigma(x)$ 라는 활성화 함수를 사용한다고 해보자. 이 활성화 함수는 input 벡터의 값을 0과 1 사이로 Scaling 해준다고 이해할 수 있다.
그림 1. 임의의 신경망 16 8 4
현재 위의 그림은 16개 노드로 이루어진 입력층, 8개의 노드로 이루어진 1개의 은닉층, 4개의 노드로 이루어진 출력층에 대한 그림이다.
여기서 우리는 출력층의 4개의 노드 중 정답 노드를 활성화 해 정답률을 높여보려 해보자.
입력층의 각 노드를 이제 우리는 $a_i^{(0)}$ 라고 하겠다. 여기서 위 첨자는 해당 레이어를 의미하며 마지막 층은 $n_L-1$ 의 값을 갖는다.
우리는 은닉층이 일단 하나라고 생각을 했기 때문에 입력층의 첫번째 노드에서 은닉층의 첫번째 노드로 향하는 식을 $a_1^{(1)} = \sigma(w_1a_1^{(0)} + b_1)$ 라고 할 수 있다. 여기서 아래첨자는 몇번째 노드인지에 대한 것이라 생각하자.
$a_1^{(1)}$ 로 향하는 값은 총 몇개가 있을까? 어쨋든 은닉층의 각 노드는 총 16개의 input을 받기 때문에 각 노드는 16개의 가중치와 1개의 편향을 갖게된다.
그렇기 때문에 위 식에서 은닉층의 노드의 수는 8개 이므로 총 $16\times8$ 의 가중치와 8개의 $bias$를 갖게된다.
또한 은닉층에서 출력층으로 가는 가중치는 4 개의 노드가 8개의 노드에서 각각 값을 받으므로 $8\times 4$ 의 가중치와 4개의 $bias$를 가진다는 것을 쉽게 알 수 있다.
우리는 이러한 식의 표현을 행렬이라는 강력한 도구로 매우 손쉽게 표현할 수 있다.
\[a^{(1)} = \sigma\left\begin{matrix} w_{00} & w_{01} & \cdots& w_{0n} \\\vdots \\ w_{n0} & w_{n1} & \cdots & w_{nn}\end{matrix}\right \left\begin{matrix}a_0^{(0)} \\ \vdots \\ a_n^{(0)}\end{matrix}\right +\left \begin{matrix} b_0 \\ \vdots \\ b_n\end{matrix}\right\]위 식은 은닉층의 각각의 노드에 대한 모든 가중치를 담고있는 식이다.
줄여서 $a^{(1)} = \sigma(w a^{(0)} + b)$ 라고 표현할 수 있다.
여기서 각 노드는 0과 1의 값을 비선형적으로 출력하며 이런 값은 다음 층에서 단순 합 된 선형 결합의 꼴로 또 묶인다.
현재 그림은 은닉층이 1개이지만 은닉층이 무수히 많더라도 $a^{(k)}$ 의 k 만 바뀔 뿐 식은 동일하다.
초기 네트워크는 활성화 함수로 시그모이드 함수를 사용했다.
앞서 말했듯 활성화 함수는 가중치가 적용된 합들을 0에~1 사이의 값으로 압축하기 위해 사용한 것이고 이것은 실제 뉴런의 현상을 모방한 것이다.
최근에는 sigmoid 함수 외에 ReLU와 같은 함수를 활성화 함수로 많이 사용하는데 이 이유는 차후에 자세히 이야기 하겠다.
흐름
각각의 가중치는 연결의 세기라고 할 수 있다. 따라서 우리는 Cost를 설정하여 이러한 연결의 세기를 조정할 때 이 값이 어떻게 변하는지 확인할 수 있다.
우리가 하고싶은 작업은 신경망이 잘 작동해서 우리가 원하는 목적에 맞게 잘 분류하길 원한다.
그러기 위해서 해야하는 작업과 과제를 다시 정리해보자.
- Cost Function 을 설정하여 목적을 갖게한다. (얼마나 네트워크가 엉망인지에 대한 지표)
- Cost 관점에서 Input 은 무수히 많은 가중치이고 output은 Cost 값 하나이다.
- 이 값을 최소화 하기 위해서 가중치를 조정해야한다.
우리가 앞서 본 그림1에서의 신경망은 매우 단순한 구조였다.
우리가 조정해야하는 가중치와 편향을 파라미터라고 할 때 이 파라미터의 개수는 지수적으로 노드의 수, 은닉층의 수가 많아질수록 지수적으로 증가한다.
그렇다면 우리는 무수히 많은 가중치를 조정해서 어떻게 Cost를 최소화 시킬 수 있을까?
경사하강법
우리가 결국 구하는 것은 $a^{(1)} = \sigma({w} a^{(0)} + b)$ 여기서의 최솟값을 갖는 행렬 $w$이다.
그렇다면 우리는 저 행렬 식 자체를 미분해서 그 것의 최솟값을 구할 수 있다.
선형 회귀 모델에서의 비용함수$MSE(X,h_{\theta}) = \frac{1}{m}\sum_{i=1}^m(\theta^Tx^{(i)} - y^{(i)})^2$ 를 구하는 과정을 다시한번 상기해보자.
우리는 여기서 적당한 미분을 통해서 정규방정식을 구할 수 있는데, 그 결과 $\hat{\theta} = (X^TX)^{-1} X^T y$라고 표현 가능하다.
그렇다면 우리는 우리는 여기서 $\theta$를 직접 구할 수 있지 않은가?
하지만 실제 데이터가 커지면 저 행렬식의 계산 복잡도는 매우 커진다. 따라서 매우 비효율적인 방법이 되기 때문에 우리는 경사하강법을 통해 최적 해와 근사한 값을 구하게 된다.
이러한 경사하강법에 대한 내용은 다른 게시글에 설명했으므로 경사하강법을 어떻게 생각할지에 대해서 간단하게만 짚고 넘어가겠다.
그림 2. 특성 스케일을 적용한 MSE 비용함수의 3차원 비용함수 공간
예를 들어 우리가 조정해야하는 가중치가 2개라고 할 때 위 그림에서 xy 평면은 각 $w_1,w_2$가 된다.
또한 무지개로 표현되는 저 plane 은 우리가 구하고자 하는 Cost function 의 값이다.
여기서 우리는 특정 위치에서 Gradient vector인 $\bigtriangledown C$를 구해서 그것의 반대방향으로 이동하게 된다. (여기서의 C 는 Cost function)
그 이유는 Gradient vector가 가장 가파른 정도를 이야기 해 주기 때문이다.
여기서 또 한번 강조하는 것은 이러한 최적화 과정이 일어나는 공간은 각 가중치에 대한 공간이다.
현재 가중치가 2개라고 가정했기 때문에 3차원 시각화가 되는 것이고 그보다 더 많다면 정의역 자체가 3차원 이상이 된다.
즉, 다시말해 우리는 이렇게 $\bigtriangledown G$를 빠르게 구해서 골짜기를 지나고 한 칸씩 내딛다보면 Cost 를 최소화 하는 최솟값에 도달하게 된다.
이러한 과정에서 Batch 사이즈를 조정하는데 이러한 학습법에 대해서는 차후에 이야기 하겠다.
Back Propagation
다시한번 정리해보겠다.
- 우리는 출력층의 노드 중 정답인 노드의 활성화 정도가 크고 나머지는 작길 원한다.
- 따라서 비용 함수를 설정해서 얼마나 정답과 비슷한지 지표를 나타내고자 한다.
- 우리는 각 가중치를 조정하여 Cost function을 최소화 시키고싶다.
- 그 과정에서 우리는 경사하강법을 통해 파라미터 공간에서 점진적으로 비용함수가 최소값과 가까워지도록 학습시키고싶다.
여기까지가 앞선 흐름이다.
이제 우리에게 중요한 것은 경사하강법을 어떻게 효율적으로 적용 해 효과적으로 학습시킬 수 있는지에 대한 것이다.
우리는 앞서 Gradient Vector 를 통해 가파른 정도를 표현할 수 있다고 이야기했다.
3차원의 가중치 벡터 공간을 예로 들어보자.
그림 3. 임의의 신경망 3 1
$\bigtriangledown C = \left[ \begin{matrix} w_0 = 0.5 \ w_1 = 3.9 \ w_2 = 0.02\end{matrix} \right] $
그림2에서 각 입력층에서 나온 가중치를 통해 나온 Gradient Vector 의 값을 위와 같은 행렬의 꼴로 표현해보자.
즉, 특정 지점 $a$에서 각 방향으로의 기울기라고 생각할 수 있다.
여기서 각 값들을 어떻게 이해할 수 있을까? 우리는 여기서 각 값들을 입력층의 각 노드 별 연결의 세기 라고 생각해보자.
다시 말해서 가중치에 대한 벡터 공간의 특정지점 $a$ 에서는 $w_1$ 로의 기울기가 가장 가파른 것이다.
그렇다면 우리는 $w_1$ 을 조정하면 저 오차함수를 좀 더 크게 변화시킬 수 있다는 것을 기대할 수 있다.
가정한 신경망으로 돌아가보기
그림 4. 임의의 신경망 8 1
이 그림의 왼쪽은 앞서 우리가 가정한 신경망에서의 은닉층이다. 또한 오른쪽 노드는 출력층의 노드 중 1개이다.
우리는 여기서 저 노드가 활성화 되어야 정답이고 저 활성화 정도를 높이기 위해서 여러 가중치를 조정해야 한다고 가정해보자.
우리가 원하는 값이 $y$ 라고 하고 그림4의 출력층 노드의 값을 $b$ 라고 할 때 우리는 비용함수 $C_0 = (y-b)^2$ 라고 이야기 할 수 있다.
그렇다면 저 $C_0$ 를 구하기 위해 우린 4차원 가중치 벡터 공간에서 Gradient vector를 구할 수 있다.
이렇게 구한 과정에서 각 기울기가 나오는데, 우리는 여기서 기울기를 연결의 세기라고 생각한다 했으므로 이러한 연결의 세기 중 큰 것을 더 조정하면 Cost function 의 값을 작아지게 만들 수 있을 것이다.
이제 이러한 과정을 모든 출력노드 즉 $C_0, C_1, C_2, C_3$ 에 대해서 진행한다.
우리는 정답인 노드를 $C_0$ 라고 가정했기 때문에 나머지 노드에 대해서는 비 활성화 되기를 바란다.
따라서 우리는 단순히 $C_0$ 에서 진행한 방식의 반대 방향으로 연결의 세기를 구할 수 있다.
위 과정을 거치게되면 각 $w_i$ 에 대해서 각 출력 노드에 대한 연결의 세기를 구할 수 있고 이 값을 평균을 내어 가중치를 조정하는 것이다.
우리가 가정한 신경망은 은닉층이 하나이기 때문에 이 전체 과정을 총 두번 거치지만 은닉층이 n개라면 이 과정을 n+1 번 만큼 거친다.
좀 더 추상적으로 이야기 하자면 각 값이 갖고있는 뉘앙스를 계속 이전 입력층에 전파하는 것이다.
은닉층의 각 노드는 어떤 값의 input 이 되고 또한 그 전 층의 값을 받기 때문에 출력층 부터 차근차근 내려가서 각 노드별로 입력층까지 어떠한 뉘앙스를 계속해서 전파하는 과정이라 생각할 수 있다.
수학적으로 살펴보기
글로 풀어서 역전파 알고리즘을 이해하는 것은 무리가 있기 때문에 좀 더 수학적으로 풀어보겠다.
하지만 여기서 나오는 개념은 그저 Chain-rule 이기 때문에 과정만 이해한다면 별 무리없이 진행 할 수 있을 것이다.
그림 5. 임의의 신경망 1 1 1 1
위 그림은 매우 단순하게 하나의 노드를 갖는 신경망을 가정한 것인데 여기서 우리가 보고자 하는 것은 하나의 가중치를 계산하기 위해 어떻게 진행되는지이다.
그림5에서 가장 오른쪽에 있는 노드를 $a^{(L)}$ 그 전에 있는 노드를 $a^{(L-1)}$ 이라고 해보자.
우리는 여기서 $a^{(L)}$ 이 값과 정답 $y$ 에 대해 얼마나 차이나는지 알아보고자 한다.
그렇다면 앞서 이야기했듯이 비용함수는 $C_0(\cdots) = (a^{(L)} - y)^2$ 이라고 표현 할 수 있으며 $a^{(L)} = \sigma(w^{(L)}a^{(L-1)} +b^{(L)} )$ 로 표현할 수 있다.
$\sigma$ 는 sigmoid 나 ReLU와 같은 활성화 함수를 이야기하며 b 는 편향을 나타낸다.
여기서 우리는 $w^{(L)}a^{(L-1)} + b^{(L)}$을 $z^{(L)}$ 이라 표현해보자.
그렇다면 $C_0$ 는 $w^{(L)}$ 에 대해 얼마나 민감하게 반응할까? 연결의 세기는 어떻게 될까? 다시말해 가중치 $w^{(L)}$ 에 대한 미분 값인 $\frac{\partial C_0}{\partial W^{(L)}}$ 의 값은 무엇일까?
여기서 $w^{(L)}$ 은 $z^{(L)}$ 에 영향을 미치고 $z^{(L)}$은 $a^{(L)}$ 에 영향을 미친다.
다시말해
$\frac{\partial C_0}{\partial W^{(L)}}$ = $\frac{\partial Z^{(L)}}{\partial W^{(L)}}\frac{\partial a^{(L)}}{\partial Z^{(L)}}\frac{\partial C_0}{\partial a^{(L)}}$
이 되는 것이다.
그럼 하나하나 씩 따라가보자.
$\frac{\partial C_0}{\partial a^{(L)}}$ = $2(a^{(L)}-y)$
$\frac{\partial a^{(L)}}{\partial Z^{(L)}}$ = $\sigma^{\prime}(z^{(L)})$
$\frac{\partial Z^{(L)}}{\partial W^{(L)}}$ =$a^{(L-1)}$
의 식으로 표현할 수 있다.
여기서 주의 깊게 볼 점은 $a^{(L-1)}$ 은 이전 $a^{(L-2)}$ 의 영향을 받은 값이라는 것이다
따라서 이 가중치에 생긴 작은 변화가 마지막 층에 미치는 영향의 양은 그 전 뉴런이 얼마나 강한지에 달려있는 것이고 결과적으로 마지막 층에 미치는 영향의 양은 input 에서부터 영향을 받고 진행된다는 것이다.
따라서 하나의 입력 노드에서 전체 출력 노드에 대한 비용의 변화율은 $\frac{\partial C}{\partial W^{(L)}}$ = $\frac{1}{n}\sum_{k=0}^{n-1} \frac{\partial C_k}{\partial W^{(L)}}$ 라고 표현할 수 있다.
$\bigtriangledown C$ 는 이러한 모든 가중치와 편향에 대한 편미분으로 이루어졌다.
이 Back Propagation 아이디어는 이전 층의 활성화 정도에 비용 함수가 얼마나 민감한지 알 수 있다.
그림 6. 임의의 신경망 3 2
지금까지의 흐름을 이해하고 있다면 이렇게 3개 2개로 이루어진 신경망에 대해서도 무리없이 우리는 비용함수를 구할 수 있다.
여기서 우리는 출력 노드를 각각 $a_1^{(L)},a_2^{(L)}$ 라고 하고 입력 노드를 $a_1^{(L-1)},a_2^{(L-1)},a_3^{(L-1)}$이라 표현한다면 1번째 입력 노드에서 2번째 출력 노드로의 가중치를 $w_{21}$로 표현할 수 있다.
이 것을 좀 더 일반화시켜 $n_{L}$ 개의 출력 노드와 k 개의 입력 노드가 있다고 가정하자.
그렇다면 노드가 여러 개 일때 $z_j^{(L)} = w_{j0}a_0^{(L-1)} + w_{j1}a_1^{(L-1)} + \cdots +w_{jk}a_k^{(L-1)} $ 가 j 번째 출력 노드에 대한 가중치 합이고 $a_j^{(L)} = \sigma(z_j^{(L)})$ 이다.
또한 $C_0 = \sum_{j=0}^{n_L-1} (a_j^{L} - y_j)^2$ 가 특정 노드에 대한 비용함수이다.
따라서 모든 비용함수 합은 각 $C_0$를 모두 더해주면 된다.
이 Back propagation 의 과정은 특정 가중치가 전체 비용 함수에 얼마나 영향을 주는지 거꾸로 들어가면 해석할 수 있다.
그림 7. 3 2 신경망에서의 특정 가중치의 영향력
그림 7 에서 알 수 있듯 이렇게 특정 가중치에 대해 알고 싶다면 앞서 단순한 구조의 신경망에서 의 과정을 전체 출력 노드에 진행하고 sumation을 하면 된다.
그림 8. 복잡한 신경망 에서의 index 표현
from Pascal Vincent's slides
그림 8도 위 과정에서 index가 무엇인지만 잘 이해한다면 따라갈 수 있을 것이다.