以下来自:
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.引用
以下来自:
https://my.oschina.net/u/2935389/blog/2967242
https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw
Adagrad其实是对学习率进行了一个约束。即:
再如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw中所述
在之前的算法当中,目标函数自变量的每一个元素在相同时刻都使用同一个学习率来自我迭代,但是这显然是一个不合理的假设,因为有的方向可能快有的可能就比较慢,我们应该个性化差异化的对待每一个变量。AdaGrad算法对每个参数都有一个缩放因子,这个缩放因子反比与历史上的梯度平方值总和的平方根。如果一个变量的损失梯度较大,那么它的下降速度也比较大,如果较小,下降速度也相应减小。具体算法如下:
AdaGrad算法有一个缺点,由于它的速率是一直下降的(分母的值一直在增加),前期下降快,后期下降慢,如果前期就没有找到一个比较好的解,那么他在后期速度非常慢,可能很难找到一个比较好的解。
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表示均方:
可以得到:
特点:
?其实RMSprop依然依赖于全局学习率。
?RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间。
?适合处理非平稳目标——对于RNN效果很好。
再如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw中所说:
RMSProp算法是hinton对AdaGrad算法改进,这个算法据说只是hinton在课堂上面提出来的,没有发表相关论文。这个改动其实也很简单,将梯度累计改为移动加权平均,所以也没有什么神奇之处,思路还是比较简单。
当然这里也可以结合Nesterov动量得到结合Nesterov动量的RMSProp算法,具体如下:
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:
特点:
?结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点。
?对内存需求较小
?为不同的参数计算不同的自适应学习率。
?也适用于大多数非凸优化–适用于大数据集和高维空间。
正如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw所示:
Adam是一个组合了动量法和RMSProp的优化算法,在该算法当中,动量被直接并入了梯度的一阶矩(指数加权)的估计,动量将用于缩放后的梯度,其次Adam包含了偏置修正,修正了从零点初始化的一阶矩和二阶矩的估计。第一个超参数ρ_1负责更新动量项,第二个超参数ρ_2负责更新RMSProp。
Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。公式上的变化如下:
可以看出,Adamax学习率的边界范围更简单。
Nadam类似于带有Nesterov动量项的Adam。公式如下:
可以看出,Nadam对学习率有了更强的约束,同时对梯度的更新也有更直接的影响。一般而言,在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。
这是ICML2018年提出来的一个Adam的变体,这篇paper在盲评当中获得极高的分数,最近好像被接受为最佳论文。这篇论文提出了一个通用的边学习率算法框AdaGrad, RMSProp ,Adadelta,Adam等都可以看作是该框架的一种特例。通用的框架如下:
选择两个不同的函数,可以得到不一样的方法,从AdaGrad是两个函数可以看做分别是:
对于Adam而言,函数的选择是基于指数平滑法的:
对应的更新:
作者在论文中证明了Adam在应对一个简单的一维凸函数的优化问题时,都不能得到一个比较好的结果。作者去分析了,发现主要原因在于:
因为这一个是有可能为负的,当其为负的时候,就违背了Adam论文中的Γ_(t+1)半正定假设,因此作者主要就是去改进它,令其始终半正定。假设,因此作者主要就是去改进它,令其始终半正定。作者就想,那么v_(t+1)始终取上一个时刻的和当前估计的最大值就好了这样就可以了。
对于不带修正的AMSGRAD算法可以简单的写成如下:
这个是受到Nesterov动量的影响,Sutskever等人于2013年提出来的,具体算法过程如下:
这里就是在标准动量的基础之上,先更新一个临时的位置,然后计算该位置上的梯度,再用标准动量法进行估计,也就是在标准的动量法当中加入了一个校正因子。不过这种方法在凸的批量下降中能够加快收敛速度,但是在随机梯度当中效果并不明显。
此处的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,所以到了后期基本不会有什么影响。
对于动量的随机梯度下降法,其实就是带有指数加权平均的随机梯度下降法。
momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度。公式如下:
?对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
?SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
?如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
?Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
?在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果
损失平面等高线
在鞍点处的比较
[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)
电 话:400-123-4567
传 真:+86-123-4567
手 机:13800000000
邮 箱:admin@eyoucms.com
地 址:广东省广州市天河区88号