Momentum Optimizer

Gradient Descent Optimizer 보다 개선된 알고리즘으로 이동값에 관성으로 인한 업데이트가 추가된 Optimizer이다. 다음과 같은 Gradient Descent Optimizer의 한계를 개선하는데 효과가 있는 알고리즘이다.

  • global minimum이 아닌 local minimum으로 수렴
  • 최솟값을 찾아가는 도중에 미분계수가 0인 지점에서 더 이상 이동하지 않음

Gradient Descent Optimize의 이동량은 미분계수에 의해 결정되기 때문에 미분계수가 0이면 더 이상 업데이트가 되지 않는다.

Momentum Optimizer는 다음과 같이 목적함수 \(f\)의 최솟값을 찾는다.

  • 초기값 \(x_0\)와 적당한 Learning rate \(\alpha\), momentum parameter \(\beta\) 설정
  • \(n\geq 0\)인 정수에 대해서 \(a_{n+1}\)과 \(x_{n+1}\)은 다음과 같이 정의
\[a_{n+1} := \beta\cdot a_n + \nabla f(x_n), \quad a_0 := 0\] \[x_{n+1} := x_n - \alpha \cdot a_{n+1}\]

즉, momentum 계수 \(\beta=0\)인 경우, Gradient Descent Optimizer와 동일한 알고리즘이다. \(\nabla f(x_n)=0\) 임에도 \(a_n\)에 의한 관성효과로 \(x_n\)은 업데이트된다(다음 그림 참조).

Momentum Optimizer를 이용하여 방정식

\[3x^4 + 4x^3 - 12x^2 +12\]

의 근을 찾는 알고리즘을 TensorFlow code로 작성하면 다음과 같다.

$x_0=2$, Learning rate = 0.001, momentum = 0.89로 설정하였다. 위 사진에서 보는 것처럼 초기값이 2이기 때문에 Gradient descent optimizer 방법을 사용하게 되면 극솟값에 빠질 수 있다 하지만 Momentum optimizer를 사용하면 관성효과로 이 극솟값을 지나서 최솟값으로 수렴하는 것을 확인할 수 있다.


import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

%matplotlib inline

X = tf.Variable(2.)

loss = 3*X**4 + 4*X**3 - 12*X**2 +12
# optimize = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
optimize = tf.train.MomentumOptimizer(0.001, 0.89).minimize(loss)


sess = tf.Session()
sess.run(tf.global_variables_initializer())
sequence = []

for i in range(200):
sess.run(optimize)
sequence.append(sess.run(X))

plt.figure(figsize=(16,6))
plt.suptitle("Sequence of x", fontsize=20)
plt.ylabel("x value")
plt.xlabel("Steps")
_ = plt.plot(sequence, ".")

x = np.linspace(-3,2,100)

def f_2(x):
X = np.array(x)
y = 3* X**4 + 4*X**3 - 12*X**2 +12
return y


plt.figure(figsize=(16,6))
plt.plot(x,f_2(x))

plt.plot(2,f_2(2), "r.", alpha=0.7)
plt.plot(sequence,f_2(sequence), "ro", markersize = 5, alpha=0.7)

실행화면


Nesterov Accelerated Gradient(NAG)

Momentum Optimizer의 개선된 알고리즘으로 차이점은 Gradient \(\nabla f\)를 \(x_n\)에서 계산하는 것이 아니라 관성(momentum)에 의해서 이동한 \(x_n+\beta\cdot a_n\)에서 계산하는 것이다. Nesterov Accelerated Gradient 알고리즘은 다음과 같다.

  • 초기값 \(x_0\)와 적당한 Learning rate \(\alpha\), momentum \(\beta\) 설정
  • \(n\geq 0\)인 정수에 대해서 \(a_{n+1}\)과 \(x_{n+1}\)은 다음과 같이 정의한다.
\[a_{n+1} := \beta\cdot a_n + \nabla f(x_n-\beta\cdot a_n)\] \[x_{n+1} := x_n - \alpha \cdot a_{n+1}\]

Momentum Optimizer와 마찬가지로 momentum 계수 \(\beta=0\)인 경우, Gradient Descent Optimizer와 동일한 알고리즘이다. NAG의 장점은 학습이 어느 정도 상황에서 momentum optimizer는 관성의 효과로 최적값을 지나칠 수 있는 문제를 방지할 수 있다.


TensorFlow code

다음과 같이 Momentum Optimizer 함수의 argument를 설정하면 된다.

tf.train.MomentumOptimizer(0.05, 0.03, use_nesterov=True)