티스토리 뷰

해당 글은 Stanford CS class  CS231n: Convolutional Neural Networks for Visual Recognition 강의를 기반으로 하고 있습니다.

(출처 :http://cs231n.stanford.edu/syllabus.html) Video 강의와 강의 note를 가지고 정리하고 있습니다.


Backpropagation

'neural network에서 parameter를 학습시킬 때, 좋은 성능의 모델을 얻으려 optimization하는 방법으로 - gradient를 따라간다'

이전 정리에서 말씀드린 것 기억하시나요? gradient()는 해당 포지션 p 에서 가장 급격하게 기울기가 상승하는 방향을 나타냅니다. 

loss function 가 주어진 상황에서 우리가 해야할 일은, 의 값이 가장 작은 포지션을 찾는 것입니다. 가장 작은 값을, 가장 빠르게 찾기위한 방법이 무엇일까요? 가장 급격하게 기울기가 줄어드는 방향으로 걸음을 옮기다보면 최저점에 도달할 수 있지 않을까요? 가장 급격하게 기울기가 상승하는 방향을 의미하는 ! 가장 급격하게 기울기가 하강하는 방향을 구할 때는  negative gradient  값을 사용하면 됩니다! 가장 급격하게 하강하는 방향을 쫓아가는 것이 산을 내려오는 가장 빠른 방법이겠죠? 가장 작은 loss 값을 얻기 위해, 우리는 parameter를 negative gradient 값을 사용하여 업데이트 시키는 gradient descent 방법을 사용하게 됩니다.




(출처: http://charlesfranzen.com/posts/multiple-regression-in-python-gradient-descent/)


뉴럴네트워크에서 gradient값을 사용하여 parameter를 학습시킬 때 사용하는 이론을 Backpropagation이라고 합니다. 뉴럴 네트워크 초기에는 backpropagation 이론이 정립되지 않아, parameter를 학습시키는 데 시간도 오래 걸리고, 정확도도 많이 떨어졌죠. 뉴럴네트워크를 암흑기에서 건져올린 것 중 하나가 backpropagation 이론의 도입입니다. Lec4는 backpropagation이 어떻게 이뤄지는지 실제로 눈으로 확인하면서 이해하는 것을 주 목적으로 하고 있습니다. 강의를 보면서 한번씩 따라가면서 계산해볼 것을 권장드립니다.



calculate gradient 

간단한 computational graph를 통해 gradient 계산하는 방법을 익혀봅시다. 

x, y, z 세 변수로 이뤄진 위 함수의 computational graph는 다음과 같습니다.





이 때, 우리가 구하고자하는 것은 함수 f의 gradient 입니다.


이를 구하기 위해, chain rule을 사용해야합니다.


중간에 위치한 + 노드를 q로 놓고 chain rule을 적용하여 각 변수에 대한 미분값을 구해봅시다!



       




하늘색으로 묶인 chain에 의해 x,y를 구하고, 노란색 chain에 의해 z를 구할 수 있습니다.





결국 backpropagation은 네트워크의 최종 output 노드에서부터 반복하여 chain rule을 적용하는 과정입니다.

위 예시에 적용해볼까요?



초기 값은 늘 1이 됩니다. f를 f에 대해서 미분하니까요!






x 를 구하는 과정에서 q 노드에서 구한 미분 값을 바로 가져다 계산할 수 있다는 점이 포인트입니다!

y 도 x와 마찬가지로 q 노드에서 구한 값을 이용하여 바로 계산할 수 있습니다.



마지막으로 z 를 구하는 과정입니다. 




chain rule을 통해 구한 결과, f의 gradient는 아래와 같군요!


 



f 함수를 loss function이라고 했을 때, f의 그래프는 (x=-2, y=5, z=-4) 위치에서 <-4, -4, 3> 방향으로 가장 급격하게 상승할 것입니다. 


Parameter update


위 그림을 예를 들어, backpropagation을 통해 gradient가 어떻게 parameter update에 적용되는지 이해해보도록 합시다.


input vector [x0, x1]

weight parameter vector [w0, w1, w2]


input vector와 weigth parameter는 dot product 됩니다. 위의 그림에서도 [(x0 * w0) + (x1 * w1)] + w2 식을 통해 dot product 과정을 갖고, 뒷 부분에서 actvation function 부분을 거치면서 0 에서 1 사이의 실수값으로 변환되는 것을 확인할 수 있습니다. 우선 주어진 input vector 값과 weight parameter vector값을 가지고 forward 방향으로 순서대로 dot product를 계산하는 과정이 수행된 후, backpropagation으로 gradient 값이 계산됩니다. Forward 방향으로 한번, Backward 방향으로 또 한번 두번의 큰 연산 과정이 일어난다는 것을 기억합시다. 실제 컴퓨터에 연산을 시킬 때도 memory를 forward 계산용, backward 계산용 따로 확보해두어야합니다!


backward방향으로 gradient를 모두 구한 위와같은 과정을 가정했을 때, parameter의 업데이트는 다음과 같이 이뤄집니다.



: 기존의 weight parameter 값 -> weight parameter의 element 각각을 의미합니다.

: step size (학습해가는 size인데, 산을 내려가는 보폭이라고 생각할 수 있습니다. hyperparameter!!)

: 기존의 weight parameter에서 구한 gradient


위의 식을 해석해보면, 기존의 parameter값에서 step size를 곱한 gradient 값을 빼주는 방법으로 parameter 업데이트가 이뤄집니다. negative gradient를 사용하여 제일 빠르게 내려가는 방향으로 이동하는 것입니다! 이 방향을 gradient descent라고 합니다. 


위의 w0를 예로 들어보면, 


next_w0 = pri_w0 - 1*( -0.2 ) = 2.00 + 0.2*1 = 2.20 (step size = 1)


w0는 2.20으로 업데이트 되겠군요.


Jacobian matrix

위 과정이 





 


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함