Pytorch的优化器总结归纳

pytorch的几类优化器

笔记总结自:
https://pytorch.org/docs/stable/optim.html
在博客https://www.jianshu.com/p/39dac1e24709基础上更新了Nadam算法以及Radam算法。方便大家学习交流
这里有pytorch中文文档:https://ptorch.com/docs/1/optim
以及https://www.cntofu.com/book/169/docs/1.0/optim.md

import torch
import torch.nn as nn
from torch.utils.data import DataLoader
  1. SGD :使用动量(Momentum)可以一试,使用牛顿加速度(NAG)不如不试
  2. ASGD :很少见
  3. Adagrad :不推荐
  4. Adadelta :可以一试
  5. Rprop :不推荐
  6. RMSprop :推荐
  7. Adam :非常推荐
  8. Adamax:非常推荐
  9. Nadam:非常推荐
  10. SparseAdam:推荐
  11. AdamW:非常推荐,观望
  12. L-BFGS:非常推荐,酌情选择
  13. Radam:非常推荐

1、SGD(随机梯度下降)

torch.optim.SGD(params,lr=<required parameter>,momentum=0,dampening=0,weight_decay=0,nesterov=False)
参数:
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--lr (float) – 学习率
--momentum (float, 可选) – 动量因子(默认:0,通常设置为0.90.8--weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认:0--dampening (float, 可选) – 动量的抑制因子(默认:0--nesterov (bool, 可选) – 使用Nesterov动量(默认:False

优点:①使用mini-batch的时候,可以收敛得很快
缺点:①在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确;②不能解决局部最优解的问题

a、使用动量(Momentum)的随机梯度下降法(SGD):
用法为在torch.optim.SGD的momentum参数不为零。
优点:加快收敛速度,有一定摆脱局部最优的能力,一定程度上缓解了没有动量的时候的问题;缺点:更新的时候在一定程度上保留之前更新的方向,仍然继承了一部分SGD的缺点。
b、使用牛顿加速度(NAG, Nesterov accelerated gradient)的随机梯度下降法(SGD):
理解为往标准动量中添加了一个校正因子。
优点:梯度下降方向更加准确;缺点:对收敛率的作用却不是很大。

2、ASGD(随机平均梯度下降)

torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--lr (float, 可选) – 学习率(默认:1e-2--lambd (float, 可选) – 衰减项(默认:1e-4--alpha (float, 可选) – eta更新的指数(默认:0.75--t0 (float, 可选) – 指明在哪一次开始平均化(默认:1e6--weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0

a、使用动量(Momentum)的随机梯度下降法(SGD);b、使用牛顿加速度(NAG, Nesterov accelerated gradient)的随机梯度下降法(SGD)。优缺点类似同上。

3、AdaGrad算法

torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10)
参数:
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--lr (float, 可选) – 学习率(默认: 1e-2--lr_decay (float, 可选) – 学习率衰减(默认: 0--weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0

独立地适应所有模型参数的学习率,梯度越大,学习率越小;梯度越小,学习率越大。Adagrad适用于数据稀疏或者分布不平衡的数据集

4、AdaDelta算法

torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)
参数:
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--rho (float, 可选) – 用于计算平方梯度的运行平均值的系数(默认:0.9--eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-6--lr (float, 可选) – 在delta被应用到参数更新之前对它缩放的系数(默认:1.0--weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0

是Adagard的改进版,对学习率进行自适应约束,但是进行了计算上的简化,加速效果不错,训练速度快。
优点:避免在训练后期,学习率过小;初期和中期,加速效果不错,训练速度快
缺点:还是需要自己手动指定初始学习率,初始梯度很大的话,会导致整个训练过程的学习率一直很小,在模型训练的后期,模型会反复地在局部最小值附近抖动,从而导致学习时间变长

5、Rprop(弹性反向传播)

torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))
参数
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--lr (float, 可选) – 学习率(默认:1e-2--etas (Tuple[float,float], 可选) – 一对(etaminus,etaplis), 它们分别是乘法的增加和减小的因子(默认:0.51.2--step_sizes (Tuple[float,float], 可选) – 允许的一对最小和最大的步长(默认:1e-650

1、首先为各权重变化赋一个初始值,设定权重变化加速因子与减速因子。
2、在网络前馈迭代中当连续误差梯度符号不变时,采用加速策略,加快训练速度;当连续误差梯度符号变化时,采用减速策略,以期稳定收敛。
3、网络结合当前误差梯度符号与变化步长实现BP,同时,为了避免网络学习发生振荡或下溢,算法要求设定权重变化的上下限。
缺点:优化方法适用于full-batch,不适用于mini-batch,因此基本上没什么用

6、RMSProp(Root Mean Square Prop,均方根传递)

torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
参数
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--lr (float, 可选) – 学习率(默认:1e-2--momentum (float, 可选) – 动量因子(默认:0--alpha (float, 可选) – 平滑常数(默认:0.99--eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8--centered (bool, 可选) – 如果为True,计算中心化的RMSProp,并且用它的方差预测值对梯度进行归一化
--weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0

RProp的改进版,也是Adagard的改进版
思想:梯度震动较大的项,在下降时,减小其下降速度;对于震动幅度小的项,在下降时,加速其下降速度
RMSprop采用均方根作为分母,可缓解Adagrad学习率下降较快的问题。对于RNN有很好的效果
优点:可缓解Adagrad学习率下降较快的问题,并且引入均方根,可以减少摆动,适合处理非平稳目标,对于RNN效果很好
缺点:依然依赖于全局学习率

7、Adam(AMSGrad)

torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)
参数
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--lr (float, 可选) – 学习率(默认:1e-3--betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.90.999--eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8--weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0

将Momentum算法和RMSProp算法结合起来使用的一种算法,既用动量来累积梯度,又使得收敛速度更快同时使得波动的幅度更小,并进行了偏差修正。
优点:
1、对目标函数没有平稳要求,即loss function可以随着时间变化
2、参数的更新不受梯度的伸缩变换影响
3、更新步长和梯度大小无关,只和alpha、beta_1、beta_2有关系。并且由它们决定步长的理论上限
4、更新的步长能够被限制在大致的范围内(初始学习率)
5、能较好的处理噪音样本,能天然地实现步长退火过程(自动调整学习率)
6、很适合应用于大规模的数据及参数的场景、不稳定目标函数、梯度稀疏或梯度存在很大噪声的问题

8、Adamax

torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)
参数:
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--lr (float, 可选) – 学习率(默认:2e-3--betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数
--eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8--weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0

Adam的改进版,对Adam增加了一个学习率上限的概念,是Adam的一种基于无穷范数的变种。
优点:对学习率的上限提供了一个更简单的范围

9、Nadam

torch.optim.NAdam(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, momentum_decay=0.004)
参数:
params (iterable)– 用于优化或定义参数组的参数列表
lr (float, optional) – 学习率(default: 2e-3)
betas (Tuple[float, float], optional) – 用于计算梯度及其平方的运行平均值的系数 (default: (0.9, 0.999))
eps (float, optional) – 添加到分母中以提高数值稳定性的项(default: 1e-8)
weight_decay (float, optional) – 权重衰减 (L2 penalty) (default: 0)
momentum_decay (float, optional) – 动量衰变 (default: 4e-3)

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

10、SparseAdam

torch.optim.SparseAdam(params,lr=0.001,betas=(0.9,0.999),eps=1e-08)
参数
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--lr (float, 可选) – 学习率(默认:2e-3--betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.90.999--eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8

针对稀疏张量的一种“阉割版”Adam优化方法。优点:相当于Adam的稀疏张量专用版本

11、AdamW

torch.optim.AdamW(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01, amsgrad=False)
参数
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--lr (float, 可选) – 学习率(默认:1e-3--betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.90.999--eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8--weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 1e-2--amsgrad(boolean, optional) – 是否使用从论文On the Convergence of Adam and Beyond中提到的算法的AMSGrad变体(默认:False

Adam的进化版,是目前训练神经网络最快的方式
优点:比Adam收敛得更快
缺点:只有fastai使用,缺乏广泛的框架,而且也具有很大的争议性

12、L-BFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno)

torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100,line_search_fn=None)
参数
--lr (float) – 学习率(默认:1--max_iter (int) – 每一步优化的最大迭代次数(默认:20)
--max_eval (int) – 每一步优化的最大函数评价次数(默认:max * 1.25--tolerance_grad (float) – 一阶最优的终止容忍度(默认:1e-5--tolerance_change (float) – 在函数值/参数变化量上的终止容忍度(默认:1e-9--history_size (int) – 更新历史的大小(默认:100

是一种在牛顿法基础上提出的一种求解函数根的算法,简单来说,L-BFGS和梯度下降、SGD干的同样的事情,但大多数情况下收敛速度更快
L-BFGS是对BFGS的改进,特点就是节省内存
是解无约束非线性规划问题最常用的方法。
警告:
这个optimizer不支持为每个参数单独设置选项以及不支持参数组(只能有一个)
目前所有的参数不得不都在同一设备上。在将来这会得到改进。
注意:
这是一个内存高度密集的optimizer(它要求额外的param_bytes * (history_size + 1)个字节)。内存不符合要求,尝试减小history size,或者使用不同的算法。

13、Radam

torch.optim.RAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)
参数
params (iterable) – 用于优化或定义参数组的参数列表
lr (float, optional) – 学习率 (default: 2e-3)
betas (Tuple[float, float], optional) – 用于计算梯度及其平方的运行平均值的系数 (default: (0.9, 0.999))
eps (float, optional) – 添加到分母中以提高数值稳定性的项 (default: 1e-8)
weight_decay (float, optional) – 权重衰减 (L2 penalty) (default: 0)

你可能感兴趣的:(python,pytorch)