Optimizer
- 딥러닝에서 학습속도를 빠르고 안정적이게 하기 위해 손실 함수를 최소화하는 최적의 가중치를 업데이트 하는 방법이다.
- Gradient Descent 시 local optima에 빠지게 되는 문제를 방지하기 위한 여러가지 방법 중 하나이다.
- Hyper parameter 최적화에서 얼마나 진행할지 결정하는 Epoch, 내부 뉴런 수, 일정한 데이터를 버려서 과적합을 막아주는 Dropout 등등 많은 파라미터를 조정하지만 그 중 가장 드라마틱하고 쉽게 바꿔주는 것이다.
- Keras Optimizers Docs 바로가기
종류
SGD(Stochastic Gradient Descent)
\[\theta_{t+1} = \theta_t - \eta\nabla_{\theta}J(\theta ; x^{(i)},y^{(i)})\]- 한 번의 파라미터 업데이트를 위해 하나의 훈련 데이터를 사용한다
- 따라서 SGD는 batch gradient보다 빠르게 업데이트된다는 장점이 있다.
- Batch Gradient: 기본적인 Gradient descent(데이터 전체를 의미)
- 하지만 목적함수의 Gradient가 하나의 데이터에 의해 결정되다보니 매 업데이트마다 들쭉날쭉한 크기의 Gradient로 파라미터를 업데이트하게 된다.
- 분산이 큰 Gradient는 SGD가 Local minimum에서 빠져나오게 만들 수도 있지만, 수렴을 방해할 수도 있다.
Momentum
\[\theta_{t+1} = \theta_t - v_t\]- 직역하면 관성으로써 SGD에서 관성을 더하는 방법이다.
- 현재 파라미터를 업데이트해줄 때 이전 Gradient도 계산해 포함시켜 주면서 이 문제를 해결한다.
- 예를 들어 SGD를 미끄럼틀이라고 생각하면, Gradient가 극단적으로 0인 평평한 밑면을 만났다해도 빗면의 Gradient가 남아있어 쭉 갈수 있게 만들어준다.
- 만약 모든 Gradient를 모두 고려해준다면 아주 긴 평평한 땅에서도 SGD는 멈추지 않을 것이다.
- 그래서 이전 Gradient의 영향력을 매 업데이트마다 $\gamma$배 씩 감소시킨다.
- $\gamma$값은 주로 0.9를 사용한다.
NAG(Nesterov Accelerated Gradint)
\[v_t = \gamma v_{t-1} + \eta \nabla_{\theta_t}(\theta_t - \gamma v_{t-1})\] \[\theta_{t+1} = \theta_t - v_t\]- 앞을 미리 보고 현재의 관성을 조절하여 업데이트 크기를 바꾸는 방식이다.
- SGD가 관성에 의해 수렴 지점에서 요동치는 것을 방지해준다.
Adagrad
\[\theta_{t+1, i} = \theta_{t,i} - \frac{\eta}{\sqrt{G_{t,ii} + \epsilon}}g_{t,i}\]- 위 세가지의 공통점은 모든 파라미터에 대해 같은 learning rate를 적용하여 업데이트를 한다는 점이다.
- 문제점: 각 파라미터의 업데이트 빈도 수에 따라 업데이트 크기를 다르게 해줘야 하는데, 앞의 세가지 방법은 이를 반영하지 못한다.
- 이름의 Ada라는 단어는 Adaptive(상황에 맞게 변화하는)의 준말이다.
- (어뎁티브 그레드 메서드라고 부르는게 더 있어 보인다.)
- 파라미터마다 지금까지 얼마나 업데이트 됐는 지 알기 위해 Adagrad는 parameter의 이전 Gradient를 저장함으로 앞의 문제점을 해결한다.
- 하지만 $t$가 증가하면서 $G_{t, ii}$ 값이 점점 커지게 되어 learning rate가 점점 소실되는 문제점이 있다.
Adadelta, RMSprop
- Adagrad의 learning rate가 점점 소실되는 문제점을 해결하려는 방식이다.
- Adadelta
- RMSprop
Adam(Adaptive Moment Estimation)
\[\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v_t}}+\epsilon}\hat{m_t}\]- Adagrad, Adadelta, RMSprop 처럼 각 파라미터마다 다른 크기의 업데이트를 적용하는 방법이다.
- Adadelta에서 사용한 decaying average of squared gradients 뿐만 아니라. decaying average of gradients를 사용한다.
AdaMax
\[\theta_{t+1} = \theta_t - \frac{\eta}{u_t}\hat{m_t}\]- Adam의 $v_t$ 텀에 다른 norm을 사용한 방법
NAdam(Nesterov-accelerated Adaptive Memoment Adam)
\[\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v_t}}+\epsilon}(\beta_1\hat{m}_{t} + \frac{(1-\beta_1)g_t}{1-\beta_1^t})\]- NAG와 Adam을 섞은 방법이다.
결론
- SGD부터 NAdam까지 모든 알고리즘을 살펴보았는데, 각 알고리즘은 이전 알고리즘의 한계점을 보완해가며 발전해갔다.
- SGD는 업데이트 한 번에 데이터 하나를 사용하여 Batch GD의 시간 문제를 해결했다.
- Momentum은 SGD의 작은 gradient 때문에 작은 언덕이나 saddle point를 빠져나가지 못하는 것을 momentum을 도입하여 해결했다.
- NAG는 다음 step의 gradient를 먼저 살펴보고 Momentum을 조절하여 minimum에 안정적으로 들어갈 수 있게 했다.
- Adagrad는 업데이트 빈도가 다른 파라미터에 대해서도 같은 비율로 업데이트하는 것을 이전 gradient들의 합을 기억함으로써 문제를 해결하였다.
- RMSProp과 Adadelta는 Adagrad의 learning rate가 점점 소실되는 것을 gradient의 2차 모먼트를 통해 보완했다.
- Adam은 RMSProp에 1차 모먼트를 도입하여 RMSProp과 Momentum을 합친 효과를 볼 수 있었다.
- AdaMax는 Adam의 2차 모먼트에 있는 gradient의 norm을 max norm으로 바꿔주었다.
- 마지막으로 NAdam은 ADAM에 NAG를 더해주어서 momentum을 보완해주었다.
- 모르겠으면 Adam!