CONTACT
时间:2024-09-09 13:12:48 点击量:
目录
写在前面
一、torch.optim.Adadelta
Adadelta代码
Adadelta算法解析
Adadelta总结
二、torch.optim.RMSprop
RMSprop代码
RMSprop算法解析
RMSprop总结
三、torch.optim.Adam(AMSGrad)
Adam代码
Adam算法解析
Adam总结
四、torch.optim.Adamax
Adamax代码
Adamax算法解析
Adamax总结
五、torch.optim.AdamW
AdamW代码
AdamW算法解析
AdamW总结
六、orch.optim.NAdam
NAdam代码
NAdam算法解析
NAdam总结
七、torch.optim.SparseAdam
SparseAdam代码
优化器系列文章列表
Pytorch优化器全总结(一)SGD、ASGD、Rprop、Adagrad_小殊小殊的博客-CSDN博客
Pytorch优化器全总结(二)Adadelta、RMSprop、Adam、Adamax、AdamW、NAdam、SparseAdam(重置版)_小殊小殊的博客-CSDN博客
写在前面
这篇文章是优化器系列的第二篇,也是最重要的一篇,上一篇文章介绍了几种基础的优化器,这篇文章讲介绍一些用的最多的优化器:Adadelta、RMSprop、Adam、Adamax、AdamW、NAdam、SparseAdam。这些优化器中Adadelta和RMSprop是对上一篇中Adagrad的优化;Adam结合了Momentum 和 RMSprop;Adamax、AdamW、NAdam又是对Adam的改进,可以看到优化器一步一步升级的过程,所以我们放在一篇文章中。
一、torch.optim.Adadelta
该类实现 Adadelta 优化方法。Adadelta 是 Adagrad 的改进。Adadelta 分母中采用距离
当前时间点比较近的累计项,这可以避免在训练后期,学习率过小。
Adadelta代码
‘’’
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
rho (float, 可选) – 用于计算平方梯度的运行平均值的系数(默认:0.9)
eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-6)
lr (float, 可选) – 在delta被应用到参数更新之前对它缩放的系数(默认:1.0)
weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)
‘’’
class torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)
Adadelta算法解析
为了解决AdaGrad算法中存在的缺陷,AdaGrad算法提出两点修改:
参数更新公式如下:
(7)
(8)
(9)
(11)
(12)
(13)
Adadelta总结
Adadelta是对AdaGrad的改造,用梯度平方的指数加权平均代替了全部梯度的平方和,用更新量的平方的指数加权平均来动态得代替了全局的标量的学习率。
优点:
缺点:
推荐程度:可以试试。
二、torch.optim.RMSprop
该类实现 RMSprop 优化方法(Hinton 提出),RMS 是均方根(root meam square)的意
思。RMSprop 和 Adadelta 一样,也是对 Adagrad 的一种改进。RMSprop 采用均方根作为分母,可缓解 Adagrad 学习率下降较快的问题,并且引入均方根,可以减少摆动。
RMSprop代码
‘’’
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
lr (float, 可选) – 学习率(默认:1e-2)
momentum (float, 可选) – 动量因子(默认:0),该参数的作用下面会说明。
alpha (float, 可选) – 平滑常数(默认:0.99)
eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)
centered (bool, 可选) – 如果为True,计算中心化的RMSProp,并且用它的方差预测值对梯度进行归一化
‘’’
class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
RMSprop算法解析
RMSprop与Adadelta属于同一时期的作品,都是对Adagrad的优化,解决了Adagrad多次迭代后,学习率将逐渐下降至0的问题。RMSProp算法将AdaGrad的梯度平方和累改加为指数加权的移动平均,使得其在非凸设定下效果更好。设定参数:全局初始率 默认设为0.001,decay rate ,默认设置为0.9,一个极小的常量 ,通常为10e-6,参数更新公式如下:
(14)
(15)
(16)
RMSprop总结
RMSprop算是Adagrad的一种发展,用梯度平方的指数加权平均代替了全部梯度的平方和,相当于只实现了Adadelta的第一个修改,效果趋于RMSprop和Adadelta二者之间。
优点:适合处理非平稳目标(包括季节性和周期性)——对于RNN效果很好
缺点:RMSprop依然依赖于全局学习率
推荐程度:推荐!
三、torch.optim.Adam(AMSGrad)
该类实现 Adam(Adaptive Moment Estimation))优化方法。Adam 是一种自适应学习率的优
化方法,Adam 利用梯度的一阶矩估计和二阶矩估计动态的调整学习率。Adam 是结合了 Momentum 和 RMSprop,并进行了偏差修正。
Adam代码
‘’’
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
lr (float, 可选) – 学习率(默认:1e-3)
betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)
eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)
‘’’
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
Adam算法解析
了解了Adagrad 和RMSProp之后,Adam 就很好理解了。Adam 不仅如 RMSProp 算法那样基于一阶矩均值计算适应性参数学习率,它同时还充分利用了梯度的二阶矩均值,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。推导过程如下:
(17)
(18)
(19)
(20)
(21)
Adam总结
在adam中,一阶矩来控制模型更新的方向,二阶矩控制步长(学习率)。利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。
优点:
1、结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
2、更新步长和梯度大小无关,只和alpha、beta_1、beta_2有关系。并且由它们决定步长的理论上限
3、更新的步长能够被限制在大致的范围内(初始学习率)
4、能较好的处理噪音样本,能天然地实现步长退火过程(自动调整学习率)
推荐程度:非常推荐
四、torch.optim.Adamax
该类实现 Adamax 优化方法。Adamax 是对 Adam 增加了一个学习率上限的概念,所以称之为 Adamax。
Adamax代码
‘’’
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
lr (float, 可选) – 学习率(默认:2e-3)
betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数
eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)
‘’’
class torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)
Adamax算法解析
adam的梯度更新规则都是反比于梯度的L2范数,即:
(23)
(24)
(25)
Adamax总结
Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。总的来说跟Adam效果差不了多少。
推荐程度:非常推荐
五、torch.optim.AdamW
该类实现AdamW,是Adam的进化版, 简单地说是Adam+权重衰减。
AdamW代码
‘’’
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
lr (float, 可选) – 学习率(默认:1e-3)
betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)
eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 1e-2)
amsgrad(boolean, optional) – 是否使用从论文On the Convergence of Adam and Beyond中提到的算法的AMSGrad变体(默认:False)
‘’’
class torch.optim.AdamW(params,lr=0.001,betas=(0.9,0.999),eps=1e08,weight_decay=0.01,amsgrad=False)
AdamW算法解析
1.adam+L2正则化
L2正则化往损失函数加入权重惩罚项 。对于SGD,使用L2正则化后,参数更新公式变为公式(1):
(27)
? (28)
? (29)
? (30)
? (31)
将式子(28)带入式子(29)然后再带入(31)得:
?(32)
(29)
AdamW总结
因为Adam的学习率自适应的,而L2正则遇到自适应学习率后效果不理想,所以使用adam+权重衰减的方式解决问题。多说一句,如果epoch比较多推荐使用 SGD(无momentum) + L2正则化;poch比较少推荐使用AdamW。
优点:比Adam收敛得更快,参数更稀疏
推荐程度:可以一试,BERT使用了adamW
六、orch.optim.NAdam
该类实现NAdam,NAdam是在 Adam 中引入 Nesterov 加速效果。
NAdam代码
‘’’
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
lr (float, 可选) – 学习率(默认:1e-3)
betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)
eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
weight_decay (float, 可选) – 动量衰减
foreach(boolean, optional) – 是否使用每个优化器的实现,可以添加一些复杂的foreach逻辑
‘’’
class torch.optim.NAdam(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, momentum_decay=0.004, foreach=None)
NAdam算法解析
首先回顾 NAG 的公式(详情可跳转Pytorch优化器全总结(一)SGD、ASGD、Rprop、Adagrad_小殊小殊的博客-CSDN博客):
? (30)
? (31)
? (32)
?(37)
? (38)
? (39)
NAdam总结
NAdam是在 Adam 中引入 Nesterov 加速效果。
七、torch.optim.SparseAdam
该类实现SparseAdam,不是很常用,是针对稀疏张量的一种“阉割版”Adam 优化方法。
SparseAdam代码
‘’’
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
lr (float, 可选) – 学习率(默认:1e-3)
betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)
eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
‘’’
class torch.optim.SparseAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08)
推荐程度:使用的较少,处理稀疏张量的时候考虑使用。
————————————————
版权声明:本文为CSDN博主「小殊小殊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xian0710830114/article/details/126882921
地址:海南省海口市玉沙路58号 电话:0898-88889999 手机:13988889999
Copyright © 2012-2018 首页-四方娱乐-注册登录站 ICP备案编:琼ICP备88889999号