收藏 | 各种 Optimizer 梯度下降优化算法回顾和总结
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
本文转自|深度学习这件小事
论文标题:An overview of gradient descent optimization algorithms
原文链接:https://arxiv.org/pdf/1609.04747.pdfGithub:NLP相关Paper笔记和代码复现(https://github.com/DengBoCong/nlp-paper)
说明:阅读论文时进行相关思想、结构、优缺点,内容进行提炼和记录,论文和相关引用会标明出处,引用之处如有侵权,烦请告知删除。
写在前面
-
计算目标函数关于当前参数的梯度: -
根据历史梯度计算一阶动量和二阶动量: -
计算当前时刻的下降梯度: -
根据下降梯度进行更新:
-
鞍点:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。例如这个二维图形,像个马鞍:在x-轴方向往上曲,在y-轴方向往下曲,鞍点就是(0,0)。
-
指数加权平均、偏差修正:可参见这篇文章
Gradient Descent(GD)
-
训练速度慢:在应用于大型数据集中,每输入一个样本都要更新一次参数,且每次迭代都要遍历所有的样本,会使得训练过程及其缓慢,需要花费很长时间才能得到收敛解。 -
容易陷入局部最优解:由于是在有限视距内寻找下山的反向,当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。所谓的局部最优解就是鞍点,落入鞍点,梯度为0,使得模型参数不在继续更新。
Batch Gradient Descent(BGD)
Stochastic Gradient Descent(SGD)
-
虽然看起来SGD波动非常大,会走很多弯路,但是对梯度的要求很低(计算梯度快),而且对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。 -
应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个SGD梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。
-
SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确(次要)。 -
SGD也没能单独克服局部最优解的问题(主要)。
Mini-batch Gradient Descent(MBGD,也叫作SGD)
-
Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点)。对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点所有维度的梯度都接近于0,SGD 很容易被困在这里(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是BGD的训练集全集带入,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动)。 -
SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新, 且learning rate会随着更新的次数逐渐变小。
Momentum
-
随机梯度的方法(引入的噪声) -
Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)。
Nesterov Accelerated Gradient
Adagrad
-
仍需要手工设置一个全局学习率 , 如果 设置过大的话,会使regularizer过于敏感,对梯度的调节太大 -
中后期,分母上梯度累加的平方和会越来越大,使得参数更新量趋近于0,使得训练提前结束,无法学习
Adadelta
-
训练初中期,加速效果不错,很快 -
训练后期,反复在局部最小值附近抖动
RMSprop
-
其实RMSprop依然依赖于全局学习率 -
RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间 -
适合处理非平稳目标(包括季节性和周期性)——对于RNN效果很好
Adaptive Moment Estimation(Adam)
-
Adam梯度经过偏置校正后,每一次迭代学习率都有一个固定范围,使得参数比较平稳。 -
结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点 -
为不同的参数计算不同的自适应学习率 -
也适用于大多非凸优化问题——适用于大数据集和高维空间。
AdaMax
Nadam
-
下图描述了在一个曲面上,6种优化器的表现:
-
下图在一个存在鞍点的曲面,比较6中优化器的性能表现:
-
下图图比较了6种优化器收敛到目标点(五角星)的运行过程
总结
-
对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值 -
SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠 -
如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。 -
Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。 -
在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果 -
如果验证损失较长时间没有得到改善,可以停止训练。 -
添加梯度噪声(高斯分布 )到参数更新,可使网络对不良初始化更加健壮,并有助于训练特别深而复杂的网络。
-
An overview of gradient descent optimization algorithms(https://ruder.io/optimizing-gradient-descent/) -
深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)(https://zhuanlan.zhihu.com/p/22252270) -
visualize_optimizers(https://github.com/snnclsr/visualize_optimizers) -
lossfunctions(https://lossfunctions.tumblr.com/) -
优化算法Optimizer比较和总结(https://zhuanlan.zhihu.com/p/55150256) -
一个框架看懂优化算法之异同 SGD/AdaGrad/Adam(https://zhuanlan.zhihu.com/p/32230623) -
深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)(https://www.cnblogs.com/guoyaohua/p/8542554.html) -
机器学习:各种优化器Optimizer的总结与比较(https://blog.csdn.net/weixin_40170902/article/details/80092628) -
optimizer优化算法总结(https://blog.csdn.net/muyu709287760/article/details/62531509#%E4%B8%89%E7%A7%8Dgradient-descent%E5%AF%B9%E6%AF%94)
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
评论