Machine Learning

Momentum, AdaGrad, RMSProp, Adam --- NEED TO CHECK

by Minwoo 2019. 9. 18.

Momentum

 

Momentum 은 Gradient descent(이하 GD) 기반의 optimization algorithm 이다. 수식으로 표현하면 아래와 같다.

 

 

L : loss function value

W : weights

η : learning rate

α : 가속도 같은 역할을 하는 hyper parameter, 0.9 등 1 이하의 값을 취함. 자세한 것은 아래에 설명.

 

v 는 일종의 가속도(혹은 속도) 같은 개념으로 생각하는 것이 이해에 더 도움이 될 것 같다. v 의 영향으로 인해 가중치가 감소하던 (혹은 증가하던) 방향으로 더 많이 변화하게 되는 것. 최초의 v 는 0으로 초기화 한다.

 

간단한 예를 이용하여 설명한다.

 

 

첫번째 스텝의 기울기가 5, 두번째 스텝의 기울기가 3인 경우 학습률 η = 0.1 일 때, 두번째 스텝에서 가중치는 -0.3 만큼 변화한다.

 

Momentum 을 적용한 경우는

 

 

일반적인 GD 보다 두번째 스텝에서 -0.45 만큼 가중치가 더 변하는 것을 알 수 있다. 이를 그래프로 간단하게 표현하면

 

GD 를 사용했다면 갔을 거리보다 Momentum 을 사용했을 때 이동하려던 방향으로 스텝을 더 멀리 뻗는다고 이해할 수 있다.(그래프는 구글에 y=x^2를 입력하여 간단하게 그렸으니 그래프의 숫자는 무시하고 형태만 본다.)

 

Momentum 은 아래 그림처럼 빗살무늬 모양 그릇에 공을 굴리면 움직이듯 가중치가 이동하게 된다.

 

 

 

AdaGrad

 

학습률이 너무 작으면 학습 시간이 너무 길고, 너무 크면 발산해서 학습이 제대로 이루어지지 않는다. 이런 문제를 AdaGrad 는 학습률 감소(learning rate decay) 를 통해 해결한다.

 

 

연산기호 ⊙ 는 element wise multiplecation 이다(한국말로는 행렬의 원소별 곱셈). h 에 이전 기울기의 제곱들이 누적되어 더해지게 되는데, parameter 를 업데이트 할때, 1/√를 통해 학습률을 조정하게 된다. 이를 통해 parameter 중 많이 움직인 element 의 학습률이 낮아지는 효과를 만든다. 즉, 학습률의 감소가 element 마다 다르게 적용됨을 의미한다.

 

AdaGrad 는 무한히 학습을 하다보면 어느 순간 h 가 너무 커져서 학습이 되지 않을 수 있는데, 이 문제는 RMSProp 에서 개선된다


RMSProp

 

이전 AdaGrad 설명에서 언급했듯이 AdaGrad 는 최소값에 도달하기 전에 학습률을 0에 수렴하게 만들 수도 있다. AdaGrad 가 간단한 convex function 에선 잘 동작하지만, 복잡한 다차원 곡면 함수를 (상대적으로)잘 탐색하도록 설계되지 않기도 했고. 기울기의 단순한 누적만으로는 충분하지 않은 셈이다.

 

RMSProp 은 기울기를 단순 누적하지 않고 지수 가중 이동 평균 Exponentially weighted moving average 를 사용하여 최신 기울기들이 더 크게 반영되도록 하였다.

 

 

 

이전 AdaGrad 의 h 에 새로운 hyper parameter ρ 를 추가하였다. 이제 h 가 무한히 커지지 않으면서 ρ 가 작을 수록 가장 최신의 기울기를 더 크게 반영하게 된다.

 

Adam

 

Adam 은 이전 글인 Momentum, AdaGrad 설명에서 언급한 Momentum 과 AdaGrad 를 융합한 방법이다.

 

출처: https://arxiv.org/pdf/1412.6980.pdf

 

이전 글에서 Momentum 은 새로운 계수로 v 를, AdaGrad 는 h 를 추가하여 최적화를 진행하였는데, Adam 은 두 기법에서 v, h 가 각각 최초 0으로 설정되어 학습 초반에 0으로 biased 되는 문제를 해결하기 위해 고안한 방법이다.

 

Adam 의 의사코드를 보면 1차 모멘텀인 m 과 2차 모멘텀인 v 를 이용하여 최적화를 진행하는데, 첫번째 항인 m_1 을 계산하는 과정을 살펴보면 쉽게 이해할 수 있다.

 

 

결론적으로, m_1 = g_1(첫번째 기울기) 이 됨으로써 기존에 m_0 = 0 로 인해서, m_1 = 0.1g_1(∵β_1 = 0.9) 이 되어 0 에 biased 됨이 해결되었다. 

 

두번째 항부터는 뒤로 갈 수록 가장 최신 기울기 한 개가 전체 평균에 10% 정도 영향을 주니 가중이동평균 목적에 부합한다.

 

 

 

알고리즘의 마지막 계산 순서인 위 부분도, v 를 m 으로 나누는 선택을 할 수도 있었는데 그렇게 하지 않은 이유는 m 은 매번 구해지는 기울기에 따라 늘었다 줄었다 하는 값이지만 v 는 제곱이 더해지므로 무조건 커지는 값이기 때문에 학습할때 step 이 너무 크지 않도록 적당히 작은 값을 움직이도록 하기 위해서 m<v 인 조건을 이용한 것으로 이해된다.

 

마지막으로 Optimizer 의 계보(?) 를 설명하는 간단한 그림을 첨부한다.

 

일반적으로 가장 많이 쓰이는 알고리즘이 Adam.

 

 


source:

https://www.slideshare.net/yongho/ss-79607172
https://light-tree.tistory.com/141?category=755497

댓글