기계학습은 가중치 매개변수의 초깃값을 먼저 신경망에 적용한 이후, 최적화를 하기위해 각 가중치 매개변수에 대한 손실함수의 gradient를 이용하여 가중치의 값을 조정해 나간다. 이때 모든 가중치를 하나하나 일일히 계산하여 업데이트 하는 것은 시간이 오래걸려서 비효율적이다. 그래서 순전파를 통해 구해진 오차를 역전파해서 효율적으로 가중치를 업데이트 해나가는 것이다. 이때의 오차 값은 여러 가중치와 활성화 함수를 거쳐서 나오게 된 값으로 이를 거슬러 올라가기 위해 미분의 chain rule 성질을 이용한다.
해당 신경망에서 체인룰을 이용해 w5의 에러 함수 미분을 한다면 아래의 식과 같다.
$$ \frac{\partial E_{total}}{\partial w_5} = \frac{\partial E_{total}}{\partial o_1} \times \frac{\partial o_1}{\partial z_3} \times \frac{\partial z_3}{\partial w_5} $$
여기서 구해진 값과 learning rate를 곱해서 업데이트 할 가중치의 양을 정한다.
$$ w = w-learning \ rate* \frac{\partial L}{\partial w} $$
여기서부터는 조금 자세하게 하나씩 계산해보면서 정리 한것이다.
순전파
입력층에서 입력 x1, 2를 받아 z1, z2를 계산한다.
$$ z_1 = w_1x_1 + w_2x_2 = 0.1 \times0.1+0.2\times 0.2=0.05 \\ z_2 = w_3x_1 + w_4x_2 = 0.25 \times0.1+0.3\times 0.2=0.085 $$
활성화 함수를 거친다. sigmoid 함수를 사용한다고 가정.
$$ h_1 = sigmoid(z_1) = 0.5124973964842103 \\ h_2 = sigmoid(z_2) = 0.5212372149662741 $$
은닉층의 출력 값으로 다시 가중치를 거쳐 다음으로 전달한다.
$$ z_3 = w_5h_1+w_6h_2= 0.15 \times h1 +0.2 \times h2=0.18112205246588636 \\ z_4 = w_7h_1+w_8h_2= 0.4 \times h1 +0.35 \times h2=0.38743198383188004 $$
활성화 함수를 통해 최종 값을 출력한다.
$$ o_1 = sigmoid(z_3) = 0.5451571315070379 \\ o_2 = sigmoid(z_4) = 0.5956643491337819 $$
출력 값과 실제 값을 비교해 보면
$$ E_{o1} = 0.5451571315070379- 0.5 =0.04515713150703793 \\ E_{o2} = 0.5956643491337819- 0.2 =0.39566434913378185 $$
약 0.04와 0.4 정도의 오차가 발생했다. 이제 손실함수를 사용해서 가중치를 얼마나 업데이트 시킬지 구해야 한다. 여기서는 MSE 평균제곱오차를 사용하겠다.
$$ E_{o1} = \frac1{2} (target_{o1}-output_{o1})^2=0.0010195832629719588 \\ E_{o2} = \frac1{2} (target_{o2}-output_{o2})^2= 0.07827513858772961 $$
$$ E_{total} = E_{01}+E_{02} = 0.07929472185070156 $$
역전파
신경망 전체의 오차는 약 0.079정도이다. 그럼 이제 구해낸 전체 오차 값을 토대로 역전파를 해보자.
업데이트가 필요한 가중치는 w1부터 w8까지 총 여덟개이다. 출력층부터 시작하기 때문에 먼저 업데이트 되는 가중치는 w5, 6, 7, 8이며 w5에 대한 미분을 진행해보자.
$$ \frac{\partial E_{total}}{\partial w_5} = \frac{\partial E_{total}}{\partial o_1} \times \frac{\partial o_1}{\partial z_3} \times \frac{\partial z_3}{\partial w_5} $$
첫번째 항부터 순서대로 구해보자. 먼저 E total 식은 다음과 같다.
$$ E_{total} = \frac1{2} (target_{o1}-output_{o1})^2 +\frac1{2} (target_{o2}-output_{o2})^2 $$
이를 미분 하면
$$ \frac{\partial E_{total}}{\partial w_5} = 2 \times \frac1{2}(target_{o1}-output_{o1})^{2-1)} \times (-1) + 0 $$
o1에 대한 미분이므로 o2 항은 상수 취급하여 사라졌다. 이 식을 계산해 보면
$$ \frac{\partial E_{total}}{\partial w_5} = -(target_{o1}-output_{o1}) = (0.5-0.5451571315070379) = 0.04515713150703793 $$
이제 다음으로 두번째 항을 미분해보자.
$$ o_1 = sigmoid(z_3) $$
시그모이드는 미분을 하면 하단의 식이 나오게 된다.
$$ sigmoid(x)(1-sigmoid(x)) $$
우리 식에 적용하면 다음과 같이 값이 나온다.
$$\frac{\partial o_1}{\partial z_3} = o_1 \times (1-o_1) = 0.2479608334740561 $$
마지막으로 w5에 대한 미분이다. z3의 수식을 보면
$$ z_3 = w_5h_1+w_6h_2= 0.15 \times h1 +0.2 \times h2 $$
w6h2는 상수 취급해서 사라지고 결론적으로 h1만 남게 된다.
$$ \frac{\partial z_3}{\partial w_5} = h_1 = 0.5124973964842103 $$
드디어 모든 값을 구했다. 전부 곱해주면 미분이 끝나게 된다.
$$ \frac{\partial E_{total}}{\partial w_5} = 0.04515713150703793 \times 0.2479608334740561 \times 0.5124973964842103 = 0.005738535830376714 $$
이제 경사하강법을 이용해 가중치를 업데이트 해줘야 한다. 학습률은 0.1이라고 가정한다.
$$ w = w-learning \ rate* \frac{\partial L}{\partial w} \\
w_5^+ = w_5 - \alpha \frac{\partial E_{total}}{\partial w_5} = 0.15-0.1 \times 0.005738535830376714 = 0.14942614641696234 $$
w5는 약 0.149 라는 줄어드는 방향으로 업데이트가 되었다. 이 작업을 w6, w7, w8에 대해서도 해준다.
이제 w1, w2, w3, w4에 대해 가중치 업데이트 과정을 보자.
위에서 했던 과정과 동일하게 전체 오차를 w1로 미분 시켜 주면된다.
$$ \frac{\partial E_{total}}{\partial w_1} = \frac{\partial E_{total}}{\partial h_1} \times \frac{\partial h_1}{\partial z_1} \times \frac{\partial z_1}{\partial w_1} $$
첫번째 항을 아래와 같이 얻을 수 있다.
$$ \frac{\partial E_{total}}{\partial h_1} = \frac{\partial E_{o1}}{\partial h_1} + \frac{\partial E_{o2}}{\partial h_1} $$
여기서 또 첫번째 항을 다음과 같이 체인룰을 이용해 얻을 수 있다.
$$ \frac{\partial E_{o1}}{\partial h_1} = \frac{\partial E_{o1}}{\partial o_1} \times \frac{\partial o_1}{\partial z_3} \times \frac{\partial z_3}{\partial h_1} $$
결론적으로 전체 오차에 대한 h1의 미분은 다음과 같다.
$$ \frac{\partial E_{total}}{\partial h_1} = (\frac{\partial E_{o1}}{\partial o_1} \times \frac{\partial o_1}{\partial z_3} \times \frac{\partial z_3}{\partial h_1})+ (\frac{\partial E_{o2}}{\partial o_2} \times \frac{\partial o_2}{\partial z_4} \times \frac{\partial z_4}{\partial h_1}) $$
상당히 복잡한 것을 알 수 있다.. 나머지는 위에서 했던 w5 구하기 과정과 같다. 두번째 항을 미분하면 아까 시그모이드 미분과 마찬가지로 다음의 값이 나오고
$$ h_1 \times (1-h_1) $$
z1을 w1로 미분하면 결국 w2x2는 상수 취급되어 x1 값만 남게 된다.
구해진 값을 전부 곱하면 업데이트 해야 할 값이 나온다. 두번째 노드여서 전체 오차에 대해 미분하는 것이 훨씬 복잡해졌다. 그래도 한번 과정을 풀어서 적어보니 이해 하는데 많은 도움이 되는 것 같다.
이런식으로 순서대로 역전파를 거치면서 모든 가중치 매개변수에 대해 업데이트를 하면 한번의 업데이트가 끝난 것 이다. 이런 업데이트를 손실함수가 최소화 되는 방향으로 반복하면서 최적화된 가중치를 얻어내도록 학습을 하는 것이 딥러닝 학습의 기본 방향이다.
'머신러닝 > 딥러닝' 카테고리의 다른 글
FastText, Glove (0) | 2022.07.04 |
---|---|
가중치 초기화 (0) | 2022.07.03 |
배치 정규화, 레이어 정규화 (0) | 2022.07.03 |
경사하강법 Gradient Descent (2) (0) | 2022.06.18 |
경사하강법 Gradient Descent (1) (0) | 2022.06.17 |