import tensorflow as tf
tf.keras.optimizers.SGD(
learning_rate=0.01,
momentum=0.0,
nesterov=False,
name='SGD', **kwargs
)
Stochastic Gradient Descent
wt+1=wt−η∗gradient(η=learningrate)
Momentum
wt+1=wt+v(v=velocity)
vt+1=m∗vt−η∗gradient(m=momentcoef)
정리하면,
wt+1=wt+m∗vt−η∗gradient=SGD+m∗vt
모멘텀은 SGD에 m∗vt를 더한 것!
Nesterov Accelrated Gradient
wt+1=wt+v
vt+1=m∗vt−η∗gradient(wt+m∗v)
정리하면,
wt+1=wt+m∗vt−η∗gradient(wt+m∗vt)=A−η∗gradient(A)(A=wt+m∗vt)
NAG는 SGD에서 wt를 A로 한 것! 여기서 A는 가중치(w)와 모멘텀(m∗vt)의 합이다.
최적화 함수(Optimizer Function)의 시작이라고 할 수 있는 "확률적 경사하강"(Stochastic Gradient Descent, 줄여서 'SGD')
최적화와 경사하강이 무슨 관계냐? 최적화는 예측값과 실제값의 차이, 즉 손실(Loss)이 최소가 되도록 만드는 것을 뜻하는데, 이 손실 그래프에서 경사값(기울기)를 미분으로 구해서 아래 방향으로 하강하는 것과 그 뜻을 같이 한다.
모멘텀은 local minima를 벗어날 수 있도록 SGD에 관성(Momentum)을 더한 것이다. 자동차 운전에서 속도를 붙여 진입하면 오르막길을 통과하기 수월한 것을 연상하자.
NAG는 음... 더 공부하자. 모멘텀과 비슷한 기능을 하는 것인데 한단계 꼬아서 이해가 조금 더 어렵다. 러시아의 수학자 Nesterov가 제안한 방법 같은데, 대붕을 내가 따라가려면 멀었다, 멀었어.
사실 너무 기초적인 Optimizer라서 다른 Optimizer를 공부하기 위한 목적이지, 실제 사용은 하지 않을 듯 하다. 가장 보편적인 최적화 함수는 Adam으로, 모르면 일단 '아담'부터 쓰고 보자.