새소식

Interview

SGD, Momentum, RMSprop, Adam에 대해서 아는 대로 설명한다면?

  • -

SGD는 Stochastic Gradient Descent의 약자로 Loss Function의 값을 계산할 때 전체 train set을 사용하는 Batch Gradient Descent와 달리 데이터 한 개 또는 일부 데이터의 모음(mini-batch)에 대해서 loss function을 계산하는 방법입니다.
데이터 한 개를 사용하는 경우를 Stochastic Gradient Descent(SGD)데이터의 일부(mini-batch)를 사용하는 경우를 mini-batch Stochastic Gradient Descent(mini-batch SGD)라고 하지만 오늘날의 딥러닝에서 일반적으로 통용되는 SGD는 mini-batch SGD입니다.

 

SGD는 한 번의 업데이트마다 Batch Gradient Descent처럼 모든 데이터에 대한 계산이 이루어지지는 않기 때문에 Batch Gradient Descent보다 다소 부정확할 수는 있지만

계산 속도가 훨씬 빠르기 때문에 같은 시간에 더 많은 step을 갈 수 있으며 여러 번 반복할 경우 batch의 결과와 유사한 결과로 수렴합니다.
또한, SGD를 사용할 경우 shooting이 일어나기 때문에 Batch Gradient Descent와 달리 local minima에 빠질 위험이 적습니다.

 

그러나 SGD는 비등방성 함수에서는 기울기에 따라 지그재그로 움직여 최적해를 찾는 데 오히려 더 많은 시간이 소요될 수도 있습니다. 또한 고차원으로 갈수록 saddle point에 빠질 수 있는 문제점이 있습니다.


 

Momentum은 기존 weight에 이전의 gradient($v$)도 반영하는 방법입니다.

$\alpha$(모멘텀 계수)는 이전 gradient를 얼마나 고려할 것인지를 의미하고, 일반적으로 0.9, 0.99와 같은 값을 사용합니다. 따라서 local Minimum이나 saddle point에 빠지더라도 '관성'의 영향을 받아 탈출 할 수 있습니다.

 

 


 

 

Momentum은 어느 방향으로 갈지에 대한 방법이라면 Adagrad는 한번에 얼만큼 갈지에 대한 방법입니다. Momentum은 optimum에 가까워져도 learning rate가 늘 일괄적으로 적용되어 지나치게 될 수도 있습니다.

AdagradAdaptive gradient의 약어로 이름에서도 알 수 있듯이 지금까지 많이 변화한 매개변수는 적게 변화하도록, 반대로 적게 변화한 매개변수는 많이 변화하도록 learning late의 값을 조절하는 기법입니다.

current_gradient = evaluate_gradient(x)
grad_squared = grad_squared + current_gradient**2
weight = weight - learning_rate * current_gradient /(np.sqrt(grad_squared) + 1e-8)

 

t time step까지 기울기를 누적한 값 G_t을 계산합니다. 이 값의 제곱근 역수를 t번째 time step에서의 x_t의 학습률에 곱합니다. 이때 G_t가 0인 경우 값이 무한대로 발산할 수 있기 때문에, 이를 방지하기 위해 매우 작은 값(ϵ)을 같이 더해 줍니다.
G_t 값은 점차 커지기 때문에 학습이 오래 진행되면 학습률이 0에 가까워져 더 이상 학습이 진행되지 않을 수 있다는 문제점이 있습니다. 이러한 문제점을 해결하기 위해 RMSprop이 제안되었습니다.

 

 


 

RMSprop는 decay_rate를 적용하여 기존에는 그대로 누적되던 G_t값을 decay하여 G_t 값이 무한정 커지는 것을 방지하기 때문에 오래 학습할 수 있습니다.

current_gradient = evaluate_gradient(x)
grad_squared = decay_rate * grad_squared + (1 - decay_rate) * current_gradient**2
weight = weight - learning_rate * current_gradient /(np.sqrt(grad_squared) + 1e-8)

 

 


 

Adam은  어느 방향으로 갈지에 대한 방법인 Momentum과 한번에 얼만큼 갈지에 대한 방법인 RMSprop의 장점을 결합한 기법입니다.

β_1은 Momentum의 지수이동평균값이고 β_2는 RMSprop의 지수이동평균으로 오래전 time step의 값은 적게 반영하고 최근 step의 값을 많이 반영하기 위해 사용된 값입니다. 각각의 값들을 이용해 모멘텀 항과 RMSprop 항을 계산합니다.

$\hat{m}_{t}$와 $\hat{g}_{t}$는 학습 초기에는 $m_t-1$과 $g_t-1$ 값이 0이고 (1−β1)∇f(xt−1)과 (1−β2)(∇f(xt−1))2이 너무 작기 때문에 0에 수렴하는 것을 방지하기 위한 보정값입니다. 학습이 계속 진행되다 보면 (1−β1)와 (1−β2)는 거의 1에 가까워지기 때문에, $\hat{m}_{t}$, $\hat{g}_{t}$ 결국 $m_{t}$, $g_{t}$와 같은 값이 됩니다. 

 

first_moment=0
second_moment=0

for t in range(m):
	current_gradient=evaluate_gradient(x)

	first_moment=beta1*first_moment + (1-beta1)*current_gradient # Momentum
	second_moment=beta2*second_moment +(1-beta2)*current_gradient**2 # RMSprop

	unbiased_first=first_moment / (1-beta1**t) # Bias Correction
	unbiased_second=second_moment / (1-beta2**t) # Bias Correction

	weight=weight-learning_rate * unbiased_first / (np.sqrt(unbiased_second)+1e-8)

 


Reference

https://mangkyu.tistory.com/62

https://www.deeplearningbook.org/contents/optimization.html

 

728x90
Contents