안녕하세요~


지금까지는 DNN의 일반화성능에 초점을 맞추고 설명했어요. Batch normalization하는 것도 overfitting을 막기 위해서이고, Cross validation, L1,L2 regularization 하는 이유도 모두 overfitting의 문제를 피하기 위해서에요.


그런데 이번에는 조금 다른 관점에서 DNN모델이 학습하는 목적을 살펴볼거에요. 


먼저우리가 DNN 모델이 학습하는 목적이 cost function에서 제일 적은 cost(error)값을 찾는게 중요하다고 말씀드렸어요. 그리고 아래의 사진에서와 같은 함수가 있을 경우 미분값이 0인 곳을 찾으면 최저 cost 값을 찾을 수 있게 됩니다.


<사진1>

그런데 문제는 9장 mini-batch에서 언급했듯이 DNN은 다양한 문제공간을 갖고 있다는 점이에요. 예를 들어, 어떤 문제는 좌측사진과 같이 굉장히 간단한 문제공간을 갖을 수 있고, 어떤 문제는 오른쪽과 같이 복잡한 문제공간으로 이루어져있어요.


                     

<사진2>                                                       <사진3>



간단한 문제공간에서 최적의 cost값을 찾는건 문제가 되지 않겠지만, 복잡한 문제공간에서는 local minimum에 빠지는 경우가 굉장히 많을거에요.


<사진4>


또 다른 문제로는 plateau에 빠지는 경우에요. plateau에 빠지게 되면 학습이 굉장히 더디게 되거나 더 이상 학습이 진행이 안될 가능성도 높겠죠?


<사진5>



그래서 우리는 이러한 local mimum와 plateau에 빠지는 경우에 대한 해결책을 갖고 있어야 하는데, 이러한 문제에 직면할 때마다 상황에 맞게 극복하고자 나온 개념들이 optimizer에요.


Optimizer의 발전역사를 보면아래와 같아요. Optimizer에는 크게 momentum 방식과 adaptive(adagrad) 방식으로 나뉘어져서 발전해왔어요. 그리고 현재 Momentum, RMSProp, Adam이라는 optimizer를 주로 사용하고 있기 때문에 위의 3가지 optimizer를 이해하기 위한 개념들을 설명하도록 할게요.



<사진6>


[Momentum 방식]


<1. Momentum>


모멘텀은 물리개념이에요. 물리개념에서 질량과 속도의 곱으로 나타내는데, DNN 모델에서는 질량이란 개념을 도입하지 않으니 속도와 관련된 개념이라고 생각하시면 될거에요.


일반적으로 SGD (Stochastic Gradient Descent) 방식으로 학습하게되면 아래와 같은 문제가 생긴다고 했죠? 이러한 문제를 해결하고자 나온 방식이 momentum이라는 개념을 도입한거에요. Momentum 방식은 가속도라는 개념을 이용해 아래와 같은 문제를 해결하려고 했어요.




기존 SGD 방식에 momentum이라는 개념을 도입한 것을 momentum optimizer라고 하는데, 아래 수식을 보면 x는 가중치값, v는 가속도를 의미해요. 즉, 이전의 기울기값에 이전 가속도를 추가하여 현재 가중치 값을 업데이트하면서 local minimum, plateau를 피하려고 하는 방법이에요. 쉽게 말하자면 관성의 법칙을 이용한건데 자세한건 아래 '사진8'에서 더 자세히 설명할게요.



<SGD 수식>


<Momentum 수식>


관성이라는 개념이 통용되는 이유는 기울기값이 지속적으로 누적되기 때문이에요. cost function에서 기울기가 지속적으로 음수가 나온다면 가속도는 계속 붙어있는상태겠죠?



<사진7>



Momentum 방식을 이용하면 SGD의 3가지 문제를 해결할 수 있어요.

- SGD 가중치 업데이트보다 더 빠른 속도로 업데이트

- SGD 만으로는 plateau 부분에서 학습속도가 느려졌지만, 가속도를 추가해주면서 plateau 구간에서도 느려지지 않고 일정한 속도로 학습하는것이 가능

- 이전 가속도로 인해 local minimum 구간을 빠져나가는것도 가능 


아래 그림을 자세히보면 롤러스케이트를 타는 사람이 산을 탄다고 생각해볼 수 있어요. 이전 구간이 가파를수록 가속도는 높아지고 local optimum에 해당하는 부분에서는 이전 가속도에 의한 관성의 법칙때문에 멈출 수 없게 되는거에요.

<사진8>

하지만 위에 사진을 보시면 아시겠지만, global optimum에 해당하는 위치에 도달하고서도 지속적으로 이가속도 때문에 위치를 벗어나는 경우가생겨요. 그래서 이전 가중치에 대한 비율을 조금 줄이고자 나온 개념이 Nestreov Momentum입니다.

(Nestreov Momentum에 대한 설명은 여기 링크를 참고해주세요!)






[Adaptive 방식]


<1. AdaGrad>


앞서 normalization 파트에서 언급했듯이 w1, w2의 범위가 다르면 왜 지그재그 현상이 일어난다고 설명드렸습니다. 



Ada(ptive) Grad(ient) 방식인 Adagrad는 각각의 가중치 (ex: w1, w2)가 업데이트되는 정도에 따라서  위와 같은 지그재그 현상을 피하게 됩니다. 아래 수식을 두 파트로 나누어 살펴보면서 좀 더 자세히 이해해보도록 할게요.


- 첫 번째 수식, G라고 되어있는 수식을 보면 당연히 가중치의 기울기가 클 수록 G값도 커질거에요. 즉, 업데이트가 많이 되어야 될거 같다고 생각이 들면 값이 커지는거죠. G(t-1)라는 수식은 't-1번째 G'라는 뜻인데, 이부분을 통해서 이전까지 가중치 업데이트의 정도를 보는거에요. G(t-1)이 높다는건 이전의 cost function의 기울기가 크다는 뜻이고 이것은 가중치의 업데이트가 크게 일어났다는 뜻이되요.

- 두 번째 수식, 가중치가 업데이트 될때 G가 분모에 위치하고 있기 때문에 G값이 커질수록 가중치 업데이트가작아져요 (왜냐하면 그만큼 step size(learning rate/루트(G(t)+입실론))이 줄어들것이기 때문이죠). 분모의 입실론은 batch normalization에 설명드린것 처럼 분모를 0으로 나누는 것을 방지하기 위함이에요. 

  

<사진9>


위에서 한 말을 바꿔말하면 업데이트가 크게 될 것 같은 가중치에 대해서는 페널티를 주어 업데이트를 적게 하려고 하고 있어요 (앞서 배운 regularization을 적용하려던 철학과 비슷해보이기는 하네요). 다시 아래그림을 보면 cost function의 기울기가 클때나 작을때나 똑같이 학습을 시키는 것이 아니고, cost function이 크다고 생각하면 업데이트를 조금 줄이고, cost function의 기울기가 작다고 생각한다면 좀더 빠르게 업데이트를 할 수 있도록 도와주는 모양새가됩니다.



짧게 정리해서 말씀드리면, '지금까지 업데이트의 폭이 큰 가중치들의 step size를 작게한다'라고 할 수 있겠어요. 


하지만 AdaGrad에도 문제점이 있어요. 바로 수식에서 보여지는 제곱에 대한 식인데, 제곱이라는 성질이 값을 굉장히 크게 만들거나 작게 만들 수 있어요. 만약 학습이 계속 진행되다가 제곱값이 엄청 커져버리면 나중에는 step size가 굉장히 줄어들게 될거에요. 그래서 이를 보완하고자 RMSProp optimizer가 나타나게 됩니다.


<2.RMSProp>


AdaGrad의 수식과 가장큰 차이는 감마(r)의 여부라고 볼 수 있겠죠? 첫 번째 수식에서 왼쪽 부분인 G(t-1)라는것이 이전 cost function의 기울기(=가중치 업데이트 정도)를 의미하고, 오른쪽 부분은 최근(현재) cost function의 기울기(=가중치 업데이트 정도)를 의미합니다. 


AdaGrad에서 이전까지 가중치 업데이트 정도가 매우커서 G의 값이 커질때, step size(or learning rate)가 매우 작아져 학습이 불가능해지는(=가중치 업데이트가 안되는) 상황이 발생된다고 했죠? 그래서 RMSProp에서는 감마를 통해 G에 대한 비중을 조절해주고 있어요. 기울기제곱에 대한 지수평균을 구하는 것이라고 할 수 있어요 (지수평균이라는 개념은 보통 최근에 일어난 사례에 더 가중치를 준다는 개념이에요) (물론 최근 기울기가 엄청 크게 안온다고는 하지만 보통 누적된 기울기 값인 G(t-1)보다 크게 나오진 않겠죠? 왜냐하면 기울기 제곱의 값은 항상 양수니까요!) 


   

<사진10>





[Momentum 방식 + RMSProp(Adaptive) 방식]


<1. Adam(Adaptive Momentum)>


Moment와 RMSProp 수식을 다시한번 복기해볼게요. Momentum 수식은 기울기의 누적값을 이용하는 것이고, RMSProp는 이전 기울기값의 제곱의 지수평균을 구하는 것이라고 했어요.


                                  


<Momentum 수식>                                        <RMSProp 수식>      



아래 수식을 보시면 감이 오시나요? m이라고 되어있는 부분은 moment의 v가 지수평균화 된것이라고 보고, v라고 되어있는 부분은 RMSProp의 G라고 볼 수 있어요.  


             

           <Adam 수식 part1>


그렇다면 오른쪽의 수식은 무엇을 의미할까요? m0이라는건 관성이 없는거에요. 그렇게 때문에 m1은 최근 기울기 값인 g1과 동일해야해요. 그런데 우리는 베타값을 보통 상수로 정하기 때문에 m1과 g1이 같지가 않아요. 하지만 m의 수식을 위의 수식의 오른쪽 부분처럼 수정하면 문제없이 m1=g1으로 만들어 줄 수 있어요.



또한 베타를 0.9라고 설정하면 최근 기울기를 10% 반영하겠다는 의미에요. m1에 대한 수식이 수정이되도 여전히 g2가 전체 비율의 10%만 차지하는것처럼 보이네요. 



아래우측 수식의 맨마지막이 최종적인 Adam 수식이에요. 먼저 vt를 분모로 mt를 분자로 이용한 이유는 vt는 무조건 양수가 나오고, mt는 음수가 나올 수 있기 때문인거 같아요 (분모에 해당하는 루트값에 음수가 들어가면 안되니까요~). 어떻게 보면 RMSProp 수식의 기울기 부분에 momentum을 적용했다고 볼 수 있겠네요!

                       

<Adam 수식>                                            <RMSProp 수식>





[정리]


지금까지 optimizer를 알아보았어요. DNN의 목적이 어쨌든 cost function의 최저값을 찾는 것이에요. 하지만 cost function이 simple하게 생긴것이 아니고 굉장 complex하게 생긴경우가 많기 때문에 앞서 언급한 plateau, local minimum 등과같이 예상치 못한 난관에 부딪힐 수 있어요.


그래서 이러한 문제들을 해결하기 위해 상황에 맞게 대처하는 최적화(optimization)과정이 반드시 필요하게 된답니다~!




     



다음글에서는 가중치 초기값과 하이퍼파라미터에 대한 설명을 간단히 하도록할게요~


 


[글 래퍼런스]

https://nittaku.tistory.com/271

http://shuuki4.github.io/deep%20learning/2016/05/20/Gradient-Descent-Algorithm-Overview.html

https://light-tree.tistory.com/141?category=755497


[사진 래퍼런스]

사진1

http://physics2.mju.ac.kr/juhapruwp/?p=1610

사진2,3

https://arxiv.org/pdf/1712.09913.pdf

사진4

https://hwiyong.tistory.com/9

사진5,7,8

https://sacko.tistory.com/38

사진6

https://gomguard.tistory.com/187

사진9

http://shuuki4.github.io/deep%20learning/2016/05/20/Gradient-Descent-Algorithm-Overview.html

+ Recent posts