Machine Learning

Adam Optimization에 대한 설명

jinmc 2022. 2. 24. 10:30
반응형

Adam Optimization은 2014년에 발표된 논문에서 잘 설명되어 있습니다.

https://arxiv.org/abs/1412.6980 

 

저는 Yolov5를 이용하면서 학습을 하며, SGD보다 Adam이 더 효율적이라는 것을 확인하였고, 

Warmup Epoch과도 잘 맞는것을 확인하였습니다.

Adam Optimization의 기본 pseudo code는 다음과 같습니다.

 

다음을 설명하기 위해서는, Momentum, exponentionally weighted averages, RMS Props 등을 알면 훨씬 더 쉽게 

설명될 수 있을것 같습니다. 이 이외에도 NAG, Adagrad, AdaDelta, 

 

많은 설명은 Coursera의 Deep Learning Specialization 의 세 번째 코스인,

Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization 에서 가져왔습니다.


Exponentionally weighted averages

Andrew 선생님이 Exponentially weighted averages를 설명한 방법입니다.

베타값을 0.9, 0.98, 0.5로 각각 지정하고, Vt값을 구했습니다.

빨간 선, 초록 선은 각각 0.9, 0.98 을 기준으로 Vt값을 구한 그림입니다.

Andrew 선생님의 설명에 의하면, 다소 무분별하게 분포되어 있는 점들을,

exponentially weighted average를 함으로 인해서, 0.9를 parameter로 적용하는 경우 10으로 나눈 평균값이 되는 효과가 있다고 합니다. (이 예시에서는 런던의 날씨를 예로 들었습니다.)

exponentially weighted average를 사용함으로써, smoothing을 하는 효과가 있고, 다음 momentum에서도 이 효과를 적용한다고 합니다. 가까이 있는 값은 1/10 정도가 들어가고, 그 전값은 1/10의 0.9만큼이 들어가고, 결국 아주 전의 데이터도 들어가는 방법이죠.

하지만 주의할 점 하나는, Bias Correction인데, 처음 10개의 값이 적립되기 전에는 값이 매우 낮을 수밖에 없기 때문에, 

Vt를 구해주는 대신, Vt / (1 - Beta(t)) 를  사용해 준다고 합니다.


Gradient Descent with Momentum

위에서 살펴봤던 exponentially weighted average 를 사용해서 W and B ( Weight and Bias, 가중치와 편향 ) 을 구해봅시다.

Andrew옹은, 마치 이렇게 설명했습니다. Vdw를 구하는 건, exponentially weighted average을 구해서 그쪽 방향으로 더 가중치를 주는 방법이기 때문에, 마치 두레박 안에 쇠구슬이 굴러가듯, 가속도가 붙는다고 생각하면 된다고 합니다.


RmsProps 

 

RMSprops도 momentum과 비슷하지만, 다른 방식이라고 생각하면 될 듯 합니다.

Momentum에서는 평균값을 이용했다면, RMS prop은 Root Mean Square의 준말로, 

미분값의 제곱근값으로 나눠줌으로 인해 폭이 큰 쪽은 줄이고, 폭이 작은 쪽은 늘리는 방향으로 바꿔줍니다.

또한, 엡실론 값을 도입해서 Sdw나 Sdb가 0이 되지 않도록 합니다.

엡실론 값은 보통 아주 작은 값으로 합니다. (10^-8 등)

 


Adam Optimization

 Adam 의 경우, 한 마디로 RMSprop과 Momentum을 합친 방법이라고 생각하면 될 것 같습니다.

Vdw, Vdb 와, Sdw, Sdb를 같이 계산해서 각각의 Back Propagation을 하는 경우라고 생각하면 될 것 같습니다.

(1-Beta ^ t) 을 해 줌으로써 Bias Correction도 해 주는것을 볼 수 있습니다.

 

이로써 Adam optimization에 대해서 이해 할 수 있게 되었습니다.

그리고 여기 들어가는 변수로 Beta1(Momentum), Beta2(RmsProp), Epsilon(0이 안되게 하는 작은값)을 설정해 줄 수 있겠죠.

보통 많이 쓰이는 값으로 

Beta1 = 0.9, Beta2 = 0.999, Epsilon = 10^−8

로 많이 사용한다고 합니다.

 

현재까지 가장 많이 쓰이고 또 효과가 좋은게 ADam 이라고 하는데, ADam 이 어떻게 나온 알고리즘인지 살펴보았습니다.

다음은 널리 알려져 있다는 짤입니다.

물론 다 알고 있다면 좋겠지만, 그렇지 못하는 경우에는 Adam 을 쓰는게 좋아 보입니다.

단, 그 원리와 하이퍼파라미터를 잘 적용하는게 중요할 것이라고 생각합니다.

 

 

ref : https://dbstndi6316.tistory.com/297#:~:text=Adam%20(Adaptive%20Moment%20Estimation)&text=%ED%98%84%EC%9E%AC%20%EA%B0%80%EC%9E%A5%20%EB%A7%8E%EC%9D%B4%20%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94,%ED%95%98%EB%8B%A4%EA%B3%A0%EB%8F%84%20%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%8B%A4.

반응형