2024. 4. 12. 03:10ㆍ머신러닝&딥러닝/인공신경망 기초
옵티마이저(optimizer)란?
옵티마이저 = loss의 최솟값을 찾는 최적화 알고리즘
머신러닝의 목적은 데이터의 학습을 통해 loss 값을 줄여 작업의 정확도를 올리는 것이다. 앞선 포스팅에서, Gradient Descent라는 알고리즘으로 loss의 최솟값을 찾아나가는 방법을 설명했다. 그러나, 단순한 Gradient Descent는 learning rate의 크기나 가속 알고리즘의 유무 등에 따라 수렴하지 않는 경우도 존재했으며, local minimum에 빠지는 경우도 있었다. https://cascade.tistory.com/36
Gradient descent & Backpropagation (Rumelhart 1986 논문 리뷰)
딥러닝 분야에는 다양한 아키텍처가 있다. CNN, RNN, Transformer 등으로 계보를 잇는 아키텍처들은 새로운 optimization 알고리즘이나 원리를 추가하면서 발전하지만, 모두 기본적인 학습 방식은 비슷하
cascade.tistory.com
머신러닝이 발전함에 따라 gradient descent 알고리즘이 개선되어 어떻게 하면 최선의 방법으로 global minimum을 찾을지에 대한 연구가 많이 이루어졌다. 이러한 최적화 알고리즘이 옵티마이저(optimizer)이다.
옵티마이저의 종류
옵티마이저 알고리즘은 Gradient Descent에서 파생되어, 아래와 같은 종류가 있다.
SGD(Stochastic Gradient Descent)
Gradient Descent는 원래 전체 데이터셋(batch)에 대해 계산된 loss function에 적용되는 알고리즘이다. 하지만, 전체 데이터셋의 크기가 매우 클 경우 loss function을 매번 계산하는 것이 비효율적이다. 따라서, SGD에서는 전체 데이터셋(batch)을 작은 데이터셋(minibatch) 여러 개로 쪼개 생각한다. 그리고 각 데이터셋에 대해 loss function을 계산한다. Batch에 대해 계산하는 방식을 BGD(Batch Gradient Descent), minibatch에 대해 계산하는 방식을 SGD(Stochastic Gradient Descent)라고 한다.
BGD로 loss를 계산할 경우, 하나의 step당 계산량이 매우 크다. 또한, 일방향으로 나아가기 때문에 local minimum에 빠질 위험이 더 크다. 반면, SGD로 loss를 계산하면, 더 많은 step을 거쳐야 하지만 step 당 필요한 계산량이 매우 작고, local minimum에 빠질 위험이 더 적다.
Momentum
Momentum은 SGD에 관성을 적용한 것이다. 아래와 같은 SGD의 식에서, learning rate값은 학습이 끝날 때까지 변하지 않는다. 따라서, gradient 값이 똑같다면 업데이트되는 가중치의 크기도 항상 같다. 또한 saddle point 처럼 gradient가 0인 곳에서는 학습이 되지 않는다.
Momentum 에서는 아래와 같이 관성의 개념을 적용하였다. 다음 Step이 momentum에 의한 항과 gradient에 의한 항의 벡터합으로 표현되는 것이다. 즉, 가중치가 업데이트되는 정도가 gradient에만 의존하는 것이 아니라, 이전의 상태에도 의존한다. 이렇게 되면 gradient가 0인 곳에서도 학습이 가능하며 학습 속도를 SGD보다 빠르게 할 수 있다.
NAG(Nesterov Accelerated Gradient)
NAG는 Momentum 방식의 업그레이드 버전이다. gradient step을 "lookahead" gradient 로 바꾼 것인데, 이는 Momentum 방식이 관성에 의해 global minimum을 지나치는 것을 방지한다. 즉, step 이전의 gradient를 업데이트에 이용하는 것이 아니라, 이동 후의 gradient를 예상해 사용하는 것이다.
Adagrad (Adaptive Gradient)
기존의 optimizer들은 모델의 파라미터 전체를 한 번에 업데이트했다. 이는 개별 파라미터를 한 번에 움직여야 하는데, Adagrad는 변화량이 컸던 파라미터는 변화량을 줄이고, 변화량이 작았던 파라미터는 변화량을 늘리는 방식을 사용한다. 단점은 global minimum에 도달하지 않은 채 변화량이 너무 적어져 학습이 매우 느려질 수 있다는 것이다.
AdaDelta, RMSprop
AdaDelta와 RMSprop은 위에서 언급한 Adagrad의 단점을 보완하기 위해 만들어졌다. 과거의 모든 gradient를 누적하는 Adagrad와 달리, AdaDelta는 최근의 gradient에 더 큰 가중치를 주기 위해, 최근 gradient를 제곱하여 누적시킨다.
RMSprop은 이름 그대로 RMS(Root Mean Square)를 이용한다. AdaDelta와 마찬가지로 최근 gradient에 더 큰 가중치를 두며, 이를 위해 EMA(Exponential Moving Average, 지수이동평균)을 사용한다. RMSprop은 non-convex optimization에서 특히 좋은 성능을 보인다.
Adam (Adaptive Moment Estimation), Nadam
Adam은 RMSProp와 Momentum을 합친 방식이다. RMSProp은 파라미터의 learning rate를 동적으로 조정하는 방법이었고, Momentum은 관성을 주어 과거의 이동 방향을 고려하도록 하는 방식이었다. Adam에서는 과거 gradient의 지수 가중 평균(1st moment)과 제곱의 지수 가중 평균(2nd moment)을 각각 계산하여, momentum과 RMSprop을 결합한다.
Adam은 D.P. Kingma (VAE를 만드신 그 분 맞다)에 의해 2014년 개발된 알고리즘이며(논문 첨부), 현재 딥러닝 분야에서 가장 널리 사용되는 옵티마이저이다.
Adam을 사용하면, 사용자가 learning rate나 momentum 등 optimization 을 위한 값들을 조정하지 않아도 기본값만으로 좋은 성능을 보인다. pytorch 등 각종 라이브러리에서 지원하니 많이 이용하도록 하자.
Nadam은 Adam의 장점에 더하여 첫 번째 모멘트 업데이트에 Nesterov momentum을 적용한 것이다.
'머신러닝&딥러닝 > 인공신경망 기초' 카테고리의 다른 글
L2 regularization과 weight decay (0) | 2024.08.19 |
---|---|
Gradient descent & Backpropagation (Rumelhart 1986 논문 리뷰) (2) | 2024.02.20 |
Perceptron Convergence Theorem과 그 증명 (1) | 2024.02.19 |