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

Momentum

Momentum的公式表达

设时间步tt的自变量为xt\boldsymbol{x}_t,学习率为ηt\eta_t。在t0t_0时刻,速度变量v0=0\boldsymbol{v}_0=0,在时间步t>0t>0,Momentum关于速度变量vt=0\boldsymbol{v}_t=0和自变量θt\boldsymbol{\theta}_t的迭代方式为:
vtγvt1+ηtgt,θtθt1vt, \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}
其中 γ\gamma 为超参数,满足0γ<10 \leq \gamma < 1
从上面的式子我们可以看出

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

Momentum可以解决什么问题?

Momentum梯度下降图1
如上图1所示,在黄色箭头处,本身梯度为零,但是由于历史的速度变量不为零,会继续向右运动,而到达紫色箭头处时,梯度应该向左,但此时历史的速度变量如果较大且向右,有可能跳出局部最优点,当然,能不能跳出是很难保证的。
Momentum梯度下降图2
上图是一个梯度下降的图,如果采用momentum,则下降趋势如下
在这里插入图片描述
在下降开始阶段,历史速度变量和当前梯度方向相反,则会使得下降的过程更为平滑,避免过度震荡。
因此Momentum的主要作用在于:

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

Adagrad

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

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

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

RMSProp

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

Adam

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

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

最后我做了关于梯度下降法的一个思维导图:在这里插入图片描述
其中关于batch_size的部分可以参考我的另一篇博客机器学习深度学习】——学习率,梯度下降法,批梯度下降,归一化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章