Momentum
Momentum的公式表达
设时间步t的自变量为xt,学习率为ηt。在t0时刻,速度变量v0=0,在时间步t>0,Momentum关于速度变量vt=0和自变量θt的迭代方式为:
vtθt←γvt−1+ηtgt,←θt−1−vt,
其中 γ 为超参数,满足0≤γ<1。
从上面的式子我们可以看出
- 速度变量vt作用等价于梯度
- 速度变量vt的大小与上一个时刻的速度变量vt−1和学习率ηt有关,且γ越大,vt−1的作用越大。
- 由于vt=γvt−1+ηtgt=γ(γvt−2+ηtgt−1)+ηtgt=......,历史的速度变量都将影响当前速度变量的大小,且越近影响越大,相当于历史速度变量的加权平均,越近权重越大。
Momentum可以解决什么问题?
如上图1所示,在黄色箭头处,本身梯度为零,但是由于历史的速度变量不为零,会继续向右运动,而到达紫色箭头处时,梯度应该向左,但此时历史的速度变量如果较大且向右,有可能跳出局部最优点,当然,能不能跳出是很难保证的。
上图是一个梯度下降的图,如果采用momentum,则下降趋势如下
在下降开始阶段,历史速度变量和当前梯度方向相反,则会使得下降的过程更为平滑,避免过度震荡。
因此Momentum的主要作用在于:
- 有一定机率跳出局部最优解
- 历史速度变量和当前梯度方向相反时,使得下降的过程更为平滑
Adagrad
Adagrad的公式表示为
st←st−1+gt⊙gt,
其中⊙是按元素相乘。st为t时刻的状态变量,为从训练开始直到t时刻的所有梯度的平方和,我们更新目标函数的自变量θt:
θt←θt−1−st+ϵη⊙gt,
其中η是学习率,ϵ是为了维持数值稳定性的常数(避免数值溢出),通常非常小。
从上面的式子我们可以看出:
- Adagrad的分母是所有历史梯度的累加(均方差),因此历史梯度越大,当前更新越小。整体的思想是:之前更新大的参数,这次更新更新小一点,反之亦然
- Adagrad相比于之前介绍的方法,它根据不同参数具有不同的学习率(受分母影响)
- Adagrad在两种情况下,同一次更新中的某些参数学习率变得很小:
- 1.历史梯度存在很大的值,即参数曾经有过更新很快的记录
- 2.参数更新频率高,梯度为0的次数少,在学习过程中,梯度为0是很常见的,因此adagrad鼓励那些没怎么更新过的参数多更新一点。
- 3.Adagrad中分母是采用的累积,因此到训练后期学习率会小得令人发指,也就是说如果经过一定的迭代次数后模型还没有找到最优点,那就很难找到最优解了。
RMSProp
RMSProp全称是 Root Mean Square Prop,它和adagrad类似,可以使得不同的参数具有个性化的学习率,同时可以缓解训练后期学习率过小的问题,它的公式如下:
st←γst−1+(1−γ)gt⊙gt.
θt←θt−1−st+ϵη⊙gt,
其中0≤γ<1,可以看出与adagrad的区别在于状态变量st的计算对于历史的状态变量和当前梯度都做了衰减,因此再迭代过程中梯度不一定是一直衰减,也可能增大。
Adam
Adam可以看做RMSProp和Momentum的结合,类似有:
vt←γ1vt−1+(1−γ1)gt
st←γ2st−1+(1−γ2)gt⊙gt
作者建议的 γ1=0.9,γ2=0.999 ,那么在训练刚开始的时候由于 vt−1,st−1都比较小导致$ v_{t},s_{t} $较小,因此需要增加一个偏置:
v^t←1−β1tvt
s^t←1−β2tst
上面两个式子中的分母可以起到放大梯度的效果,且分母都是随时间增大的,可以解决训练开始阶段vt,st 偏小的问题,最后的公式更新为:
gt′←s^t+ϵηv^t
θt←θt−1−gt′
最后我们可以总结如下:
- Momentum是通过改变梯度下降的方向来改进梯度下降方法的,本质是引入了历史的速度变量 vt−1 ,向量的加法会改变梯度的方向,作用有两点:
- 有一定机率跳出局部最优解
- 历史速度变量和当前梯度方向相反时,使得下降的过程更为平滑
- Adagrad和RMSProp是通过历史梯度平方和开根号的状态变量 s_{t} 对于参数做衰减,由于不同参数的的状态变量不同,可以个性化地对梯度做衰减
- Adam是RMSProp和Momentum的结合,为了避免训练开始时梯度过小的问题,引入了一个偏置处理。
最后我做了关于梯度下降法的一个思维导图:
其中关于batch_size的部分可以参考我的另一篇博客机器学习深度学习】——学习率,梯度下降法,批梯度下降,归一化