처음에 딥러닝을 배울 때, 비슷하게 느껴졌던 두 개념이 optimizer 와 backpropagation 이었다. 두 개념을 명확히 하기 위해 각각 주제를 잡고 순차적으로 정리하고 있다. back propagation은 바로 전 글에 포스팅 하였고, 이번에는 optimizer에 대해 쉽게 풀어서 써보려고 한다.
optimizer 의 기본 원리는 gradient descent를 통해 쉽게 이해할 수 있는데,
이 전에 간단하게 정리해 둔 다음의 주소를 참고해도 좋겠다.
gradient descent (https://velog.io/@heyme/gradient-descent)
내가 느끼기에 optimizer는 loss의 최솟점으로 가기 위한 전략 같은 것이라고 생각한다.
loss function을 이용하여 그 최솟점으로 가는 방법에는 여러 가지가 있고, 그 방법들이
점점 발전하면서 다양한 optimizer가 만들어졌다고 이해하면 쉬울 것이다.
optimizer의 종류는 앞서 이야기한 gradient descent를 시작으로
gradient descent에서 파생된 여러 종류의 optimizer를 소개한다.
gradient descent 에서 모든 데이터를 고려하면 계산량이 많아지고 시간이 오래 걸리니,
그 중 일부만 뽑아서 판단하는 방법
SGD에서 local minima나 plateau로 인한 gradient vanishing 문제를 해결하기 위한 방법.
관성이라는 뜻의 momentum 변수를 이용하여 그 전까지의 진행 방향에 대한 미분값을
일정 비율 반영하여 중간에 기울기가 0에 가까워져도 momentum 값으로 계속 진행한다.
loss의 최솟점을 찾아가는 과정에서 처음에는 그 방향을 따라 성큼 가도 되지만 최솟점에 가까워지면 점차 step을 줄여 더 미세하게 다가가야 한다. 이를 반영한 방법이 adagrad로, 각각의 변수를 갱신할 때마다 lr에 영향을 많이 준 값을 반비례하게 적용하여 다가갈수록
step을 줄여가는 방법이다.
adagrad에도 단점이 있는데 미세하게 학습률을 조절하는 것은 좋으나, 그게 너무 미세해져 학습이 거의 멈춰버린다는 것이다. 이를 보완하기 위한 RMSprop은 지수이동평균값을 적용 하여 학습의 최소 step은 보장할 수 있게 하였다.
가장 많이 쓰이는 adam은 momentum과 RMSprop을 합친 방법으로, 방향을 잡는 momentum과 step size를 조절하는 지수이동평균값을 함께 활용하는 방법이다.
아래는 앞서 소개한 optimizer를 이용하여 실제 최솟점을 찾아가는 과정을 시각화 한 것이다.
출처 : optimizer visualization (https://github.com/ilguyi/optimizers.numpy)