这个需要翻墙的外国网站写的很好:
http://ruder.io/optimizing-gradient-descent/index.html#momentum
SGD遇到的问题
当两个方向上的梯度相差过大的时候会出现剧烈的震荡,如图:
在这个图中,垂直方向的梯度要远大于水平方向的梯度,这个时候在保证正确迭代的情况下,水平方向逐渐减小,而垂直方向开始剧烈震动,使得收敛的很慢。为了解决这个问题,提出了许多梯度下降的方法,有很好的效果。
Momentum
Momentum是为了解决剧烈震动提出的一种方法,效果如图所示:
它主要是通过添加一个参数γ在上一步的更新方向上。实现的方法是下面的式子:
η是学习速率,γ取值一般为0.9.
对于这种方法我们可以理解为我们对于前一步的变化进行了衰减,衰减率为γ,而且计算了现在的梯度,如果当前的梯度和上一次的方向一致,那么久增大这种变化,而如果方向相反则减小这种变化,参照上面的图的垂直方向,我们可以认为在垂直方向上第一次更新方向是往上的,假设变化了10,而第二次的梯度是往下的与第一次相反,在衰减后在进行调整可以认为向下移动只有5,从而减小了垂直方向的变化,达到减小震动效果。
Nestrov Momentum
Nestrov是根据Momentum进行的改进,它使得更新更加的智能更加具有前瞻性,通过公式我们可以与Momentum进行以下比较:
两者主要的区别在于梯度的计算,Momentum计算的参数在当前位置的梯度,而Nestrov首先估计了参数在更新后的大致位置,那就是参数在向上一步的方向继续运动,也就是θ-γvt-1然后计算该位置的梯度作为对更新方向的纠正,一张很形象的图是:
其中较长的蓝色的线是前一步的梯度,而棕色线是先向该方向进行移动,我认为可以理解为γvt-1,而红色的就是在更新后的位置计算的梯度,对原先的移动进行修正,最后得到当前的v也就是绿色的向量,从而对参数进行更新。
http://www.360doc.com/content/16/1010/08/36492363_597225745.shtml
这篇文章通过对原来公式的变形,可以看出该算法实际上是考虑了二阶导信息,类似于牛顿迭代法从而使得迭代更加快速。
Adagrad
一种自适应学习速率的迭代算法,主体的更新过程就是最基础的
而主要的改变在于学习速率,Adagrad的更新册率如下:
其中η为初始学习速率gt为第t次的梯度,而ε是一个防止除数为0的很小的数,一般是1*10-8,随着逐渐的更新梯度的平方和逐渐在增大,而学习速率在减小。
缺点
1.学习速率单调递减,后期学习速率很小趋近于0。
2.需要手工设置初始学习率。
Adadelta和RMSprop
两者是相同的,都是为了解决Adagrad的缺点,在Adadelta中我们通过衰减来使用最近的梯度的平方,通过使用期望来保证它不会过大而是学习率降为0.而期望的更新是带权的,这个权就是衰减系数,具体的公式如下:
ρ是衰减系数,可以理解为通过每一次的衰减只使用附近的梯度平方,较长时间之前的梯度随着衰减逐渐消失。到这一步是RMSprop,但是仍然存在超参数初始学习速率,Hinton建议学习速率为0.001γ定为0.9
Adadelta的推导
Adadelta解决了超参学习速率的问题,证明来自于:
http://www.cnblogs.com/neopenx/p/4768388.html
特点
1.训练初中期,加速效果不错,很快
2.训练后期,反复在局部最小值附近抖动
Adam
目前最好的更新方法,一般就用它。
来自:https://zhuanlan.zhihu.com/p/22252270
矩估计就是数学期望。。。。
特点:
1.结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
2.对内存需求较小
3.为不同的参数计算不同的自适应学习率
4.也适用于大多非凸优化 - 适用于大数据集和高维空间
Nadam
类似带有Nesterov动量项的Adam,公式:
能用Adam的用Nadam效果更好一点。