세로형
Recent Posts
Recent Comments
Link
03-29 03:47
«   2024/03   »
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
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

cs231n 2017 4강 정리 backpropagation and neural networks 본문

deep learning(딥러닝)

cs231n 2017 4강 정리 backpropagation and neural networks

이수진의 블로그 2018. 11. 6. 09:50

이번 포스팅은 스탠포드 대학 cs231n 4강 정리 포스팅입니다.


이번 강의에서는 backpropagation(오차역전파)과 neural network에 대해서 배웁니다.

그럼 바로 시작하겠습니다.



맨 처음 부분은 여기 강의 과제에 대한 이야기라서 넘어가도록 하겠습니다.

 

우리는 지난 시간에 score function에 대해서 배웠습니다.

그리고 SVMlosshinge loss에 대해서 배웠습니다.

또 다른 losssoftmax loss를 배웠습니다. 이건 cross entropy loss라고도 불리우죠.

그리고 규제(regularization)에 대해서도 배웠습니다.




이후 optimization에 대해서도 배웠습니다. 이 과정에서 경사하강법을 배웠지요.




그냥 일반적으로 계산하는 방법은 numerical 방법입니다. 근데 이건 속도가 느리고 정확하지 않다는 단점이 있죠. 그래서 우리는 해석적 방법인 analytic 방법을 많이 사용하고 보통 gradient check를 할 때 numerical gradient를 사용한다고 배웠습니다.




앞에서 배웠던 것을 그림으로 표현하면 이와 같이 됩니다. Wx가 곱해져서 들어오고 그 score 값을 function에다가 넣고 거기에 + 규제를 해서 loss가 나오게 되는 것이죠





그리고 여기 AlexNet, Neural Turing Machine이 있는데 이런 그림과 같은 층을 계속 이어서 이렇게 네트워크를 쌓을 것입니다.





지난 시간에 배웠던 gradient를 이제 자세히 볼 것입니다. 어떻게 gradient를 이용하여 가중치를 업데이트 시키는지 자세히 배울 것인데요. 여기서 backpropagation을 배울 것입니다.

먼저 간단하게 이렇게 예시가 있다고 가정합니다. (x+y)z식으로 표현되어 있고 x=-2이고 y = 5, z=-4라고 보죠.

그걸 이제 더하고, 곱하면 이렇게 초록색 값이 나오게 될 것입니다.





근데 우리는 이제 이걸 알아야 합니다. Xf에 미치는 영향, yf에 미치는 영향 그리고 zf에 미치는 영향을 알아야 합니다.

이걸 미분 식으로 표현하면 df/dx, df/dy, df/dz 로 표현합니다.

그럼 얘를 어떻게 구할까요? 이거를 바로 미분으로 구하게 됩니다.

먼저 미분을 구할 때 필요한 식을 몇 개 써보죠. q=x+y의 식에서 dq/dx1, dq/dy = 1입니다.

이건 편미분이죠? 그리고 f=qz에서 df/dqz이고 df/dzq입니다.

여기서의 특징을 알아두시면 좋습니다.

덧셈 연산에서 미분은 1이고, 곱셈 연산에서는 서로의 값을 가지게 된다는 것입니다. 이게 무슨말이냐면 qz에서 미분을 하면 z에 대해서 미분을 하면 q가 나오고, q에 대해서 미분을 하면 z가 나오는 것입니다.






자 이제 계산을 해보죠. 앞에서 forward식으로 구했습니다. 이제 각 값이 최종 f에 영향을 미치는 정도를 파악하기 위해서 gradient를 계산합니다. Ff에 영향을 미치는 것은 당연히 1이겠죠.





이제 zf에 영향을 미치는 정도를 봐봅니다. 이건 앞에서 식으로 구해놨죠? 바로 q값입니다. 3이 되겠죠.




3이 나옵니다.



Qf에 영향을 미치는 것도 마찬가지입니다. 앞에서 구했듯이 z가 될 것이고 z값인 -4가 될 것입니다.



이렇게 말이죠!



자 이제 문제는 yf에 미치는 영향 및 xf에 미치는 영향 값을 구해야합니다




여기서 바로 direct로 구할 수 없죠? 그래서 chain rule이 적용됩니다. Chain rule은 미분에서 사용되는 방법입니다. 만약 xf에 대해서 영향을 미치는 값을 알고 싶으면 x -> q -> f 이므로

Xq에 미치는 영향 * qf에 미치는 영향을 구하면 됩니다. 근데 qf에 미치는 영향은 이미 알고있죠? 간단한 미분식으로 아까 구했습니다. 그리고 x + y의 미분은 1이라고 이미 구했죠? 그래서 이걸 local gradient라고 부릅니다. local gradientforward passing을 하면서 그냥 구해버릴 수 있기 때문에 미리 값을 가지고 있습니다.

이제 Y가 q에 미치는 영향만 알면되죠? 근데 그 값을 이미 알고 있습니다. 바로 1이네요. 그래서 1 * q의 값(-4)를 곱하니 -4가 됩니다. x도 마찬가지구요.




x도 마찬가지로 이렇게 구할 수 있습니다.




그래서 qzx+y 같은 미리 구할 수 있는 미분 값을 local gradient라고 합니다. local값과 앞에서 넘어온 gradientglobal gradient라고 하는데 이 값을 곱해서 gradient를 계산합니다.




이 그림처럼요!

이 그림들은 제가 앞에서 했던 과정을 그림으로 설명해준 것입니다.

훨씬 이해하기 쉽죠? 




그럼 여기서 끝이냐? 이 예에선 여기가 끝이니깐 끝나지만 실제로는 앞에서 더 많은 node들이 있을 겁니다. 그래서 여기서 구한 gradient를 다시 뒤로 보내고(global gradient) 그리고 뒤에 있는 local gradient와 이 받은 global gradient를 곱해서 다시 구하고..를 반복합니다.

이렇게 적절한 gradeint를 찾아갑니다



여기 조금 더 심화된 내용이 있습니다. 시그모이드를 구해보는 것이죠.

시그모이드도 미리 계산하기 편하도록 local gradient의 식을 써봅니다. 이렇게 4개가 되겠죠!



자 먼저 맨 처음 gradient는 당연히 1입니다. 그리고 다음을 구해보죠.




1.37쪽 기준에서는 global gradient1입니다. 그리고 1/x이니까 local gradient-1/x^2가 됩니다.

-1/1.37^21을 곱하면 되는 것이므로 gradient-0.53이 나오게 됩니다.

다음을 구해보죠.





0.37기준에서는 global gradient-0.53이 됩니다. 근데 여기서 local gradient1이므로 1 * -0.53을 하면 -0.53이 됩니다




이런식으로 쭉 구해주시면 됩니다.



Exp를 하는 부분에서 보면 global gradient-0.53입니다




Local gradient e^x값 즉 e^-1이 되므로 -0.20이 나오게 됩니다.






그리고 그 다음은 0.2가 나오게 되구요. 이제 덧셈 연산을 거치면 다시 0.2가 나오게 되고 그림들 처럼 쭉쭉 구해주시면 됩니다.

뒤에서 나오는 과정들은 앞에서 했던 과정과 똑같습니다.

구해주시면 계산값이 나오실겁니다.




이런식으로 간편하게 구할 수 있으실 겁니다.



근데 여기서 다른 장점을 하나 살펴볼 수 있습니다.

시그모이드에 대한 값인데요. 이 파란색 네모 쳐진 부분이 바로 시그모이드죠? 여기를 sigmoid gate라고 할 수 있습니다. 앞에서는 여기를 하나하나 구했지만 굳이 그럴 필요가 없다는 것을 여기서 보여줍니다.


이 미분의 과정을 거치면 시그모이드 식은 맨 아래처럼 나오게 되는데요. 얘를 일반화 하게 되면 (1-sigmoid) * sigmoid 로 표현할 수 있습니다





, sigmoid 게이트가 들어가기전 gradient는 시그모이드 값인 0.73을 기준으로 (1-0.73)(0.73)으로 구할 수 있는 것이죠!

즉 굳이 복잡하게 구하지 않고도 바로 구할 수 있는 것입니다.






자 근데 여기서 또 gradient의 특성을 알 수 있습니다. 바로 add, mul 등의 gate에 대한 특징입니다. Add local gradient1입니다. 그래서 global gradient * local gradient를 하면 local1이기 때문에 global gradient가 그대로 나오게 됩니다. , add gategradient를 그대로 전해주는 역할을 하게 됩니다. 그래서 distributor라고 불립니다




그리고 max 게이트가 있습니다. Max gate는 큰 값에게 gradient를 그래도 전하고 작은 값은 0으로 그냥 만들어서 보내는 것입니다.




이렇게 말이죠



그리고 아까 mul 즉 곱하기도 있었죠? 곱하기는 앞서 소개한대로 서로의 값을 교환합니다



qz라고 하면 q z값을 가지게 되고 z q의 값을 가지게 되죠. 즉 얘는 스위칭되었습니다. 그래서 mul gateswitcher라고도 불립니다.






근데 만약 앞에서온 gradient1개가 아니라 여러 개면 어떻게 될까요? 이 그림처럼 말이죠.(51페이지) 그러면 그냥 복수의 gradient를 더해줍니다.





근데 우리는 이게 하나의 값이 아니라 다변수일 확률이 높습니다. 보통 딥러닝이 그렇죠? 그럴떈 자코비안 행렬 방식으로 되게 됩니다. 자코비안 행렬은 다변수 함수일때의 미분값입니다. 이걸 행렬로 표현한 것이죠.




그래서 input이 이제 d 차원의 벡터가 들어가게 됩니다. 그리고 outputd차원의 output이 되죠.



그럼 jacobian matrix의 크기는 어떻게 될까요? Input4096이고 output4096이니까 4096 x 4096이 될 것입니다




그쵸?




근데 여기에 minibatch를 추가하게 되면 예를 들어 100개씩이면 100을 곱해야겠죠. 그래서 409600 x 409600이 됩니다.

이는 매우 거대하죠! 근데 실제로는 이 거대한 자코비안 행렬을 계산하지 않습니다. 여기서 어떤 구조가 보이나면 이거는 요소별로 보기 때문에 입력의 각 요소 즉 첫번째 차원은 오직 출력의 해당 요소에만 영향을 주기 때문입니다. 그렇기 때문에 자코비안 행렬은 대각행렬이 됩니다! 그래서 실제로 이 전체 jacobian 행렬을 작성하고 공식화할 필요가 없다는 것입니다. 우리는 출력에 대한 x의 영향과 이 값을 사용한다~ 라고 알면 됩니다. 그리고 계산되어 나온 gradient를 채워 넣는 것이구요. 그냥 그렇구나~ 하고 넘어가면 되겠습니다. 저도 잘 모르겠네요 이 부분은 




이제 앞에서 본 graph보다 더 구체적인 것을 보겠습니다





이 예시를 보면요 규제값을 넣어가지고 x에 의해 곱해진  WL2처럼 만듭니다.





이 경우 xn-차원이라고 하고 wn*n이라고 합시다





그리고 그림을 그리면 이런 모양이 나오겠죠?




그리고 앞에서 한 것처럼 q=wx이고, wx가 각 값이 저렇게 된다고 봅시다.

이제 행렬곱을 하면 아래 식처럼 되고 우리는 L2 정규화를 했으니 제곱을 하게 됩니다.




계산을 해봅니다. 위에 0.22가 나오게 된 거는 어찌 해서 나올까요?

0.1*0.2 + 0.5*0.4를 해서 나오게 됩니다. 0.26 -0.30.8기준이죠.

그리고 0.220.26이 행렬곱에 의해서 나오게 됩니다. 이 값들을 이제 각각 제곱을 합니다.

0.22를 제곱하면 0.048, 0.26을 제곱하면 0.067이 나옵니다. 이 둘을 더하면 0.116이 나오게 되죠!




그리고 이제 gradient를 구해보죠. 맨 처음은 역시나 1입니다



그리고 qidf에 미치는 영향은 2qi 이므로( qi^2 미분값) 우리는 2q값을 취하면 됩니다



그래서 local gradient2qglobal1이므로 0.44, 0.52값이 나오게 됩니다.




그리고 다음을 구해야하죠? 조금 식이 복잡한데요. 하나씩 봐보죠

dWi,j일 때 dqk를 구해야합니다. w q에 미치는 영향을 구하는 것이죠. 그리고 1=k=ixj가 있는데요. 이거는 kI 일때 1이라는 것입니다. 그리고 아닌 것은 0으로 두는데요. 왜 이렇게 두냐면 행렬에서 값을 계산할 때 각 행의 계산 시에 다른 행은 관여하면 안되기 때문입니다! 참고로 i는 행, j는 열입니다.



그래서 이 식에 대해서 미분값을 구하게 되면 앞 페이지 처럼 나오게 됩니다. 뭔가 수식이 많다고 에이 뭐야 이게 하지 마시고 하나하나 따라가시면 이해가 되실겁니다. 시그마k 옆에 df/dqkk일 때 qf에 미치는 영향 * wq에 미치는 영향입니다. 즉 우리가 앞서 보았던 chain rule입니다. chain rule이 다차원을 만나면서 조금 복잡해진 것이지 원리는 같습니다.

그래서 결국은 2qixj가 됩니다.

0.088이 왜 나왔을까요? 바로 앞에서 온 gradient0.44 * 0.2을 했기에 0.088이 나옵니다. 왜냐하면 이제 2x2 행렬이 나와야합니다. 그래서 x를 전치시킵니다(T). 그래서 2x1 행렬이었던  x1x2로 되고 앞에서 온 행렬은 2x1 이므로 2x1 행렬 곱하기 1x2 행렬이니까 2x2 행렬이 나오게 됩니다. 그렇게 다른것도 곱해줘서 구해주면 됩니다. 마찬가지로 다른것도 이렇게 구하면 되겠습니다!




위 식은 우리가 유도한 식을 벡터화된 형식으로 작성한 것입니다.




여기서 빨간색으로 중요한 것을 강조했는데요 중요한 것은 변수에 대해 gradient를 항상 체크하는 것입니다. 이것들은 항상 변수와 같은 shape를 가지고 있습니다. 무슨말이냐 하면 gradient가 무엇인지 계산을 했으면 이 결과가 변수의 shape와 동일한가?를 체크해야 합니다. 이거를 체크하지 않고 그냥 하면 에러를 뿜을 수 있습니다. 변수와 같은 shape를 꼭! 가지고 있어야 합니다.




아래 값에 대한 gradient를 마저 구합니다. Dqk/dxi인데요



q에 미치는 영향입니다. 이건 Wk,i겠죠?. 이걸 더 자세한 식으로 계산하면 시그모이드 k df/dqk * dqk/dxi가 됩니다. 앞에서 했던 것과 마찬가지죠? Chain rule을 적용한 것입니다





마찬가지로 이번에는 w가 전치가 됩니다. W가 전치가 되면 첫번쨰 행은 [0.1, -0.3]이 되고 2번째 행은 [0.5, 0,8]이 됩니다. 그래서 0.1*0.44 + -0.3*0.52를 하게 되면 -0.112가 나오게 됩니다. 0.636도 마찬가지로 구하면 됩니다~




이렇게 해서 값을 구하게 됩니다. 하나하나 차근히 따라가시면 됩니다~





그래서 이 식은 저걸 코드화로 했을 때 이렇게 된다는 것입니다. 곱셈에 대한 클래스는 forward시에는 그냥 곱하지만 backward시에는 어떻게 되죠? x일때는 y의 값, y일때는 x의 값을 구합니다. 여기선 스칼라이니까 전치가 적용되지 않고 그냥 구하면 됩니다. 벡터면 당연히 전치가 들어가게 됩니다. 파이썬 numpy에선 .T 연산자로 간단하게 전치가 가능합니다.






그리고 caffe에 있는 layer를 설명해주고 sigmoid가 어떻게 되어 있는지 설명해주는 것입니다. 간단히 넘어가겠습니다. 그냥 그렇구나~ 생각하시면 됩니다.





그리고 이 페이지는 svm에 대한 과제입니다. 요약을 하자면 이렇게 되구요 이제 뉴럴 네트워크에 대해서 알아보죠!





우리는 과거에 이렇게 단순한 linearscore를 알아봤습니다. F=Wx이죠





근데 이제는 W2max(0, W1x)와 같이 됩니다. Relu에서 이렇게 사용하죠





처음에 3072개의 x가 들어오면 w1와 곱해져서 중간인 h(hideen)노드에 들어가고 이 hideen node를 통해 나와서 다시 10개의 출력값(CIFAR-10)을 나오게 됩니다.





즉 중간에 히든 레이어가 하나 더 생기게 되었죠. 이는 과거에 그냥 하나의 분류기로 판단했던 것과 다릅니다. 이 그림은 우리가 과거에 봤던 하나의 분류기로 했던 것입니다. 말 머리가 2개로 보이는 등 잘 분류가 되지 않았죠. 근데 이제는 얘기가 다릅니다. 히든 노드가 100개면 우리는 서로 다른 100개의 분류기를 가지고 있는 것입니다




만약 3-layeraus 이렇게 될 것이구요.




그래서 이걸 numpy로 짜보면 이런식으로 나오게 될 것입니다. 소스에 대한 설명은 천천히 보시면 아실겁니다. Expe^승 연산이고 dot은 행렬곱이니까 하나하나 보시면 될 것 같아요~




그리고 여기서 과제가 하나 더 나옵니다. 2-layer net을 구축해 보는 것이죠~ 저는 과제는 하지 않으므로 패스를…..




이제 뉴런을 봐보죠. 뉴런은 사실 신경망입니다. 우리 뇌속의 뉴런이죠. 그래서 하나의 input이 들어오면 axon을 거쳐서 다른 뉴런으로 들어가게 됩니다. 이렇게 서로 영향을 미치는 것이죠.




그래서 이 그림은 아래처럼 우리가 여태 배웠던 것과 비슷합니다. Input이 있으면 그것에 따른 w를 곱해서 그걸 어떤 활성화 함수를 통해 거쳐서 output 으로 나가는. 비슷하게 생겼습니다




활성화 함수는 우리가 전에 배웠던 시그모이드(sigmoid)함수 같은 것이 되겠죠




그리고 소스로 보면 대략 저렇게 나온다고 합니다.




하지만 여기서 주의해야할 것이 있습니다. 실제로 생물학 뉴런은 많이 다르고 우리가 만드는 이 뉴런 네트워크가 실제와는 많이 다르다는 것입니다. 그래서 우리가 지금 딥러닝에서 만드는 모델을 실제 신경망과 같다고 판단하면 안된다 뭐 이런식의 내용입니다.





그리고 우리는 여태 activation functionssigmoid를 계속 보아왔는데요. 실제로는 이렇게 다양한 활성화 함수가 있습니다. 하이퍼볼릭 탄젠트인 tanh, ReLU, Leaky ReLU, ELU등이 있습니다.




보통은 ReLU를 많이 사용하죠~ 그리고 우리가 앞에서 봤던 이 2-layer3-layer는 서로 fully하게 connected되어 있습니다. 그래서 fully connected라고 하죠. 줄임말로 fc라고도 많이 불립니다.




이렇게 4장을 마쳤습니다. 이제 다음 5장에선 CNN에 대해서 배우겠습니다.

감사합니다.




반응형
그리드형
Comments