神经网络——优化器

深度学习优化算法经历了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 这样的发展历程。入门级必从SGD学起,老司机则会告诉你更好的还有AdaGrad/AdaDelta,或者直接无脑用Adam。可是看看学术界的最新paper,却发现一众大神还在用着入门级的SGD,最多加个Moment或者Nesterov ,还经常会黑一下Adam。

 

优化算法框架

SGD with Momentum

为了抑制SGD的震荡,SGDM 在梯度下降过程 加入惯性。

带动量的梯度SGDM:t时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前累积的下降方向决定。下降方向主要是此前累积的下降方向,并略微偏向当前时刻的下降方向

SGD with Nesterov Acceleration 

困在局部最优的沟壑里面震荡。不能停留在当前位置去观察未来的方向,而要向前一步、多看一步、看远一些。

在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走不计算当前位置的梯度方向,而是计算如果按照累积动量走了一步,那个时候的下降方向:

下一个点的梯度方向,与历史累积动量相结合,计算步骤2中当前时刻的累积动量。

AdaGrad

二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。

对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。

AdaDelta / RMSProp

AdaGrad单调递减的学习率变化过于激进。只关注过去一段时间窗口的下降梯度。避免了二阶动量持续累积、导致训练过程提前结束的问题。

Adam

SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。

把一阶动量和二阶动量都用起来,就是Adam了——Adaptive + Momentum。

Nadam

 

总结

sgd->mini batch sgd->全量gd【训练速度,单样本不稳定】

带动量的sgd->NAG(先利用动量往前走一步,再更新梯度;然后再用新梯度和历史动量结合)

adagrad(二阶动量对学习率自适应)->adadelta(只使用一个时间窗口内的二阶动量)

adam(sgd的一阶动量+adadelta的二阶动量)

 

ADAM的坑

可能不收敛

https://openreview.net/forum?id=ryQu7f-RZ

SGD学习率衰减和AdaGrad二阶动量累计~学习率不断递减,最终收敛到0,模型也得以收敛。

AdaDelta和Adam则不然。二阶动量是固定时间窗口内的累积,随着时间窗口的变化,遇到的数据可能发生巨变,使得二阶动量可能会时大时小,不是单调变化。这就可能在训练后期引起学习率的震荡,导致模型无法收敛。

由于Adam中的学习率主要是由二阶动量控制的,为了保证算法的收敛,可以对二阶动量的变化进行控制,避免上下波动。

可能错过全局最优解

深度神经网络往往包含大量的参数,在这样一个维度极高的空间内,非凸的目标函数往往起起伏伏,拥有无数个高地和洼地。有的是高地,通过引入动量可能很容易越过;但有些是洼地,可能探索很多次都出不来,于是停止了训练。

https://arxiv.org/abs/1705.08292

自适应学习率算法可能会对前期出现的特征过拟合,后期才出现的特征很难纠正前期的拟合效果

https://arxiv.org/abs/1712.07628

Adam的收敛速度比SGD要快,但最终收敛的结果并没有SGD好。主要是后期Adam的学习率太低,影响了有效的收敛。他们试着对Adam的学习率的下界进行控制,发现效果好了很多。

一个用来改进Adam的方法:前期用Adam,享受Adam快速收敛的优势;后期切换到SGD,慢慢寻找最优解。选择切换的时机和切换后的学习率。

 

优化算法的选择与使用策略

Adam+SGD的组合策略,以及一些比较有用的tricks。

不同优化算法最核心的区别,就是第三步所执行的下降方向。

 

 

参考文献:

https://zhuanlan.zhihu.com/p/32230623

https://zhuanlan.zhihu.com/p/32262540

https://zhuanlan.zhihu.com/p/32338983

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值