Search
🤖

[DL] Optimizer 간단 정리!

옵티마이저란?

ML과 DL에는 데이터를 통해 학습하며 parameter(weight & bias)를 조정하여 최적화하는 과정을 거친다. 이 과정에서 Optimizer는 모델의 학습 과정을 관리하는 역할을 한다.
깊게 설명하려면 각 Optimizer마다 한 페이지가 필요할 것이다. 그래서 그냥 하나하나 어떤 Optimizer인지 특징 위주로 설명해보고자 한다.

발전 순서?

1.
Gradient Descent
2.
Stochastic Gradient Descent
3.
Momentum
4.
AdaGrad
5.
RMSprop
6.
Adam

1. Gradient Descent

가장 기본적인 Optimizer이다. parameter를 조정하여 loss function을 최소화하는 방향으로 이동하는 방법이다.
아래와 같이 Gradient Descent의 수식을 나타낼 수 있다.
Wt+1=Wtηf(xt)W_{t+1} = W_t - \eta \triangledown f(x_t)
여기서 η\eta는 learning rate로, next step으로 얼마만큼 이동할지를 결정한다. hyperparameter로 원하는 크기로 설정이 가능하다.

2. Stochastic Gradient Descent

Stochastic Gradient Descent는 기존 Gradient Descent가 너무 느리다는 점을 개선한 알고리즘이다. 각 업데이트마다 단 하나 혹은 mini batch만큼의 데이터 샘플을 보고 그 다음 parameter를 결정하는 방법이다.
아래의 그림을 보면 이해가 더 쉬울 듯하다.
기존에는 최적해를 찾기 위해 모든 데이터를 참고하고 가장 최적의 방향으로 이동을 해나갔다면, Stochastic Gradient Descent는 단 몇가지의 데이터 샘플만 보고 이동을 한다. 따라서 각 업데이트마다 최적의 방향으로 이동한다곤 보장하지 못하지만, 여러 번 반복을 거듭하다보면 최적해에 근사하게 된다.
이를 통해 기존의 방식보다 효과적으로 계산 비용을 줄일 수 있게된다. 또한 기존 방식에서 local minimum에 빠질 수 있는 경우에도 소규모 데이터셋의 노이즈로 인해 탈출할 수도 있다.

3. Momentum

Momentum은 기존 Stochastic Gradient Descent 알고리즘을 개선한 알고리즘이다. Stochastic Gradient Descent의 경우에는 단 몇가지의 단서(데이터 샘플)을 보고 이동을 반복하다보니 관점에 따라 극단적인 느낌이 들 수 있다. (업데이트를 너무 성의없게 한다…?)
그래서 Momentum은 이전 업데이트 방향과 크기를 누적한다. 그리고 그 다음 parameter 업데이트에 반영하는 방식이다. 번역 그대로, 이전 이동 방향과 크기에 대해서 관성을 가진다는 의미로 생각하면 된다.
Momentum의 수식은 아래와 같다.
vt+1=βvt+(1β)f(xt)v_{t+1}=\beta v_t+(1-\beta)\triangledown f(x_t)
Wt+1=Wtηvt+1W_{t+1}=W_t-\eta v_{t+1}
여기서 vtv_t는 이전 업데이트의 모멘텀 벡터이고, β\beta는 모멘텀의 hyperparameter이다.

4. AdaGrad

각 Parameter마다 개별적인 learning rate를 사용하는 Optimizer이다. 많이 업데이트된 parameter는 learning rate가 감소하고, 적게 업데이트된 parameter는 learning rate가 증가하여 더 민감하게 업데이트된다.
AdaGrad의 수식은 아래와 같다.
gt+1=gt+(f(xt))2g_{t+1} = g_t+(\triangledown f(x_t))^2
Wt+1=Wtηgt+1+ϵf(xt)W_{t+1}=W_t - \frac{\eta}{\sqrt{g_{t+1}+\epsilon}} \triangledown f(x_t)
여기서 gtg_t는 지금까지의 gradient 제곱의 누적값, ϵ\epsilon은 안정적으로 나눠지게하는 상수이다.
하지만 AdaGrad의 단점으로는 학습이 진행될 수록 learning rate가 너무 작아져 학습속도가 느려질 수 있다.

5. RMSprop

RMSprop은 AdaGrad를 보완하기 위해 나온 알고리즘이다. 업데이트의 누적 제곱값에 대해 지수이동평균을 사용하여 learning rate를 조절한다.
따라서 과거 업데이트들의 영향을 서서히 감소시키면서 빠르게 수렴시킬 수 있다는 특징이 있다.
RMSprop의 수식은 아래와 같다.
gt+1=βgt+(1β)(f(xt))2g_{t+1} = \beta g_t+(1-\beta)(\triangledown f(x_t))^2
Wt+1=Wtηgt+1+ϵf(xt)W_{t+1}=W_t - \frac{\eta}{\sqrt{g_{t+1}+\epsilon}} \triangledown f(x_t)
Adagrad에 비해 β\beta 라는 weight decay hyperparameter가 들어가서 과거 업데이트 영향을 서서히 감소시킬 수 있게 된다.

6. Adam

딥러닝 공부하다보면, ‘모름지기 Adam쓰면 성능이 좋다.’ 라는 말을 듣기도 한다. 그런데 진짜 그렇다.
Adam은 Momentum과 RMSprop의 아이디어를 결합한 것이다.
Adam의 수식은 아래와 같다.
mt+1=β1mt+(1β1)f(xt)m_{t+1}=\beta_1 m_t+(1-\beta_1)\triangledown f(x_t)
vt+1=β2vt+(1β2)(f(xt))2v_{t+1} = \beta_2v_t+(1-\beta_2)(\triangledown f(x_t))^2
m^t+1=mt+11β1t+1\hat m_{t+1} = \frac{m_{t+1}}{1-\beta^{t+1}_1}
v^t+1=vt+11β2t+1\hat v_{t+1} = \frac{v_{t+1}}{1-\beta^{t+1}_2}
Wt+1=Wtηv^t+1+ϵm^t+1W_{t+1} = W_t - \frac{\eta}{\sqrt{\hat v_{t+1}}+\epsilon}\hat m_{t+1}
여기서 mtm_t는 1차 모멘트 추정값, vtv_t는 2차 모멘트 추정값이다.
그리고 β1\beta_1, β2\beta_2는 각각의 hpyerparameter이다.
정리하자면, 1,2차 모멘트를 계산한 뒤 보정된 모멘트를 다시 계산하고, 그것들을 통해 parameter를 업데이트 한다.
기능적으로 보자면, 1차 모멘트는 gradient의 방향, 2차 모멘트는 gradient의 크기를 조절하는 기능을 한다.

정리

한 장으로 요약하자면 아래와 같다.(몇 가지 알고리즘은 설명에서 제외했다.)

Reference