본문 바로가기

딥러닝 & 머신러닝/딥러닝 지식

최적화 알고리즘(옵티마이저, Optimizer) 설명

# 최적화 알고리즘(옵티마이저)들인 SGD, RMSProp, AdaGrad, Adam에 대해 설명한다면?

 

*최적화 알고리즘(옵티마이저): GD를 기본으로 하여 loss function이 최소가 되는 지점, 즉 최적의 가중치를 찾는 방법

 

- SGD (Stochastic Gradient Descent)

그냥 Gradient Descent(GD)는 loss function을 계산할 때 전체 Training 데이터셋을 사용한다. 즉, full batch를 사용하게 되는데, 이때 GD를 통해 loss functuon의 최솟값을 정확히 찾아갈지는 몰라도 계산량이 너무 많아지기 때문에 최솟값을 찾아가는 속도가 너무 느리다. "GD: 모든 데이터를 검토한 뒤 방향을 찾자"

 

그래서 전체 데이터를 전부 보고 한 발짝씩 걷는 것보다, 조금 헤멜 수 있더라도 전체 데이터의 일부(mini batch)만 보고 loss function 값을 계산해 빠르게 loss function의 최솟값을 찾아나가는 방법이 SGD다. 다소 부정확할 수 있지만, 훨씬 계산 속도가 빨라 같은 시간에 더 많은 step을 갈 수 있고, 여러 번 반복할 경우 보통 batch의 결과와 유사하게 수렴한다. Stochastic이라는 건 전체 Training 데이터 셋에서 '랜덤 샘플링'해서 mini batch를 만든다는 뜻.

"SGD: 조금씩 데이터를 검토한 뒤 자주 방향을 찾자"

 

# mini batch를 작게 할 때의 장단점은?

 

~ 장점: 전체 데이터를 쪼개서 여러 번 학습하기 때문에, 전체 Training 데이터 셋을 배치로 사용하는 것보다 계산량이 적어(즉 메모리 사용량이 적어), 학습 속도가 빠르다. 

 

~ 단점: loss function의 최솟값을 찾기 위해 자주 step의 방향을 바꿔야 하므로 학습이 불안정하다.

 

- Momentum

 

최적화 알고리즘은 아니지만 여러 최적화 알고리즘에 쓰이는 개념이다. 최솟값을 향해 이동하는 방향과는 별개로, 과거에 이동했던 방식을 현재 gradient를 통해 기억하면서 그 방향으로 일정 정도를 추가적으로 이동하는 방식. 즉, 일종의 관성을 주는 방식이다. 그로써 Local minimum에 갇히는 문제를 해결할 수 있다.

"관성 개념을 이용해서 덜 비틀거리면서 가보자"

 

# Momentum의 수식을 적어본다면?

 

- AdaGrad (Adaptive gradient)

 

많이 변화하지 않은 parameter(즉 가중치, bias)들은 step size를 크게 하고, 많이 변화했던 parameter들은 step size를 작게 하는 것이다. 자주 등장했거나 많이 변화했던 변수들은 optimum(최적값)에 가까이 있을 확률이 높기 때문에 작은 step size로 이동하면서 세밀하게 조절한다. 적게 변화한 변수들은 많이 이동해야 할 확률이 높기 때문에 먼저 빠르게 loss값을 줄이는 방향으로 이동하려는 방식. 학습을 계속 진행하면 step size가 너무 줄어든다는 단점이 있다.

"처음엔 빠르게 학습하고 나중엔 세밀하게 학습하자"

 

- RMSProp

 

"세밀하게 학습하되 과거의 gradient 정보는 작게, 최신의 gradient 정보는 크게 반영하자"

 

- Adam

 

RMSProp+Momentum 개념. Momentum 방식과 유사하게 지금까지 계산해온 기울기의 지수평균을 저장함. RMSProp과 유사하게 기울기의 제곱값의 지수 평균을 저장함.