Gradiend Descent 로 부터 Adam까지 optimizer 정리
BASE
GD(Gradient Descent)
- 전체 데이터를 관찰하고 파라미터 업데이터(속도 느려, 메모리 잡아먹어)SGD(Stochastic Gradient Descent) - vanila
- Mini batch 적용
- 자주 파라미터 업데이트 되지 속도 빨라 메모리 효율적으로 사용돼
- 하지만 여전히 local minima 에 빠짐
개선 갈래 1 (관성을 이용하자. 직전 step의 변화량을 사용
Momentum
- 관성(탄력)을 이용하는 방법
- "이전에 이렇게 많이 움직였는데... 갑자기 급브레이크를? 자연스럽지 않잖아!" 자연스럽게 바꾸자!
- 이전 스텝에서 계산된 그래디언트를 일정비율로 (현재 스텝의 그래디언트에) 더해줌
- /수식을 보면 저 이전스텝적용 비율대로 step이 진행됨에 따라 decay 되는 것을 확인할 수 있음/
Nesterov Accelerated Gradient (NAG)
- 이전에 계산된 위치에 관성을 먼저 적용시켜불고 거기서 로스를 구해서 그래디언트를 구해부러! (모멘텀 텀은 그대로 존재)
개선 갈래 2 (parameter 마다 step을 다르게 주자..., Adaptive Learning Rate)
- param1은 미니마에 거의 도착했고 param2는 아직 도착 못햇으면 param1는 작은 LR를 적용하고 param2는 큰 LR를 적용해야 하는거 아냐? 라는 생각으로 부터 적용
Adaptive Gradient (Adagrad)
- Learning rate 에 상수가 아닌 분모에 변화를 줘서 파라미터마다 다르게 적용할 수 있도록 함 (상수가 아닌 파라미터갯수만큼의 벡터를 사용)
- Gt 라는 놈에 각 파라미터가 얼마나 많이 변해왔는지를 계산해서 넣어둠 (그 값의 루트값을 분모로 취해줌. 즉, 많이 변한놈은 lr을 작게 만듦)
- (궁금증) 초기값이 애초에 너무 어긋나 있으면...?? 그럼 실제로 열심히 찾아가야 하는데 많이 움직였다고 브레이크를 걸어??? 음...
RMSProp
- Adagrad 에서 분모가 무한발산해서 학습률이 엄청 작아지는 문제를 개선하기 위해 (위에서의 궁금증 부분) 일정 비율로 Gt 값이 업데이트 되도록 개선하였음
- Gt = r*Gt-1 + (1-r)(파라미터미분값제곱합)
AdaDelta
- 얘는... learning_rate의 분자까지 계산식이 들어가는데...(즉 상수인 lr이 사용되지 않음, 그래서 하이퍼파라미터에 없음)
- 근데 생각보다 잘 동작하지 않는다고 함
개선 갈래를 합치차 (Momentum 사용 + Adaptive Learning Rate 사용)
Adaptive Moment Estimation (ADAM)
- Mt, Vt 를 사용해서 계산하는데...
- Mt
- Gradient 에 Momentum을 적용한 항
- Vt
- Gradient 에 Adaptive LR 를 적용한 항 (Gradient 의 제곱을 사용)
- 첫 스텝에 너무 큰 스텝을 밟지 않게 하기 위한 Mt, Vt 를 변경하는 계산을 더해줌
- 최종 수식은 Mt를 모멘텀 적용된 변화량으로 사용, Vt를 Learning Rate 계산용으로 사용하여 최종 업데이트가 진행됨.
TO-DO
- NAdam, RAdam, AdamW 등 더 개선된 놈들이 실제 practical 한 지..의 관점으로 더 살펴보기
Ref