神经网络的参数更新

2017-09-02  本文已影响579人  WZFish0408

这个需要翻墙的外国网站写的很好:
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效果更好一点。

上一篇下一篇

猜你喜欢

热点阅读