深度学习中的优化方法-Momentum and Nesterov Accelerated Gradient

本文深入探讨了动量法(Momentum)和Nesterov加速梯度(NAG)在深度学习中的应用。动量法通过引入历史梯度信息加速收敛,而NAG则进一步优化了梯度计算方式,预判并防止梯度爆炸,有效提高模型训练稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

码字不易,转载请注明出处~

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=1nθ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=1nθ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算是原始动量法的一种改进方法吧。

下面这幅图来自上面的博客,可以非常清晰的刻画两者之间的区别:

上图:动量法  下图:NAG
上图中,加入了动量信息 μ 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=1nθ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=1nθL(x(i),y(i),θ~)=αvtηgNAG=θt+vt+1(5)
通过对比可以看出,在同样的 θ \theta θ和同样的动量项 α v t \alpha v_t αvt的情况下,采用NAG所更新的参数相比较Momentum而言是有所减小的,这也印证了我们前面提到的:NAG可以在一定的程度上避免参数更新幅度较大而引起训练波动。

参考:

  1. B. T. Polyak, “Some methods of speeding up the convergence of iteration methods” (1964)
  2. I. Sutskever, J. Martens, G. Dahl, G. Hinton, “On the importance of initialization and momentum in deep learning” (2013)
  3. I. Goodfellow, Y. Bengio, A. Courville, “Deep Learning” (2016)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值