基于动量的梯度下降与Nesterov的加速梯度下降有什么区别?


48

因此,基于动量的梯度下降原理如下:

v=self.momentummlrg

其中是先前的权重更新,g是相对于参数p的当前梯度,l r是学习率,s e l f ø é Ñ Ú 中号是一个常数。mgplrself.momentum

pnew=p+v=p+self.momentummlrg

Nesterov的加速梯度下降原理如下:

pnew=p+self.momentumvlrg

等效于:

pnew=p+self.momentum(self.momentummlrg)lrg

要么

pnew=p+self.momentum2m(1+self.momentum)lrg

来源:https : //github.com/fchollet/keras/blob/master/keras/optimizers.py

因此,对我来说,涅斯捷罗夫的加速梯度下降似乎使lr * g项的权重超过了以前的权重变化项m的权重(与普通的旧动量相比)。这种解释正确吗?


7
会要求您输入要求太多?LATEX
Rodrigo de Azevedo

Answers:


35

Arech关于Nesterov动量的答案是正确的,但是代码本质上是相同的。 所以在这方面的涅斯捷罗夫方法不会对给予更大权重项,并以较小的权重v项。lrgv

为了说明为什么Keras的实现是正确的,我将借用Geoffrey Hinton的示例
在此处输入图片说明


v=mvlr(w+mv)
w=w+v
mvlr(w+mv)mvlr(w+mv)()

(w+mv)=:g(w)

  1. (10)
  2. (02)
  3. (23)

p=p+m(mvlrg)lrg

p=pmv+mv+m(mvlrg)lrg=pmv+mvlrg+m(mvlrg)=pmv+(mvlrg)+m(mvlrg)

1023123

pmvp


2
@youkaichao试试这个youtube.com/watch?v=LdkkZglLZ0Q
dontloo

13

在我看来,OP的问题已经回答了,但我会尝试给出另一种(非常直观的)解释,以说明动量以及古典动量(CM)与内斯特罗夫的加速梯度(NAG)之间的区别。


tl; dr
只需跳到最后的图像。
NAG_ball的推理是另一个重要的部分,但是我不确定如果没有其他所有内容,它是否容易理解。



θf(θ)

在其他新闻中,最近出现了这两个疯狂的感知球:
CM_ball NAG_ball

事实证明(根据观察到的球的行为,并根据《关于深度学习中初始化和动量的重要性的论文》(在第2部分中描述CM和NAG的论文),每个球的行为与这些方法之一完全相同,因此我们将其称为“ CM_ball”和“ NAG_ball” :(
NAG_ball面带微笑,因为他最近观看了讲座6c的结尾-Geoffrey Hinton与Nitish Srivastava和Kevin Swersky的动量方法,因此比以往任何时候都更加相信他的行为导致更快地找到最低要求。)

这是球的行为:


  • θttvttθt=θt1+vt
  • vt
    • vt1
      vt1
      μ0.9μ<1μvt1
      μ


    • ϵϵ>0
      ϵ
      gϵg
  • vt=μvt1ϵg

  • vt=μvt1ϵf(θt1)

  • vt=μvt1ϵf(θt1+μvt1)

    NAG_ball的推理

    • 不管先跳什么,我的动量跳都是一样的。
      因此,我应该考虑这种情况,好像我已经做出了动力跳跃,而我即将做出我的斜坡跳跃。
    • 现在,从概念上讲,我的“坡度跳跃”将从此处开始,但是我可以选择是计算“坡度跳跃”是像在“动量跳跃”之前启动还是“从此处开始”。
    • θθθ



θ
f(θ)7

CM_ball vs NAG_ball示例


附录1-NAG_ball推理的演示

Alec Radford的这张令人着迷的gif中,您可以看到NAG的性能可以说比CM(gif中的“动量”)更好。
(最小值是星星所在的位置,曲线是等高线。有关等高线及其垂直于渐变的原因的说明,请参见传奇3Blue1Brown的视频12。

NAG优于CM(动量)

对特定时刻的分析证明了NAG_ball的推理:

CM与NAG在特定时刻

  • (长)紫色箭头是动量子步骤。
  • 如果透明红色箭头在动量子步骤之前开始,则为梯度子步骤。
  • 如果黑色箭头在动量子步骤之后开始,则它是梯度子步骤。
  • CM将最终到达深红色箭头的目标。
  • NAG将最终到达黑色箭头的目标。

附录2-我编造的事物/术语(出于直觉的考虑)

  • CM_ball
  • NAG_ball
  • 双跳
  • 动量跳
  • 动量由于与空气的摩擦而损失
  • 坡跳
  • 渴望球
  • 我昨天观察球

附录3-我没有组成的术语


1
我从“这里是球的行为:...”到“将您指向从θ到最小方向(幅度相对正确)的方向”中找到这一部分。出色地解释了差异。
诗人莫迪

12

我不这么认为。

例如,Sutskever,Martens等人在“关于深度学习中的初始化和动量的重要性” 2013年中对Nesterov动量(也称为Nesterov加速梯度)属性进行了很好的描述。

主要区别在于经典动量中,您首先校正速度,然后根据该速度大步前进(然后重复),但是在涅斯特罗夫动量中,您首先向速度方向迈进,然后对基于速度矢量的校正在新位置(然后重复)。

即古典动力:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) )
W(t+1) = W(t) + vW(t+1)

内斯特罗夫的势头是这样的:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) + momentum.*vW(t) )
W(t+1) = W(t) + vW(t+1)

实际上,这在实践上有很大的不同...


5

补充:关于神经网络的斯坦福大学课程 cs231n给出了另一种形式的步骤:

v = mu * v_prev - learning_rate * gradient(x)   # GD + momentum
v_nesterov = v + mu * (v - v_prev)              # keep going, extrapolate
x += v_nesterov

这里v是速度又称步态,mu是动量因子,通常为0.9左右。(vx并且learning_rate可以是很长的向量;对于numpy,代码是相同的。)

v第一行是具有动量的梯度下降; v_nesterov推断,继续前进。例如,当mu = 0.9时,

v_prev  v   --> v_nesterov
---------------
 0  10  -->  19
10   0  -->  -9
10  10  -->  10
10  20  -->  29

以下描述包含3个术语:
单独的术语1是平面梯度下降(GD),
1 + 2给出GD +动量,
1 + 2 + 3给出Nesterov GD。

xtytytxt+1

yt=xt+m(xtxt1) -动量,预测因子
xt+1=yt+h g(yt) -渐变

gtf(yt)h

yt

yt+1=yt
+ h gt -渐变
+ m (ytyt1) -动力
+ m h (gtgt1) -梯度动量

最后一项是具有平坦动量的GD和具有Nesterov动量的GD之间的差异。


mmgrad
+ m (ytyt1) -动力
+ mgrad h (gtgt1) -梯度动量

mgrad=0mgrad=m
mgrad>0
mgrad.1

mtht



(x/[cond,1]100)+ripple×sin(πx)

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.