참고 자료들: 


뉴럴 network를 학습하는 방법으로 쓰이는 backpropagation algorithm을알아보자.


주어진 input layer로부터 각 neurun의 parameter(weight, bias)에 의해 연산 결과(\$z_i^l\$)를 activation function (ex: sigmoid, ReLU)을 통과시킨 후 (\$a_i^l = \sigma (z_i^l)\$ )
다음 layer로 넘기는 식으로 forward propagation을 수행하여, 최종 output의 결과를 얻는다.

각 뉴런의 parameter를 학습하는 것은,
보통 parameter의 initial 값 (ex: random)을 준 후, gradient descent 과정을 통해 training data의 cost function C를 줄이는 방향으로 학습하게 된다.
(cost function은 non-convex이므로 gradient descent 방식으로 parameter를 학습한다.)
Gradient descent는 cost function에 대한 parameter들(\$w^l_{ij}, b^l_j\$) 의 편미분값을 이전 parameter값에서 iterative하게 빼준다.
Gradient descent update 식은 다음과 같다.

$$w_{ij}^{(l)} = w_{ij}^{(l)} - \alpha \frac{\partial}{\partial w_{ij}^{(l)}} J(w,b)$$

$$b_{i}^{(l)} = b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(w,b)$$

효율적으로 partial derivative를 계산하는 backpropagation 방법을 소개한다.
*Error term delta의 정의
$$\delta^{(L)}_i= \frac{\partial}{\partial z^{(L)}_i} \frac{1}{2} \left\|y - a^{(L)}_i\right\|^2 = - (y_i - a^{(L)}_i) \cdot f'(z^{(L)}_i)$$

1. feedforward로 각 뉴런의 activation 값을 계산
2. output layer의 error (\$\delta^L\$)를 계산한다.
3. L-1, L-2 레이어로 넘기면서 error \$\delta^{L-1}_i\$ ,...를 계산한다.
\$\delta^l = ({w^l}^T \delta^{l+1})*f'(z^l)\$
4. delta를 이용한 partial derivative 식.
\$\delta_w^l J(w;x,y) = \delta^{l+1} a^l \$


큰 그림으로 보면,


위 그림과 같이  \$w^2_{21}\$ 의 값이 \$\Delta w^2_{21}\$ 만큼 변할 때, layer 2 의 1번째 뉴런의 activation은 \$\Delta a^2_1\$만큼 변하고, 이 변화는 최종 layer까지 전해져 cost를 \$\Delta C\$만큼 변화시킨다.
이는 cost C에 대해 어떤 parameter \$w^l_{jk}\$ 로 미분한 값은 아래 식과 같이 chain rule로 표현될 수 있는 것을 의미하며,
중간에 존재하는 \$\partial a^l/ \partial a^{l-1}\$ 의 의미는 layer의 edge 사이에 곱해지는 weight를 의미한다.
다시 말해보면 3번 step에서 layer 사이의 weight matrix w를 에러 \$\delta^{l+1}\$ 곱하여 전해지는 것은 이러한 chain rule의 의미와 같다고 볼 수 있다. 





Posted by 헬벨