【机器学习】—— 各种梯度下降的变形momentum,adagrad,rmsprop,adam分别解决了什么问题

Momentum

Momentum的公式表达

设时间步 t t t的自变量为 x t \boldsymbol{x}_t xt,学习率为 η t \eta_t ηt。在 t 0 t_0 t0时刻,速度变量 v 0 = 0 \boldsymbol{v}_0=0 v0=0,在时间步 t > 0 t>0 t>0,Momentum关于速度变量 v t = 0 \boldsymbol{v}_t=0 vt=0和自变量 θ t \boldsymbol{\theta}_t θt的迭代方式为:
v t ← γ v t − 1 + η t g t , θ t ← θ t − 1 − v t , \begin{aligned} \boldsymbol{v}_t &\leftarrow \gamma \boldsymbol{v}_{t-1} + \eta_t \boldsymbol{g}_t, \\ \boldsymbol{\theta}_t &\leftarrow \boldsymbol{\theta}_{t-1} - \boldsymbol{v}_t, \end{aligned} vtθtγvt1+ηtgt,θt1vt,
其中 γ \gamma γ 为超参数,满足 0 ≤ γ < 1 0 \leq \gamma < 1 0γ<1
从上面的式子我们可以看出

  • 速度变量 v t \boldsymbol{v}_t vt作用等价于梯度
  • 速度变量 v t \boldsymbol{v}_t vt的大小与上一个时刻的速度变量 v t − 1 \boldsymbol{v}_{t-1} vt1和学习率 η t \eta_t ηt有关,且 γ \gamma γ越大, v t − 1 \boldsymbol{v}_{t-1} vt1的作用越大。
  • 由于 v t = γ v t − 1 + η t g t = γ ( γ v t − 2 + η t g t − 1 ) + η t g t = . . . . . . \boldsymbol{v}_t =\gamma \boldsymbol{v}_{t-1} + \eta_t \boldsymbol{g}_t=\gamma (\gamma \boldsymbol{v}_{t-2} + \eta_t \boldsymbol{g}_{t-1})+ \eta_t \boldsymbol{g}_t=...... vt=γvt1+ηtgt=γ(γvt2+ηtgt1)+ηtgt=......,历史的速度变量都将影响当前速度变量的大小,且越近影响越大,相当于历史速度变量的加权平均,越近权重越大

Momentum可以解决什么问题?

【机器学习】—— 各种梯度下降的变形momentum,adagrad,rmsprop,adam分别解决了什么问题_第1张图片
如上图1所示,在黄色箭头处,本身梯度为零,但是由于历史的速度变量不为零,会继续向右运动,而到达紫色箭头处时,梯度应该向左,但此时历史的速度变量如果较大且向右,有可能跳出局部最优点,当然,能不能跳出是很难保证的。
【机器学习】—— 各种梯度下降的变形momentum,adagrad,rmsprop,adam分别解决了什么问题_第2张图片
上图是一个梯度下降的图,如果采用momentum,则下降趋势如下
【机器学习】—— 各种梯度下降的变形momentum,adagrad,rmsprop,adam分别解决了什么问题_第3张图片
在下降开始阶段,历史速度变量和当前梯度方向相反,则会使得下降的过程更为平滑,避免过度震荡。
因此Momentum的主要作用在于:

  • 有一定几率跳出局部最优解
  • 历史速度变量和当前梯度方向相反时,使得下降的过程更为平滑

Adagrad

Adagrad的公式表示为
s t ← s t − 1 + g t ⊙ g t , \boldsymbol{s}_t \leftarrow \boldsymbol{s}_{t-1} + \boldsymbol{g}_t \odot \boldsymbol{g}_t, stst1+gtgt,
其中 ⊙ \odot 是按元素相乘。 s t \boldsymbol{s}_t st为t时刻的状态变量,为从训练开始直到t时刻的所有梯度的平方和,我们更新目标函数的自变量 θ t \boldsymbol{\theta}_t θt

θ t ← θ t − 1 − η s t + ϵ ⊙ g t , \boldsymbol{\theta}t \leftarrow \boldsymbol{\theta}_{t-1} - \frac{\eta}{\sqrt{\boldsymbol{s}_t + \epsilon}} \odot \boldsymbol{g}_t, θtθt1st+ϵ ηgt,
其中 η \eta η是学习率, ϵ \epsilon ϵ是为了维持数值稳定性的常数(避免数值溢出),通常非常小。
从上面的式子我们可以看出:

  • Adagrad的分母是所有历史梯度的累加(均方差),因此历史梯度越大,当前更新越小。整体的思想是:之前更新大的参数,这次更新更新小一点,反之亦然
  • Adagrad相比于之前介绍的方法,它根据不同参数具有不同的学习率(受分母影响)
  • Adagrad在两种情况下,同一次更新中的某些参数学习率变得很小:
    • 1.历史梯度存在很大的值,即参数曾经有过更新很快的记录
    • 2.参数更新频率高,梯度为0的次数少,在学习过程中,梯度为0是很常见的,因此adagrad鼓励那些没怎么更新过的参数多更新一点。
    • 3.Adagrad中分母是采用的累积,因此到训练后期学习率会小得令人发指,也就是说如果经过一定的迭代次数后模型还没有找到最优点,那就很难找到最优解了。

RMSProp

RMSProp全称是 Root Mean Square Prop,它和adagrad类似,可以使得不同的参数具有个性化的学习率,同时可以缓解训练后期学习率过小的问题,它的公式如下:
s t ← γ s t − 1 + ( 1 − γ ) g t ⊙ g t . \boldsymbol{s}_t \leftarrow \gamma \boldsymbol{s}_{t-1} + (1 - \gamma) \boldsymbol{g}_t \odot \boldsymbol{g}_t. stγst1+(1γ)gtgt.
θ t ← θ t − 1 − η s t + ϵ ⊙ g t , \boldsymbol{\theta}_t \leftarrow \boldsymbol{\theta}_{t-1} - \frac{\eta}{\sqrt{\boldsymbol{s}_t + \epsilon}} \odot \boldsymbol{g}_t, θtθt1st+ϵ ηgt,
其中 0 ≤ γ < 1 0 \leq \gamma < 1 0γ<1,可以看出与adagrad的区别在于状态变量 s t s_t st的计算对于历史的状态变量和当前梯度都做了衰减,因此再迭代过程中梯度不一定是一直衰减,也可能增大。

Adam

Adam可以看做RMSProp和Momentum的结合,类似有:
v t ← γ 1 v t − 1 + ( 1 − γ 1 ) g t \begin{aligned} \boldsymbol{v}_t &\leftarrow \gamma_1 \boldsymbol{v}_{t-1} + (1-\gamma_1 ) \boldsymbol{g}_t\end{aligned} vtγ1vt1+(1γ1)gt
s t ← γ 2 s t − 1 + ( 1 − γ 2 ) g t ⊙ g t \boldsymbol{s}_t \leftarrow \gamma_2 \boldsymbol{s}_{t-1} + (1 - \gamma_2) \boldsymbol{g}_t \odot \boldsymbol{g}_t stγ2st1+(1γ2)gtgt
作者建议的 γ 1 = 0.9 , γ 2 = 0.999 \gamma_1=0.9,\gamma_2=0.999 γ1=0.9,γ2=0.999 ,那么在训练刚开始的时候由于 v t − 1 , s t − 1 v_{t-1},s_{t-1} vt1st1都比较小导致$ v_{t},s_{t} $较小,因此需要增加一个偏置:
v ^ t ← v t 1 − β 1 t \hat{\boldsymbol{v}}_t \leftarrow \frac{\boldsymbol{v}_t}{1 - \beta_1^t} v^t1β1tvt
s ^ t ← s t 1 − β 2 t \hat{\boldsymbol{s}}_t \leftarrow \frac{\boldsymbol{s}_t}{1 - \beta_2^t} s^t1β2tst
上面两个式子中的分母可以起到放大梯度的效果,且分母都是随时间增大的,可以解决训练开始阶段 v t , s t v_{t},s_{t} vtst 偏小的问题,最后的公式更新为:
g t ′ ← η v ^ t s ^ t + ϵ \boldsymbol{g}_t' \leftarrow \frac{\eta \hat{\boldsymbol{v}}_t}{\sqrt{\hat{\boldsymbol{s}}_t} + \epsilon} gts^t +ϵηv^t
θ t ← θ t − 1 − g t ′ \boldsymbol{\theta}_t \leftarrow \boldsymbol{\theta}_{t-1} - \boldsymbol{g}_t' θtθt1gt
最后我们可以总结如下:

  • Momentum是通过改变梯度下降的方向来改进梯度下降方法的,本质是引入了历史的速度变量 v t − 1 v_{t-1} vt1 ,向量的加法会改变梯度的方向,作用有两点:
    • 有一定几率跳出局部最优解
    • 历史速度变量和当前梯度方向相反时,使得下降的过程更为平滑
  • Adagrad和RMSProp是通过历史梯度平方和开根号的状态变量 s_{t} 对于参数做衰减,由于不同参数的的状态变量不同,可以个性化地对梯度做衰减
  • Adam是RMSProp和Momentum的结合,为了避免训练开始时梯度过小的问题,引入了一个偏置处理。

最后我做了关于梯度下降法的一个思维导图:【机器学习】—— 各种梯度下降的变形momentum,adagrad,rmsprop,adam分别解决了什么问题_第4张图片
其中关于batch_size的部分可以参考我的另一篇博客机器学习深度学习】——学习率,梯度下降法,批梯度下降,归一化

你可能感兴趣的:(算法,深度学习,机器学习,机器学习笔记)