优化器(AdaGrad,AdaDelta,RmsProp,Adam,Nadam,Nesterovs,Sgd,momentum)

以下来自:
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)

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值