AdaGrad, RMSprop, AdaDelta; 动量法, Nesterov加速梯度; Adam


推荐阅读: 梯度方向为什么是函数局部增长最快的方向

Gradient descent is all you need

梯度下降法可以分为:批量(batch)梯度下降随机(stochastic)梯度下降以及小批量(minibatch)梯度下降三种形式。

使用整个训练集的梯度下降被称为 批量梯度下降。每次只使用单个样本的梯度下降称为 随机梯度下降

大多数用于深度学习的梯度下降算法介于以上两者之间,使用一个以上,但又不是全部的训练样本。传统上,这称为 小批量小批量随机梯度下降

在这里插入图片描述
图片来源[2]

备注:花书中将 小批量随机(minibatch stochastic)梯度下降简称为随机(stochastic)梯度下降。 L L L为损失函数。

为了更有效地训练深层神经网络,在标准的小批量梯度下降方法的基础上,也经常使用一些改进方法以加快优化速度。常见的改进方法主要从以下两个方面进行改进:学习率衰减和梯度估计修正

学习率衰减

假设初始化学习率为 α 0 α_0 α0,在第t次迭代时的学习率 α t α_t αt。常用的衰减方式可以设置为按迭代次数进行衰减。比如

分段常数衰减(Piecewise Constant Decay)

即每经过 𝑇 1 , 𝑇 2 , ⋯ , 𝑇 𝑚 𝑇_1, 𝑇_2, ⋯ , 𝑇_𝑚 T1,T2,,Tm 次迭代将学习率衰减为原来的 β 1 , , β 2 , ⋯ , β 𝑚 \beta_1,,\beta_2, ⋯ , \beta_𝑚 β1,,β2,,βm倍,其中 𝑇 𝑚 𝑇_𝑚 Tm β 𝑚 < 1 \beta_𝑚 < 1 βm<1为根据经验设置的超参数.分段常数衰减也称为阶梯衰减(Step Decay).

逆时衰减(inverse time decay)

α t = α 0 1 1 + β × t \alpha_{t}=\alpha_{0} \frac{1}{1+\beta \times t} αt=α01+β×t1
其中 β β β 为衰减率。
指数衰减(exponential decay)
α t = α 0 β t \alpha_{t}=\alpha_{0} \beta^{t} αt=α0βt
其中 β β β 为衰减率。

自然指数衰减(natural exponential decay)
α t = α 0 exp ⁡ ( − β × t ) \alpha_{t}=\alpha_{0} \exp (-\beta \times t) αt=α0exp(β×t)

其中 β β β 为衰减率。

余弦衰减(Cosine Decay

α t = 1 2 α 0 ( 1 + cos ⁡ ( t π T ) ) \alpha_{t}=\frac{1}{2} \alpha_{0}\left(1+\cos \left(\frac{t \pi}{T}\right)\right) αt=21α0(1+cos(Ttπ))

其中 𝑇 𝑇 T 为总的迭代次数.

图7.4给出了不同衰减方法的示例(假设初始学习率为1)。
在这里插入图片描述
图片来源[1]

除了这些固定衰减率的调整学习率方法外,还有些自适应地调整学习率的方法,比如AdaGrad、RMSprop、AdaDelta等。这些方法都对每个参数设置不同的学习率。

AdaGrad

在标准的梯度下降方法中,每个参数在每次迭代时都使用相同的学习率。考虑到每个参数的维度上收敛速度是不同的,AdaGrad对SGD进行改进,根据不同参数的收敛情况分别设置学习率。
在这里插入图片描述
图片来源[2]

AdaGrad(Adaptive Gradient)算法每次迭代时自适应地调整每个参数的学习率。在第 t t t迭代时,先计算每个参数梯度平方的累计值
r t = ∑ τ = 1 t g τ ⊙ g τ r_{t}=\sum_{\tau=1}^{t} \boldsymbol{g}_{\tau} \odot \boldsymbol{g}_{\tau} rt=τ=1tgτgτ
其中 ⊙ ⊙ 为按元素乘积, g τ ∈ R ∣ θ ∣ \boldsymbol{g}_{\tau} \in \mathbb{R}^{|\theta|} gτRθ是第 τ τ τ 次迭代时的梯度。

再利用得到的值对参数进行更新,AdaGrad算法的参数更新差值为:

Δ θ t = − ϵ δ + r t ⊙ g t \Delta \theta_{t}=-\frac{\epsilon}{\delta+\sqrt{r_{t}}} \odot \boldsymbol{g}_{t} Δθt=δ+rt ϵgt

其中 ϵ \epsilon ϵ是初始的学习率, δ \delta δ是为了保持数值稳定性而设置的非常小的常数,一般取值 e − 7 e^{−7} e7 e − 10 e^{−10} e10。此外,这里的开平方、除、加运算都是按元素进行的操作。

在Adagrad算法中,如果某个参数的偏导数累积比较大,其学习率相对较小;相反,如果其偏导数累积较小,其学习率相对较大。但整体是随着迭代次数的增加,学习率逐渐缩小。Adagrad算法的缺点是在经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很难再继续找到最优点。

RMSprop

RMSprop 算法可以在有些情况下避免AdaGrad算法中学习率不断单调下降以至于过早衰减的缺点。

在这里插入图片描述
图片来源[2]

其累计平方梯度用指数加权移动平均值计算如下:

r t = ρ r t − 1 + ( 1 − ρ ) g t ⊙ g t \begin{aligned}r_{t} &=\rho r_{t-1}+(1-\rho) \boldsymbol{g}_{t} \odot \boldsymbol{g}_{t} \end{aligned} rt=ρrt1+(1ρ)gtgt
递推:
r 0 = 0 r_{0} =0 r0=0
r 1 = ρ r 0 + ( 1 − ρ ) g 1 ⊙ g 1 = ( 1 − ρ ) g 1 ⊙ g 1 r_{1} =\rho r_{0}+(1-\rho) \boldsymbol{g}_{1} \odot \boldsymbol{g}_{1}=(1-\rho) \boldsymbol{g}_{1} \odot \boldsymbol{g}_{1} r1=ρr0+(1ρ)g1g1=(1ρ)g1g1

r 2 = ρ r 1 + ( 1 − ρ ) g 2 ⊙ g 2 r_{2} =\rho r_{1}+(1-\rho) \boldsymbol{g}_{2} \odot \boldsymbol{g}_{2} r2=ρr1+(1ρ)g2g2

= ρ ( 1 − ρ ) g 1 ⊙ g 1 + ( 1 − ρ ) g 2 ⊙ g 2 =\rho (1-\rho)\boldsymbol{g}_{1} \odot \boldsymbol{g}_{1}+(1-\rho) \boldsymbol{g}_{2} \odot \boldsymbol{g}_{2} =ρ(1ρ)g1g1+(1ρ)g2g2

= ( 1 − ρ ) ∑ τ = 1 2 ρ 2 − τ g τ ⊙ g τ =(1-\rho) \sum_{\tau=1}^{2} \rho^{2-\tau} \boldsymbol{g}_{\tau} \odot \boldsymbol{g}_{\tau} =(1ρ)τ=12ρ2τgτgτ

r 3 = ρ r 2 + ( 1 − ρ ) g 3 ⊙ g 3 r_{3} =\rho r_{2}+(1-\rho) \boldsymbol{g}_{3} \odot \boldsymbol{g}_{3} r3=ρr2+(1ρ)g3g3

= ρ ( ( 1 − ρ ) ∑ τ = 1 2 ρ 2 − τ g τ ⊙ g τ ) + ( 1 − ρ ) g 3 ⊙ g 3 =\rho((1-\rho) \sum_{\tau=1}^{2} \rho^{2-\tau} \boldsymbol{g}_{\tau} \odot \boldsymbol{g}_{\tau})+(1-\rho) \boldsymbol{g}_{3} \odot\boldsymbol{g}_{3} =ρ((1ρ)τ=12ρ2τgτgτ)+(1ρ)g3g3

= ( 1 − ρ ) ∑ τ = 1 3 ρ 3 − τ g τ ⊙ g τ =(1-\rho) \sum_{\tau=1}^{3} \rho^{3-\tau} \boldsymbol{g}_{\tau} \odot\boldsymbol{g}_{\tau} =(1ρ)τ=13ρ3τgτgτ

. . . ... ...
r t = ρ r t − 1 + ( 1 − ρ ) g t ⊙ g t = ( 1 − ρ ) ∑ τ = 1 t ρ t − τ g τ ⊙ g τ \begin{aligned}r_{t} &=\rho r_{t-1}+(1-\rho) \boldsymbol{g}_{t} \odot \boldsymbol{g}_{t} \\&=(1-\rho) \sum_{\tau=1}^{t} \rho^{t-\tau} \boldsymbol{g}_{\tau} \odot \boldsymbol{g}_{\tau}\end{aligned} rt=ρrt1+(1ρ)gtgt=(1ρ)τ=1tρtτgτgτ

其中 ρ \rho ρ为衰减率,一般取值为0.9。

RMSprop算法的参数更新差值为
Δ θ t = − ϵ r t + δ ⊙ g t \Delta \theta_{t}=-\frac{\epsilon}{\sqrt{r_{t}+\delta}} \odot \boldsymbol{g}_{t} Δθt=rt+δ ϵgt
其中 ϵ \epsilon ϵ是初始的学习率,常设为0.001。

RMSProp算法和Adagrad算法的区别在于 r t r_t rt 的计算由累积方式变成了指数加权移动平均值。AdaGrad 根据所有历史梯度对学习率进行衰减,这可能导致学习率在达到全局最优所在的凸结构前就变得太小了。RMSProp 使用指数加权移动平均值来削弱遥远过去的梯度的影响。(类似强化学习中的折扣因子)

AdaDelta

在这里插入图片描述
图片来源[2]

AdaDelta算法也是 Adagrad算法的一个改进。和RMSprop算法类似,AdaDelta算法通过梯度平方的指数加权移动平均值来调整学习率。
r t = ρ r t − 1 + ( 1 − ρ ) g t ⊙ g t \begin{aligned}r_{t} &=\rho r_{t-1}+(1-\rho) \mathbf{g}_{t} \odot \mathbf{g}_{t} \end{aligned} rt=ρrt1+(1ρ)gtgt
此外,AdaDelta算法还引入了每次参数更新差 ∆ θ ∆θ θ 的平方的指数加权移动平均值:

Δ X t − 1 2 = ρ Δ X t − 2 2 + ( 1 − ρ ) Δ θ t − 1 ⊙ Δ θ t − 1 \Delta X_{t-1}^{2}=\rho \Delta X_{t-2}^{2}+\left(1-\rho\right) \Delta \theta_{t-1} \odot \Delta \theta_{t-1} ΔXt12=ρΔXt22+(1ρ)Δθt1Δθt1
其中 ρ 1 \rho_1 ρ1 为衰减率。此时 ∆ θ t ∆θ_t θt还未知,因此只能计算到 ∆ X t − 1 ∆X_{t−1} Xt1

AdaDelta算法的参数更新差值为
Δ θ t = − Δ X t − 1 2 + δ r t + δ ⊙ g t \Delta \theta_{t}=-\frac{\sqrt{\Delta X_{t-1}^{2}+\delta}}{\sqrt{r_{t}+\delta}} \odot \boldsymbol{g}_{t} Δθt=rt+δ ΔXt12+δ gt

AdaDelta 算法在 RMSprop 算法的基础上将初始学习率 ϵ \epsilon ϵ 改为动态计算的 Δ X t − 1 2 \sqrt{\Delta X_{t-1}^{2}} ΔXt12 ,针对的问题是:Adagrad算法需要自己手动指定初始学习率,而且由于分母中对历史梯度一直累加,学习率将逐渐下降至0,并且如果初始梯度很大的话,会导致整个训练过程的学习率一直很小,从而导致学习时间变长。[4]

梯度估计修正

动量法

一般而言,一个物体的动量指的是这个物体在它运动方向上保持运动的趋势。动量法(Momentum Method)是用历史积累动量来替代真正的梯度。
在这里插入图片描述
图片来源[2]

在第 t t t次迭代时,计算负梯度的“加权移动平均”作为参数的更新方向:
v t ← α v t − 1 − ϵ g t \boldsymbol{v}_t \leftarrow \alpha \boldsymbol{v}_{t-1}-\epsilon \boldsymbol{g}_t vtαvt1ϵgt

其中 α \alpha α为动量因子,通常设为0.9, ϵ \epsilon ϵ为学习率。

使用动量法时,每个参数的实际更新差值取决于最近一段时间内梯度的加权平均值。当某个参数在最近一段时间内的梯度方向不一致时,其真实的参数更新幅度变小;相反,当在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变大,起到加速作用。一般而言,在迭代初期,梯度方向都比较一致,动量法会起到加速作用,可以更快地到达最优点。在迭代后期,梯度方向会不一致,在收敛值附近振荡,动量法会起到减速作用,增加稳定性。

Nesterov 加速梯度

在这里插入图片描述
图片来源[2]

在动量法中,实际的参数更新方向 v t \boldsymbol{v}_t vt为上一步的参数更新方向 v t − 1 \boldsymbol{v}_{t−1} vt1 和当前负梯度 − g t −\boldsymbol{g}_t gt 的叠加。这样, v t \boldsymbol{v}_t vt 可以被拆分为两步进行,先根据 v t − 1 \boldsymbol{v}_{t−1} vt1更新一次得到参数 θ ^ \hat{\boldsymbol{θ}} θ^,再用 g \boldsymbol{g} g 进行更新得到 θ t \boldsymbol{\theta}_{t} θt

θ ^ = θ t − 1 + α v t − 1 \hat{\boldsymbol{\theta}}=\boldsymbol{\theta}_{t-1}+\alpha \boldsymbol{v}_{t−1} θ^=θt1+αvt1

θ t = θ ^ − ϵ g t \boldsymbol{\theta}_{t}=\hat{\boldsymbol{\theta}}-\epsilon\boldsymbol{g}_t θt=θ^ϵgt

其中梯度 g t \boldsymbol{g}_t gt为点 θ t − 1 \boldsymbol{\theta}_{t−1} θt1 上的梯度:

g t ← 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ t − 1 ) , y ( i ) ) \boldsymbol{g}_t \leftarrow \frac{1}{m} \nabla_{\boldsymbol{\theta}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \boldsymbol{\theta}_{t-1}\right), \boldsymbol{y}^{(i)}\right) gtm1θiL(f(x(i);θt1),y(i))

第二步更新有些不合理,更合理的更新方向应该为 θ ^ \hat{\boldsymbol{\theta}} θ^上的梯度。因此 Nesterov 加速梯度在动量法的基础上加入临时点,并计算临时点的梯度。
θ ~ ← θ t − 1 + α v \tilde{\boldsymbol{\theta}} \leftarrow \boldsymbol{\theta}_{t-1}+\alpha \boldsymbol{v} θ~θt1+αv

g t ← 1 m ∇ θ ~ ∑ i L ( f ( x ( i ) ; θ ~ ) , y ( i ) ) \boldsymbol{g}_t \leftarrow \frac{1}{m} \nabla_{\tilde{\boldsymbol{\theta}}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \tilde{\boldsymbol{\theta}}\right), \boldsymbol{y}^{(i)}\right) gtm1θ~iL(f(x(i);θ~),y(i))

动量法与Nesterov加速梯度法区别如下:
在这里插入图片描述

集大成者

Adam

自适应动量估计(Adaptive Moment Estimation,Adam)算法。可以看作是动量法和 RMSprop 的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率。
在这里插入图片描述
图片来源[2]

Adam 算法一方面计算梯度平方 g t 2 \boldsymbol{g}^2_t gt2的指数加权平均(和 RMSprop 类似),另一方面计算梯度 g t \boldsymbol{g}_t gt的指数加权平均(和动量法类似)。
s t = ρ 1 s t − 1 + ( 1 − ρ 1 ) g t \boldsymbol{s}_{t}=\rho_{1} \boldsymbol{s}_{t-1}+\left(1-\rho_{1}\right) \boldsymbol{g}_{t} st=ρ1st1+(1ρ1)gt

r t = ρ 2 r t − 1 + ( 1 − ρ 2 ) g t ⊙ g t \boldsymbol{r}_{t}=\rho_{2} \boldsymbol{r}_{t-1}+\left(1-\rho_{2}\right) \boldsymbol{g}_{t} \odot \boldsymbol{g}_{t} rt=ρ2rt1+(1ρ2)gtgt

其中 ρ 1 \rho_1 ρ1 ρ 2 \rho_2 ρ2分别为两个移动平均的衰减率,通常取值为 ρ 1 = 0.9 , ρ 2 = 0.99 \rho_1 = 0.9, \rho_2 = 0.99 ρ1=0.9,ρ2=0.99

s t \boldsymbol{s}_t st可以看作是梯度的一阶矩, r t \boldsymbol{r}_t rt 可以看作是梯度的 二阶矩。

假设 s 0 = 0 , r 0 = 0 \boldsymbol{s}_0 = 0, \boldsymbol{r}_0 = 0 s0=0,r0=0,那么在迭代初期 s t \boldsymbol{s}_t st r t \boldsymbol{r}_t rt 的值会比真实的值要小。特别是当 ρ 1 \rho_1 ρ1 ρ 2 \rho_2 ρ2 都接近于1时,偏差会很大。因此,需要对偏差进行修正。
s ^ t = s t 1 − ρ 1 t \hat{\boldsymbol{s}}_{t}=\frac{\boldsymbol{s}_{t}}{1-\rho_{1}^{t}} s^t=1ρ1tst

r ^ t = r t 1 − ρ 2 t \hat{\boldsymbol{r}}_{t}=\frac{\boldsymbol{r}_{t}}{1-\rho_{2}^{t}} r^t=1ρ2trt

Adam算法的参数更新差值为
Δ θ t = − ϵ s ^ t r ^ t + δ \Delta \theta_{t}=-\epsilon\frac{\hat{\boldsymbol{s}}_{t}}{\sqrt{\hat{\boldsymbol{r}}_{t}}+\delta} Δθt=ϵr^t +δs^t

其中学习率α通常设为0.001。

参考:
[1]《神经网络与深度学习》 作者:邱锡鹏
[2]《深度学习》 https://github.com/exacity/deeplearningbook-chinese
[3]Deep Learning , 作者:Ian Goodfellow,Yoshua Bengio,Aaron Courville
[4] https://blog.csdn.net/XiangJiaoJun_/article/details/83960136

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二进制人工智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值