码字不易,转载请注明出处~
tags: optimizer; Momentum; Nesterov Accelerated Gradient
这篇文章主要介绍动量法以及Nesterov法,来源于:
https://medium.com/konvergen/momentum-method-and-nesterov-accelerated-gradient-487ba776c987
之所以把这两个内容放在一起,主要是因为他们两者在进行参数更新时所采用的方法都依赖以往的累积梯度信息。所不同的是,两者在当前梯度计算时所采用的方法有所不同,从而导致在参数更新时所采取的策略上有所区别。
动量是物理学的一个词,高中时候学过。然而此时的动量与物理学中的概念却是不一样的。还是以“下山”这个例子进行说明。使用梯度下降法下山的时候,每次都向梯度的反方向迈开一步。而这个过程好比人不受重力的影响,每次只走一步。动量法的想法,更像是人在下山过程中,由于重力的加速度,会使人不由自主的加速,速度会越来越快。而这个好处就在于,如果下山过程中,有片平面的区域,那么此刻的梯度是很小的;普通的梯度下降法在进行参数更新的时候,梯度更新也很小,甚至容易卡在局部。而带有动量就不一样了,就像是一种冲力,即使在梯度本身很小的时候,也会有大幅度的梯度更新,也容易跳出局部最优。
动量法
梯度下降法更新权重
θ
\theta
θ的公式如下:
(1)
θ
t
+
1
=
θ
t
−
η
g
\theta_{t+1}=\theta_t-\eta g\tag{1}
θt+1=θt−ηg(1)
可以看到,正常情况下,每次参数更新时是依赖当前计算的梯度,正如上面所说,如果当前所处的位置是一片比较平坦的区域,那么意味着计算出来的梯度是很小的,那么在更新参数时的幅度也相对较小。此时动量就显示出了强大的功效,它使得权重参数更新时能够使用之前更新参数时的累积梯度。
动量法更新权重的公式如下:
(2)
v
t
+
1
=
α
v
t
−
η
g
θ
t
+
1
=
θ
t
+
v
t
+
1
\begin{aligned} v_{t+1}&=\alpha v_t-\eta g \\ \theta_{t+1}&=\theta_t + v_{t+1} \\ \end{aligned}\tag{2}
vt+1θt+1=αvt−ηg=θt+vt+1(2)
式中的
v
v
v表示之前所有累积的梯度信息,包含此刻之前每次参数更新时累加(向量加)的梯度结果,本身带有方向和大小两方面信息。
α
\alpha
α为衰减率,表示以多大的程度累积以前所计算的梯度,或者换句话说,我们能够多大程度上相信之前累积的梯度信息。如果
α
\alpha
α比
η
\eta
η大太多,意味着本次更新参数时的梯度更强的依赖之前梯度计算的结果,那么本次参数更新的方向不会受到当前梯度计算结果的太大影响;反之,就意味着之前所累加的梯度对本次更新的影响较弱,更新方向可能受本次计算的梯度影响较大,而之前的累积梯度仅仅是一种辅助作用。
Nesterov Accelerated Gradient
前面说过,这种方法与动量法的原理基本类似,唯一不同的在于两者对梯度的计算方式有所不同。
在动量法中,梯度计算方式如下:
(3)
g
=
1
n
∑
i
=
1
n
∇
θ
L
(
x
i
,
y
i
,
θ
t
)
g=\frac{1}{n}\sum_{i=1}^{n}\nabla_\theta L(x^{i},y^{i}, \theta_t)\tag{3}
g=n1i=1∑n∇θL(xi,yi,θt)(3)
可以看到,在使用动量法进行参数更新时,当前梯度更新的方向和大小是根据当前参数本身
θ
t
\theta_t
θt来计算获得的。而在Nesterov Accelerate Gradient中,梯度的计算方式如下:
(4)
θ
~
=
θ
t
+
α
v
t
g
N
A
G
=
1
n
∑
i
=
1
n
∇
θ
L
(
x
(
i
)
,
y
(
i
)
,
θ
~
)
\begin{aligned} \tilde{\theta}&=\theta_t +\alpha v_t\\ g_{NAG}&=\frac{1}{n}\sum_{i=1}^{n}\nabla_\theta L(x^{(i)}, y{(i)},\tilde{\theta})\\ \end{aligned}\tag{4}
θ~gNAG=θt+αvt=n1i=1∑n∇θL(x(i),y(i),θ~)(4)
在计算新的梯度时,首先将原始动量累积项加到当前参数上,得到新的权重参数
θ
~
\tilde{\theta}
θ~,然后根据该参数计算当前应该更新的梯度大小和方向。
最终,两者计算权重时所用的方法是相同的:
(5)
v
t
+
1
=
α
v
t
−
η
g
N
A
G
θ
t
+
1
=
θ
t
+
v
t
+
1
\begin{aligned} v_{t+1}&=\alpha v_t-\eta g_{NAG}\\ \theta_{t+1}&=\theta_t+v_{t+1}\\ \end{aligned}\tag{5}
vt+1θt+1=αvt−ηgNAG=θt+vt+1(5)
这里,两种方法的区别仅仅在于
η
\eta
η之后所乘的对象不同而已。
两者的区别
假设一种情况:在某些时刻,如果下一轮进行梯度计算时,可能会发生梯度爆炸,参数会更新错误,导致网络损失升高。那么对于动量法而言,由于它是依据当前参数 θ \theta θ来计算当前的梯度,因此它没办法预防这种可能出现的情况,即使发生了也就发生了,事后只能慢慢地去修正,而在此过程中会使训练过程不断震荡。但对于NAG而言,由于它在计算当前梯度时,提前在参数上加上了动量项得到新的参数 θ ~ \tilde{\theta} θ~,在计算当前时刻的梯度时,会按照这个新的 θ ~ \tilde{\theta} θ~来计算。如果这个新的参数可能会导致梯度发生爆炸,那么在进行接下来参数更新的时候就会使参数避免向发生梯度爆炸的方向更新,在一定程度上可以起到缓冲的作用。可以大概认为,Nesterov Accelerated Gradient算是原始动量法的一种改进方法吧。
下面这幅图来自上面的博客,可以非常清晰的刻画两者之间的区别:
上图中,加入了动量信息
μ
v
t
\mu v_t
μvt后,在进行参数更新时,首先根据当前参数
θ
t
\theta_t
θt计算出当前的梯度
g
(
θ
t
)
g(\theta_t)
g(θt),然后计算出新的方向
v
t
+
1
=
α
v
t
−
η
g
v_{t+1}=\alpha v_t-\eta g
vt+1=αvt−ηg,最后进行参数更新整个过程如下:
(6)
g
S
G
D
=
1
n
∑
i
=
1
n
∇
θ
L
(
x
(
i
)
,
y
(
i
)
,
θ
t
)
v
t
+
1
=
α
v
t
−
η
g
θ
t
+
1
=
θ
t
+
v
t
+
1
\begin{aligned} g_{SGD}&=\frac{1}{n}\sum_{i=1}^{n}\nabla_{\theta} L(x^{(i)}, y^{(i)},\theta_t)\\ v_{t+1}&=\alpha v_t-\eta g \\ \theta_{t+1}&=\theta_t + v_{t+1} \\ \end{aligned}\tag{6}
gSGDvt+1θt+1=n1i=1∑n∇θL(x(i),y(i),θt)=αvt−ηg=θt+vt+1(6)
下图中,首先在当前的参数
θ
t
\theta_t
θt上计算出了新的
θ
~
=
θ
t
+
α
v
t
\tilde{\theta}=\theta_t +\alpha v_t
θ~=θt+αvt,然后利用新的
θ
~
\tilde{\theta}
θ~计算出梯度
g
(
N
A
G
)
g(NAG)
g(NAG),最后再进行参数的更新
(5)
θ
~
=
θ
t
+
α
v
t
g
N
A
G
=
1
n
∑
i
=
1
n
∇
θ
L
(
x
(
i
)
,
y
(
i
)
,
θ
~
)
v
t
+
1
=
α
v
t
−
η
g
N
A
G
θ
t
+
1
=
θ
t
+
v
t
+
1
\begin{aligned} \tilde{\theta}&=\theta_t +\alpha v_t\\ g_{NAG}&=\frac{1}{n}\sum_{i=1}^{n}\nabla_\theta L(x^{(i)}, y{(i)},\tilde{\theta})\\ v_{t+1}&=\alpha v_t-\eta g_{NAG}\\ \theta_{t+1}&=\theta_t+v_{t+1}\\ \end{aligned}\tag{5}
θ~gNAGvt+1θt+1=θt+αvt=n1i=1∑n∇θL(x(i),y(i),θ~)=αvt−ηgNAG=θt+vt+1(5)
通过对比可以看出,在同样的
θ
\theta
θ和同样的动量项
α
v
t
\alpha v_t
αvt的情况下,采用NAG所更新的参数相比较Momentum而言是有所减小的,这也印证了我们前面提到的:NAG可以在一定的程度上避免参数更新幅度较大而引起训练波动。
参考:
- B. T. Polyak, “Some methods of speeding up the convergence of iteration methods” (1964)
- I. Sutskever, J. Martens, G. Dahl, G. Hinton, “On the importance of initialization and momentum in deep learning” (2013)
- I. Goodfellow, Y. Bengio, A. Courville, “Deep Learning” (2016)