以下来自:
https://my.oschina.net/u/2935389/blog/2967242
https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw

另外的一篇关于优化器的文章是(pytorch的十个优化器):
https://blog.csdn.net/tototuzuoquan/article/details/113779970

1.5.1.1.AdaGrad(自适应学习率算法)
1.5.1.2.AdaDelta
1.5.1.3.RmsProp
1.5.1.4.Adam
1.5.1.5.AdaMax
1.5.1.6.Nadam
1.5.1.7.AMSGrad
1.5.1.8.Nesterovs(动量的随机梯度下降法)
1.5.1.9.Sgd
1.5.1.10.momentum
1.5.1.11.经验之谈
1.5.1.12.引用

1.5.1.优化器

以下来自:
https://my.oschina.net/u/2935389/blog/2967242
https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw

1.5.1.1.AdaGrad(自适应学习率算法)

Adagrad其实是对学习率进行了一个约束。即:

再如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw中所述
在之前的算法当中,目标函数自变量的每一个元素在相同时刻都使用同一个学习率来自我迭代,但是这显然是一个不合理的假设,因为有的方向可能快有的可能就比较慢,我们应该个性化差异化的对待每一个变量。AdaGrad算法对每个参数都有一个缩放因子,这个缩放因子反比与历史上的梯度平方值总和的平方根。如果一个变量的损失梯度较大,那么它的下降速度也比较大,如果较小,下降速度也相应减小。具体算法如下:

AdaGrad算法有一个缺点,由于它的速率是一直下降的(分母的值一直在增加),前期下降快,后期下降慢,如果前期就没有找到一个比较好的解,那么他在后期速度非常慢,可能很难找到一个比较好的解。

1.5.1.2.AdaDelta

Adadelta是对Adagrad的扩展,最初方案依然是对学习率进行自适应约束,但是进行了计算上的简化。 Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。即:

在此处Adadelta其实还是依赖于全局学习率的,但是作者做了一定处理,经过近似牛顿迭代法之后:

其中,E代表求期望。
此时,可以看出Adadelta已经不用依赖于全局学习率了。

特点:
训练初中期,加速效果不错,很快。
训练后期,反复在局部最小值附近抖动。

再如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw所述:
该算法不需要设定学习率了,因为它已经不会影响到更新了,这也是该算法的一大优点。该算法在训练前中期速度都比较快,但是在后期会在局部最小值附近波动。

这个算法的基本思想是希望通过一阶的优化算法去近似二阶的优化算法。在1988年LeCun等人曾经提出一种用矩阵对角线元素来近似逆矩阵。如果学过数值分析的同学应该知道,牛顿法用Hessian矩阵替代人工设置的学习率,在梯度下降的时候,可以完美的找出下降方向,不会陷入局部最小值当中,是理想的方法,但是Hessian矩阵的逆在数据很大的情况下根本没办法求。

LeCun等人在2012年又提出了一个更为精确的近似:

这里的E[g_t-w:t]指的是从当前t开始的前w个梯度状态的期望值,E[g_t^2-w:t]指的是从当前t开始的前w个梯度状态的平方的期望值。这里如果求期望的话,非常的麻烦,所以采取了移动平均法来计算。这里作者在论文中也给出了近似的证明:

这里是当f为指数型函数,最后一个近似成立。
对于牛顿法:

由上式可得:

其中:

这里可以用局部的加权指数平滑来替代,即:

这里的RMS表示均方:

可以得到:

1.5.1.3.RmsProp

特点:
其实RMSprop依然依赖于全局学习率。
RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间。
适合处理非平稳目标——对于RNN效果很好。

再如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw中所说:
RMSProp算法是hinton对AdaGrad算法改进,这个算法据说只是hinton在课堂上面提出来的,没有发表相关论文。这个改动其实也很简单,将梯度累计改为移动加权平均,所以也没有什么神奇之处,思路还是比较简单。

当然这里也可以结合Nesterov动量得到结合Nesterov动量的RMSProp算法,具体如下:

1.5.1.4.Adam

Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:

特点:
结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点。
对内存需求较小
为不同的参数计算不同的自适应学习率。
也适用于大多数非凸优化–适用于大数据集和高维空间。

正如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw所示:

Adam是一个组合了动量法和RMSProp的优化算法,在该算法当中,动量被直接并入了梯度的一阶矩(指数加权)的估计,动量将用于缩放后的梯度,其次Adam包含了偏置修正,修正了从零点初始化的一阶矩和二阶矩的估计。第一个超参数ρ_1负责更新动量项,第二个超参数ρ_2负责更新RMSProp。

1.5.1.5.AdaMax

Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。公式上的变化如下:

可以看出,Adamax学习率的边界范围更简单。

1.5.1.6.Nadam

Nadam类似于带有Nesterov动量项的Adam。公式如下:

可以看出,Nadam对学习率有了更强的约束,同时对梯度的更新也有更直接的影响。一般而言,在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

1.5.1.7.AMSGrad

这是ICML2018年提出来的一个Adam的变体,这篇paper在盲评当中获得极高的分数,最近好像被接受为最佳论文。这篇论文提出了一个通用的边学习率算法框AdaGrad, RMSProp ,Adadelta,Adam等都可以看作是该框架的一种特例。通用的框架如下:

选择两个不同的函数,可以得到不一样的方法,从AdaGrad是两个函数可以看做分别是:

对于Adam而言,函数的选择是基于指数平滑法的:

对应的更新:

作者在论文中证明了Adam在应对一个简单的一维凸函数的优化问题时,都不能得到一个比较好的结果。作者去分析了,发现主要原因在于:

因为这一个是有可能为负的,当其为负的时候,就违背了Adam论文中的Γ_(t+1)半正定假设,因此作者主要就是去改进它,令其始终半正定。假设,因此作者主要就是去改进它,令其始终半正定。作者就想,那么v_(t+1)始终取上一个时刻的和当前估计的最大值就好了这样就可以了。

对于不带修正的AMSGRAD算法可以简单的写成如下:

1.5.1.8.Nesterovs(动量的随机梯度下降法)

这个是受到Nesterov动量的影响,Sutskever等人于2013年提出来的,具体算法过程如下:

这里就是在标准动量的基础之上,先更新一个临时的位置,然后计算该位置上的梯度,再用标准动量法进行估计,也就是在标准的动量法当中加入了一个校正因子。不过这种方法在凸的批量下降中能够加快收敛速度,但是在随机梯度当中效果并不明显。

1.5.1.9.Sgd

此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochastic gradient descent, 以及mini-batch gradient descent的具体区别就不细说了。现在的SGD一般都指mini-batch gradient descent。

SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了。即:

缺点:
选择合适的learning rate比较困难 - 对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了。
SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点【原来写的是“容易困于鞍点”,经查阅论文发现,其实在合适的初始化和step size的情况下,鞍点的影响并没这么大。感谢@冰橙的指正】

再如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw中介绍:
SGD:
首先介绍随机梯度下降法(SGD),随机梯度下降法是梯度下降法的一个特例,梯度下降法是沿着整个样本的梯度下降,但是由于在深度学习中整个样本太大了,比如ImageNet中有上百万张图片,这样计算效率太低。对于批量大小和对梯度估计的准确性的影响,有这样一个规律,批量中的数目越大,对于整个梯度估计得越准确,但是并不是呈线性上升的。小批量虽然比较慢,但是能够提供正则化的效果。

学习率通常设定为前期较快,后期较慢,为了达到这个效果,也有一些设定学习率的方法,比如:每隔一定步数,设定一个衰减,指数衰减,或者每步衰减为原来的几分之一等。

带有动量的SGD
在介绍带动量的SGD之前,首先介绍一下加权指数平滑,这个东西非常简单,但是在后续很多优化算法里面基本都会用到它。虽然随机梯度下降法很有效,但是为了加速它逃离鞍点,可以利用历史信息,其实也就是指数加权平均法。只是加权平均法就是如何结合历史信息和当前信息来优化。指数加权平均法具体公式如下:

如果把这个进行拆开,就会发现它本质是一个加权的平方和,比如这里如果t=5,β=0.1:

这里需要注意的是当第一个数的时候没有历史信息,所以需要引入偏差修正,也就是除以1-β^t ,随着t的增大,该项会趋于1,所以到了后期基本不会有什么影响。
对于动量的随机梯度下降法,其实就是带有指数加权平均的随机梯度下降法。

1.5.1.10.momentum

momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度。公式如下:

1.5.1.11.经验之谈

对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果

损失平面等高线

在鞍点处的比较

1.5.1.12.引用

[1] Adagrad (http://link.zhihu.com/?target=http%3A//www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf)
[2] RMSprop [Lecture 6e] (http://link.zhihu.com/?target=http%3A//www.cs.toronto.edu/%7Etijmen/csc321/lecture_notes.shtml)
[3] Adadelta (http://link.zhihu.com/?target=http%3A//arxiv.org/abs/1212.5701)
[4] Adam (http://link.zhihu.com/?target=http%3A//arxiv.org/abs/1412.6980v8)
[5] Nadam (http://link.zhihu.com/?target=http%3A//cs229.stanford.edu/proj2015/054_report.pdf)
[6] On the importance of initialization and momentum in deep learning (http://link.zhihu.com/?target=http%3A//www.cs.toronto.edu/%7Efritz/absps/momentum.pdf)
[7] Keras中文文档 (http://link.zhihu.com/?target=http%3A//keras-cn.readthedocs.io/en/latest/)
[8] Alec Radford(图) (http://link.zhihu.com/?target=https%3A//twitter.com/alecrad)
[9] An overview of gradient descent optimization algorithms (http://link.zhihu.com/?target=http%3A//sebastianruder.com/optimizing-gradient-descent/)
[10] Gradient Descent Only Converges to Minimizers (http://link.zhihu.com/?target=http%3A//www.jmlr.org/proceedings/papers/v49/lee16.pdf)
[11] Deep Learning:Nature (http://link.zhihu.com/?target=http%3A//www.nature.com/nature/journal/v521/n7553/abs/nature14539.html)

优化器(AdaGrad,AdaDelta,RmsProp,Adam,Nadam,Nesterovs,Sgd,momentum)相关推荐

  1. 优化算法SGD/ASGD/AdaGrad/Adadelta/RMSprop/Adam/Adamax/SparseAdam/L-BFGS/Rprop

    机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了. 不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了, ...

  2. 优化算法选择:SGD、SGDM、NAG、Adam、AdaGrad、RMSProp、Nadam

    目录 优化算法通用框架 SGD 系列:固定学习率的优化算法 SGD SGD (with Momentum) = SGD-M SGD(with Nesterov Acceleration)= NAG 自 ...

  3. 深度学习优化器Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论 ...

  4. 听六小桨讲AI | 第3期:优化器及其三种形式BGD、SGD以及MBGD

    点击左上方蓝字关注我们 本栏目由百度飞桨工程师联手精心打造,对深度学习的知识点进行由浅入深的剖析和讲解.大家可视它为深度学习百科(面试秘籍也是可以哒),当然也可收藏为深度学习查询手册~ 大家好,我是助 ...

  5. 深度学习梯度下降优化算法(AdaGrad、RMSProp、AdaDelta、Adam)(MXNet)

    在深度学习优化算法之动量法[公式推导](MXNet)中,动量法因为使用了指数加权移动平均,解决了自变量更新方向不一致的问题.动量法由于每个元素都使用了相同的学习率来做迭代,这也导致另外一个问题:如果x ...

  6. 各种优化算法总结(区别及联系)SGD Momentum NAG Aadagrad RMSprop AadaDelta Adam Nadam

    文章是最近整理的一些深度学习优化算法总结,具体参考文献见文章末尾: 刚刚开始接触优化算法,林林总总,认识总是很浅薄,但是当你拿过来看的时候,发现从刚刚开始的SGD到现在的adam.Nadam等,原理上 ...

  7. pytorch优化器详解:Adam

    目录 说明 Adam原理 梯度滑动平均 偏差纠正 Adam计算过程 pytorch Adam参数 params lr betas eps weight_decay amsgrad 说明 模型每次反向传 ...

  8. 深度学习中常用优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    本文转载自:https://www.cnblogs.com/guoyaohua/p/8542554.html 在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagr ...

  9. 【TensorFlow】优化方法optimizer总结(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)解析(十三)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/brucewong0516/article/details/78838124 本文仅对一些常见的优化方 ...

最新文章

  1. ros与下位机通信常用的c++ boost串口应用
  2. html字体颜色自动变化,js设置字体颜色_自动改变文字大小和颜色的js代码分享
  3. PPT,别让我们走错路
  4. Stone game(dp计数上海icpc网络预选赛)
  5. werkzeug response
  6. 用友CDM系统期初导入商品资料经验
  7. 用anaconda配置深度学习的环境,从配置环境到下载各种包,绝对学会,还是没学会留下评论,我看到会回答
  8. 数据结构之链表(Linked list)
  9. 贡献一个新浪的幻灯片(javascript)
  10. DX11 游戏开发笔记 (一) 资源介绍
  11. 3款常见的网站文章采集工具推荐(2019最新)
  12. X86系统中EAX、ECX、EDX、EBX寄存器的作用
  13. WEB相关:Windows下打造完美的服务器平台
  14. 没有NAS也要搭建私有云?花生棒+硬盘的一个任性玩法
  15. 海洋cms解析接口最新
  16. ASCII码------C语言
  17. 小白必备嵌入式开发学习内容
  18. 网络编程-基于MFC的仿QQ聊天室-2020
  19. BackhaulRateDlWLAN 和BackhaulRateUlWLAN WLAN回程线路上行和下行带宽
  20. c++中一个冒号“:”的使用

热门文章

  1. 廖雪峰python2.7教程_Python 2.7教程
  2. Web框架之Django_02基本操作(Django项目启动配置、数据库连接、orm、增删改查)
  3. 1.Python算法之枚举算法
  4. HTML+CSS做支付表单
  5. VTK:网格上插值网格用法实战
  6. opengl加载显示3D模型X类型文件
  7. wxWidgets:wxConfigPathChanger类用法
  8. wxWidgets:源代码概览
  9. boost::detail::spinlock相关的测试程序
  10. boost::polygon模块实现自定义polygon相关的测试程序