行业资讯

Pytorch中的优化器optimizer

作者:佚名 发布时间:2024-04-15 点击:

结合中的谈几种优化方法。方法分为2大类:一大类方法是SGD及其改进(加Momentum)另外一大类是Per-parameter adaptive learning rate methods(逐参数适应学习率方法),包括AdaGrad、RMSProp、Adam等。

1、torch.optim.SGD

当训练数据很大时,计算总的来求梯度代价很大,所以一个常用的方法是计算训练集中的小批量(),这就是。
的大小是一个超参数,通常使用2的指数,是因为在实际中许多向量化操作实现的时候,如果输入数据量是2的倍数,那么运算更快。

的缺点:
(1)
(2)到 局部极小值或者鞍点会导致为0,无法移动。而事实上,问题在高维问题中会更加常见。

 

功能:
可实现SGD优化算法带动量SGD优化算法带NAG(Nesterov accelerated gradient)动量SGD优化算法,并且均可拥有项。
参数:

  • - 参数组(参数组的概念请查看优化器基类:),优化器要管理的那部分参数。
  • - 初始学习率,可按需随着训练过程不断调整学习率。
  • - 动量,通常设置为0.9,0.8
  • - ,暂时不了解其功能,在源码中是这样用的:,值得注意的是,若采用,必须为 0.
  • - 权值衰减系数,也就是正则项的系数。选择一个合适的权重衰减系数非常重要,这个需要根据具体的情况去尝试,初步尝试可以使用 或者
  • - 选项,是否使用
SGD+Momentum

在中,类比成速度(矢量),类比成时间。(动量更新)就是我不仅要看当前时所在位置的速度向量,还要看上一步的速度(梯度),两个向量相加才是我想要的速度矢量:

 

在这里引入了一个初始化为0的变量和一个超参数。说得不恰当一点,这个变量()在最优化的过程中被看做动量(一般值设为0.9),
但其物理意义与摩擦系数更一致。这个变量有效地抑制了速度,降低了系统的动能,不然质点在山底永远不会停下来。通过交叉验证,这个参数通常设为中的一个。
和学习率随着时间退火类似,随时间变化的设置有时能略微改善最优化的效果,其中动量在学习过程的后阶段会上升。一个典型的设置是刚开始将动量设为0.5而在后面的多个周期()中慢慢提升到0.99。
中的 已经在中的参数中实现,顺便提醒一下中的实现机制和其他框架略有不同:

中是这样的:
v = ρ ? v + g v=ρ?v+g v=ρ?v+g
p = p ? l r ? v = p ? l r ? ρ ? v ? l r ? g p=p?lr?v = p - lr?ρ?v - lr?g p=p?lr?v=p?lr?ρ?v?lr?g
其他框架:
v = ρ ? v + l r ? g v=ρ?v+lr?g v=ρ?v+lr?g
p = p ? v = p ? ρ ? v ? l r ? g p=p?v = p - ρ?v - lr?g p=p?v=p?ρ?v?lr?g
ρ ρ ρ是动量, v v v是速率, g g g是梯度, p p p是参数,其实差别就是在 ρ ? v ρ?v ρ?v这一项。

Nesterov Momentum

实际上是拿着上一步的速度先走一小步,再看当前的梯度然后再走一步。
与 普通 的区别:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LWGegE8n-1595645320135)(C:\Users\Administrator\Desktop\2222222.png)]

 

既然我们知道动量将会把我们带到绿色箭头指向的点,我们就不要在原点(红色点)那里计算梯度了。使用动量,我们计算的梯度而不是“旧”位置的梯度。
在中,通过参数来实现。

2、 torch.optim.ASGD

 

功能:
也称为,均表示随机平均梯度下降,简单地说就是用空间换时间的一种,详细可参看论文
参数:

  • - 参数组,优化器要优化的那些参数。
  • - 初始学习率,可按需随着训练过程不断调整学习率。
  • - 衰减项,默认值。
  • ,默认值0.75。
  • ,默认值。
  • - 权值衰减系数,也就是正则项的系数。

3、 torch.optim.Rprop

 

功能:
实现优化方法(弹性反向传播),优化方法原文
该优化方法适用于,不适用于,因而在大行其道的时代里,很少见到。

4、 torch.optim.Adagrad

AdaGrad、RMSProp、Adam都属于Per-parameter adaptive learning rate methods(逐参数适应学习率方法):之前的方法是对所有的参数都是一个学习率,现在对不同的参数有不同的学习率。

 

注意,变量的尺寸和梯度矩阵的尺寸是一样的,还保持记录每个参数的梯度的平方和。
将用来归一化参数更新步长,归一化是逐元素进行的。注意,接收到较大梯度值的权重更新的学习率将减小,而接收到较小梯度值的权重的学习率将会变大。
有趣的是平方根的操作非常重要,如果去掉,算法的表现将会糟糕很多。用于平滑的式子(一般设为到之间)是防止出现除以0的情况。
的一个缺点是:在深度学习中单调的学习率被证明通常过于激进且过早停止学习。

 

功能:
实现优化方法(),是一种自适应优化方法,是自适应的为各个参数分配不同的学习率。这个学习率的变化,会受到梯度的大小和迭代次数的影响。梯度越大,学习率越小;梯度越小,学习率越大。缺点是训练后期,学习率过小,因为累加之前所有的梯度平方作为分母。
详细公式请阅读:Adaptive Subgradient Methods for Online Learning and Stochastic Optimization
John Duchi, Elad Hazan, Yoram Singer; 12(Jul):2121?2159, 2011.

5 、torch.optim.Adadelta

 

功能:
实现优化方法。是的改进。分母中采用距离当前时间点比较近的累计项,这可以避免在训练后期,学习率过小。
详细公式请阅读

6、 torch.optim.RMSprop

 

简单修改了方法,它做了一个梯度平方的滑动平均().
在上面的代码中,是一个超参数,常用的值是。
和中是一样的,但是变量是不同的。因此,仍然是基于梯度的大小来对每个权重的学习率进行修改,这同样效果不错。但是和Adagrad不同,其更新不会让学习率单调变小。
个人觉得,相较于的优点是在鞍点等地方,它在鞍点呆的越久,学习率会越大。

 

功能:
实现优化方法(提出),是均方根的意思。和一样,也是对的一种改进。采用均方根作为分母,可缓解学习率下降较快的问题。并且引入均方根,可以减少摆动,详细了解可读

7 、torch.optim.Adam(AMSGrad)

看起来像是的版,简化代码如下:

 

看起来真的和很像,除了使用的是平滑版的梯度,而不是用的原始梯度向量。
论文中推荐的参数值。
在实际操作中,我们推荐作为默认的算法,一般而言跑起来比要好一点。但是也可以试试动量。
完整的更新算法也包含了一个偏置()矫正机制,因为,两个矩阵初始为0,在没有完全热身之前存在偏差,需要采取一些补偿措施。

 

功能:
实现优化方法。是一种自适应学习率的优化方法,利用梯度的一阶矩估计和二阶矩估计动态的调整学习率。吴老师课上说过,是结合了和,并进行了偏差修正。
参数:
- 是否采用优化方法,优化方法是针对的改进,通过添加额外的约束,使学习率始终为正值。。
详细了解可阅读Adam: A Method for Stochastic Optimization

8 、torch.optim.Adamax

 

功能:
实现优化方法。是对增加了一个学习率上限的概念,所以也称之为Adamax。
详细了解可阅读Adam: A Method for Stochastic Optimization

9、 torch.optim.SparseAdam

 

功能:
针对稀疏张量的一种“阉割版”优化方法。

10、 torch.optim.LBFGS

 

功能:
实现优化方法。属于拟牛顿算法。是对的改进,特点就是节省内存。
使用注意事项:
This optimizer doesn’t support per-parameter options and parameter groups (there can be only one).
Right now all parameters have to be on a single device. This will be improved in the future.(2018-10-07)

 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aMU6KQCt-1595645320141)(C:\Users\Administrator\Desktop\optimizer\1.png)]

 
 
 
 
 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KQ5t99Dt-1595645320148)(C:\Users\Administrator\Desktop\optimizer\2.png)]

 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XbhI9W81-1595645320159)(C:\Users\Administrator\Desktop\optimizer\3.png)]

 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S6C1fWrf-1595645320161)(C:\Users\Administrator\Desktop\optimizer\4.png)]

 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v61TBXTr-1595645320163)(C:\Users\Administrator\Desktop\optimizer\5.png)]

 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qu95jxde-1595645320164)(C:\Users\Administrator\Desktop\optimizer\6.png)]

 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BsQiBxpr-1595645320165)(C:\Users\Administrator\Desktop\optimizer\7.png)]

一个有趣的现象是和走势非常相似,有空可以思考一下。

图片版权: Alec Radford
第一张图是损失函数的等高线:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RdNznrU8-1595645320167)(C:\Users\Administrator\Desktop\optimizer\8.gif)]

第二张图是在鞍点处的学习情况,注意很难突破对称性,一直卡在顶部。而之类的方法能够看到马鞍方向有很低的梯度。因为在更新方法中的分母项,算法提高了在该方向的有效学习率,使得能够继续前进:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-np9w19A3-1595645320168)(C:\Users\Administrator\Desktop\optimizer\9.gif)]

https://blog.csdn.net/qq_36589234/article/details/89330342?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

https://blog.csdn.net/u011995719/article/details/88988420

推荐资讯
推荐产品

平台注册入口