본문 바로가기
Deep Learning Study/Mathematics

[미적분학] Back Propagation

by BangGeuk 2024. 3. 2.

혹시 잘못된 부분이나 수정할 부분이 있다면 댓글로 알려주시면 감사하겠습니다.


이전 글에서 Loss Function, Optimization을 알아보았다. Feedforward를 통해 예측값을 얻고 Loss Function(실제값과 예측값 사이의 오차를 계산하기 위한 함수)를 이용해 오차를 계산한다. 그 후, Optimization(오차를 어떠한 방식으로 최소로 할지에 대한 알고리즘)을 통해 오차를 최소화한다. 오차를 최소화하기 위한 알고리즘까지 알아보았으니 오차를 최소화하는 과정. 즉, 가중치를 업데이트하는 과정을 알아보고자 한다..!!(Loss Function과 Optimization에 대해 저번에 작성한 글 참고)

 

[확률 및 통계학] Loss Function

혹시 잘못된 부분이나 수정할 부분이 있다면 댓글로 알려주시면 감사하겠습니다. Loss Function은 머신러닝, 딥러닝에서 필수적인 부분이고 논문에서도 자주 나오는 용어로 대표적인 것들만 정리

byeonggeuk.tistory.com

 

[미적분학] Optimization(GD, SGD)

혹시 잘못된 부분이나 수정할 부분이 있다면 댓글로 알려주시면 감사하겠습니다. Loss Function은 예측값과 실제값의 차이를 계산해주는 함수이다. 모델은 Loss Function을 이용해 오차를 계산한 후 오

byeonggeuk.tistory.com

 

 

Back Propagation은 어떻게 이루어질까? 모델이 사용한 가중치들을 어떻게 업데이트를 할까? 이는 모델이 오차를 줄이고 더 좋은 모델이 되기 위한 중요한 과정이다. 이러한 과정에서 등장하는 개념이 연쇄법칙(Chain Rule)이라 이 개념부터 알아보고자 한다.

Chain Rule

아래 수식과 같이 z = g(y), y = f(x)라고 하자. 이러한 경우, z를 x에 관해 미분할 수 있을까? 있다!(있으니까 소개했겠..)

 

z를 x에 관해 미분하기 위해서는 z를 y에 관해 미분한 것과 y를 x에 관해 미분한 것을 곱하면 된다.

 

Chain Rule를 Back Propagation에서 어떻게 사용하고 Back Propagation을 통해 어떻게 가중치를 업데이트하는지 이제부터 알아보자!

 

Back Propagation에 대해 유튜브에서 정말 쉽게 설명해준 영상이 있어 이 영상을 참고하여 알아보고자 한다.(수식과 그림을 직관적으로 그려주고 쉽게 설명해주신 것에 대해 감사드립니다.)

영상 출처 : https://www.youtube.com/watch?v=DMCJ_GjBXwc&t=394s

Back Propagation 과정

 

1. Feedforward를 진행하여 예측값을 출력한다. 두 개의 input 값은 0.5, 0.3이고 activation function은 sigmoid 함수를 사용하였으며 최종 출력층에도 sigmoid 함수를 사용하였다.

 

2. Loss Function. Loss Function은 MSE(Mean Square Error)를 사용하고자 한다. MSE 수식은 다음과 같다.

위 수식에서 다음과 같은 예제에 적용할 때에는 한 개의 예제만 사용했기 때문에 N=1이고 실제값은 1이라 가정하고 예측값은 아까 구한 0.645가 된다. 따라서, 오차 C는 0.126이다.

 

3. Optimization. Back Propagation을 진행하기 앞서, 어떤 Optimization Algorithm을 사용할 지 정해야 한다. 위 예제에서는 GD(Gradient Descent)를 사용하고자 한다. GD 수식은 다음과 같다.

위 수식을 직관적으로 해석하면 다음과 같다.

 

여기서, 오차 C에 대한 미분값은 어떤 가중치를 업데이트할 것이냐에 따라 값이 달라진다. 그리고 여기서, 아까 소개한 Chain Rule이 등장한다. 오차를 w5에 대해 미분하고자 하는데 그 값을 바로 알 수 없기 때문에 Chain Rule을 이용하여 구한다. 오차를 w5에 대해 미분하기 위한 식은 아래와 같다.

 

오차를 w5에 대해 미분한 값을 Chain Rule을 통해 구하기 위해서는 3개의 값을 알아야 한다. 우선, 오차를 o1에 대해 미분한 값을 구해보면 아래와 같다.

 

아까 입력값을 통해 출력된 예측값 0.645와 실제값 1을 이용하여 구한다. 그 다음, o1을 z3에 대해 미분한 값을 구하기 위해서는 sigmoid를 미분할 줄 알아야하는데 sigmoid를 미분하면 자기 자신 * (1 - 자기 자신)이 나온다.

 

여기서, O(z)는 0.645이므로 0.645 * (1-0.645) = 0.229가 나온다.

 

이제 마지막으로 z3를 w5에 대해 미분한 값을 구해보자. z3는 h1*w5 + h2*w6이고 이를 w5에 대해 미분하면 h1만 남는다. h1 값은 아까 설명하지 않았지만 sigmoid(z1) 값이다. z1은 0.5*0.7+0.3*0.4 (input1*w1+input2*w3) 이기 때문에 0.47이다. sigmoid(0.47) = 0.615 이다.

 

C를 w5에 미분한 값을 구하기 위해 Chain Rule을 이용하였고 Chain Rule 과정에서 필요한 미분 값들을 모두 구했으니 곱하기만 하면 된다. C를 w5에 미분한 값은 -0.01이다.

 

 

이렇게 구한 -0.01은 어디에 쓸까? 아까 선택했던 Optimization Algorithm에 넣으면 된다!

 

현 연결강도 w5는 0.55이고 C를 w5에 대해 미분한 값은 -0.01이고 학습률은 0.1이라고 했을 때 업데이트 할 가중치 값은 0.55 + 0.01 * 0.1 = 0.551이다. 이제 w5 하나 업데이트했다!! 나머지 w1,w2,w3,w4,w6에 대해서도 동일하게 업데이트하면 되고 모든 가중치를 업데이트하면 한 번 학습(1 step)한 것이다. 그래도 w1 가중치 업데이트 과정도 한 번 알아보자. 오차 C를 w1에 대해 미분한 값을 알기위해서는 다음과 같이 o1, z3, h1, z1, w1들을 이용해야한다.

 

C를 o1에 대해 미분한 값과 o1을 z3에 대해 미분한 값은 앞서 w5 가중치를 업데이트 했을 때 구했으므로 넘어가고 z3를 h1에 대해 미분한 값을 알아보자. z3 = h1*w5 + h2*w6 이므로 이를 h1에 대해 미분하면 w5만 남게되고 w5는 0.55이다.

 

h1은 sigmoid 함수로 sigmoid를 미분하면 자기 자신 * (1 - 자기 자신)이다. h1은 앞서 구한 것과 같이 0.615이므로 sigmoid를 미분한 식에 대입하면 0.237이 나온다.

 

z1 = x1*w1 + x2*w3 이므로 w1에 대해 미분하게 되면 x1만 남게되고 x1은 0.5이다.

 

최종적으로, C를 w1에 대해 미분한 값은 -0.71*0.229*0.55*0.237*0.5 = -0.0106 이다.

 

이제 Gradient Descent 식에 넣어주어 w1을 업데이트하면 된다.

업데이트된 가중치 = 기존 가중치 - 미분 값 * 학습률 = 0.7 + 0.0106 * 0.1 = 0.701

 

1 step Back Propagation 끝!!

 

모두 업데이트된 가중치를 통해 예측값을 출력해보고 그 전과 오차가 얼마나 줄어들었는지 확인해보면 아래와 같다.

 

이렇게 이전 글을 포함하여 알게 된 Loss Function, Optimization Algorithm, Chain Rule를 통해 Back Propagation을 진행하였다. 이를 통해, 모델의 정확도를 더 높일 수 있다.

 

Conclusion

1. Chain Rule

 

특정 미분 값을 구하기 위해 각 함수의 미분을 곱해서 구할 수 있다. 이를 통해, Back Propagation을 진행할 수 있다.

2. BackPropagation 과정

 

FeedForward 진행 -> Chain Rule을 통해 각 가중치 업데이트

BackPropagation을 진행하기 전에 Activation Function, Loss Function, Optimization, Learning rate를 정해야한다.

BackPropagation을 통해 가중치를 업데이트 하여 오차를 최소로한다.