优化
本页面包含 timm
中包括的学习率优化器的 API 参考文档。
优化器
工厂函数
向后兼容的旧优化器工厂。注意:使用 create_optimizer_v2 适用于新代码。
timm.optim.create_optimizer_v2
< source >( model_or_params opt: str = 'sgd' lr: Optional = None weight_decay: float = 0.0 momentum: float = 0.9 foreach: Optional = None filter_bias_and_bn: bool = True layer_decay: Optional = None param_group_fn: Optional = None **kwargs )
创建一个优化器。
待办事项:当前模型被传递,所有参数均用于优化。对于更通用的情况,应提供一个接口,允许选择要优化的参数和 lr 组,例如:
- 一个过滤器fn接口,将参数以与weight_decay兼容的方式进一步分组
- 公开参数接口,并留给调用者决定
优化器类
类 timm.optim.AdaBelief
< 源 >( params lr = 0.001 betas = (0.9, 0.999) eps = 1e-16 weight_decay = 0 amsgrad = False decoupled_decay = True fixed_decay = False rectify = True degenerated_to_sgd = True )
参数
- params (可迭代对象) — 要优化的参数的迭代器或定义参数组的字典
- lr (浮点数,可选) — 学习率(默认:1e-3)
- betas (浮点数元组,可选) — 用于计算梯度及其平方的运行平均值系数(默认:(0.9, 0.999))
- eps (浮点数,可选) — 添加到分母以改善数值稳定性的项(默认:1e-16)
- weight_decay (浮点数,可选) —— 权重衰减(L2惩罚)(默认:0)
- amsgrad (布尔值,可选) —— 是否使用来自于论文《On the Convergence of Adam and Beyond》中的此算法的 AMSGrad 变体(默认:False)
- decoupled_decay (布尔值,可选) —— (默认:True) 如果设为 True,则优化器使用AdamW中的解除耦合权重衰减
- fixed_decay (布尔值,可选) — (默认:False) 这在weightdecouple设置为True时使用。当fixed_decay == True时,权重衰减按照$W{new} = W{old} - W{old} \times decay$执行。当fixed_decay == False时,权重衰减按照$W{new} = W{old} - W{old} \times decay \times lr$执行。注意,在这种情况下,权重衰减比随着学习率(lr)降低。
- rectify (布尔值,可选) — (默认:True) 如果设置为True,则执行类似RAdam的校正更新
- degenerated_to_sgd (布尔值,可选) (默认 —True) 如果设置为True,则在梯度方差较高时执行SGD更新
实现AdaBelief算法。修改自PyTorch中的Adam
参考:AdaBelief Optimizer,通过观察梯度的信任度来调整步骤大小,NeurIPS 2020
关于完整的推荐超参数表格,请参阅https://github.com/juntang-zhuang/Adabelief-Optimizer’ 例如,EfficientNet的训练/args请查看这些gists
- 训练脚本链接:https://gist.github.com/juntang-zhuang/0a501dd51c02278d952cf159bc233037
- args.yaml链接:https://gist.github.com/juntang-zhuang/517ce3c27022b908bb93f78e4f786dc3
执行一个优化步骤。
类 timm.optim.Adafactor
< source >( params lr = None eps = 1e-30 eps_scale = 0.001 eps_scale = 0.001 clip_threshold = 1.0 decay_rate = -0.8 betas = None weight_decay = 0.0 scale_parameter = True warmup_init = False )
参数
- params (迭代) — 要优化的参数的迭代或定义参数组的字典
- lr (浮点数,可选) — 外部学习率(默认:None)
- eps (元组[float, float]) — 分别为平方梯度和参数缩放的正则化常数(默认:(1e-30, 1e-3))
- clip_threshold (浮点数) — 最终梯度更新的均方根阈值(默认:1.0)
- decay_rate (浮点数) — 用于计算平方梯度移动平均的系数(默认:-0.8)
- beta1 (浮点数) — 用于计算梯度移动平均的系数(默认:None)
- weight_decay (浮点数,可选) — 权重衰减(L2惩罚)(默认:0)
- scale_parameter (布尔值) — 如果为True,则学习率通过参数的根均值平方进行缩放(默认:True)
- warmup_init (布尔值) — 时间相关的学习率计算取决于是否使用预热初始化(默认:False)
实现了Adafactor算法。此实现基于:Adafactor:自适应学习率,内存成本线性
(参见https://arxiv.org/abs/1804.04235)
请注意,此优化器内部根据scale_parameter,relative_step和warmup_init选项调整学习率。
要使用手动(外部)学习率计划,应将scale_parameter=False
和relative_step=False
。
执行一个优化步骤。
类 timm.optim.Adahessian
< 源代码 >( params lr = 0.1 betas = (0.9, 0.999) eps = 1e-08 weight_decay = 0.0 hessian_power = 1.0 update_each = 1 n_samples = 1 avg_conv_kernel = False )
参数
- params (可迭代项) — 要优化的参数的可迭代项或定义参数组的字典
- lr (浮点数,可选) — 学习率(默认:0.1)
- betas ((浮点数,浮点数),可选) — 用于计算梯度运行平均值和Hessian迹平方的系数(默认:(0.9, 0.999))
- eps (浮点数,可选) — 加到分母中以改善数值稳定性(默认:1e-8)
- weight_decay (浮点数,可选) — 权重衰减(L2 惩罚)(默认:0.0)
- hessian_power (浮点数,可选) — Hessian 迹的指数(默认:1.0)
- update_each (整数,可选) — 在 这个 步数后计算 Hessian 迹近似(以节省时间)(默认:1)
- n_samples (整型,可选) —— 样本
z
的次数,以近似 hessian 迹 (默认: 1)
实现了来自“ADAHESSIAN:适用于机器学习的自适应二阶优化器”的 AdaHessian 算法
获取所有具有梯度的所有 param_groups 参数
计算 hessian 迹的 Hutchinson 近似,并为每个可训练参数累积。
执行一个优化步骤。
清空累加的海森矩阵痕迹。
类 timm.optim.AdamP
< 源码 >( params lr = 0.001 betas = (0.9, 0.999) eps = 1e-08 weight_decay = 0 delta = 0.1 wd_ratio = 0.1 nesterov = False )
类 timm.optim.AdamW
< 源码 >( params lr = 0.001 betas = (0.9, 0.999) eps = 1e-08 weight_decay = 0.01 amsgrad = False )
实现了AdamW算法。
原始的Adam算法在《Adam:用于随机优化的方法》中被提出。AdamW变异在《解耦权重衰减正则化》中被提出。
.. _Adam:用于随机优化的方法: https://arxiv.org/abs/1412.6980 .. _解耦权重衰减正则化: https://arxiv.org/abs/1711.05101 .. _On the Convergence of Adam and Beyond: https://openreview.net/forum?id=ryQu7f-RZ
执行一个优化步骤。
类 timm.optim.Lamb
< source >( params lr = 0.001 bias_correction = True betas = (0.9, 0.999) eps = 1e-06 weight_decay = 0.01 grad_averaging = True max_grad_norm = 1.0 trust_clip = False always_adapt = False )
参数
- params (可迭代对象) — 要优化的参数的可迭代对象或定义参数组的字典。
- lr (浮点数,可选) — 学习率。 (默认: 1e-3)
- betas (Tuple[float, float], 可选) — 用于计算梯度及其范数的运行平均值的系数。 (默认: (0.9, 0.999))
- eps (float, 可选) — 添加到分母中以改进数值稳定性的项。 (默认:1e-8)
- weight_decay (float, 可选) — 权重衰减 (L2 惩罚) (默认:0)
- grad_averaging (bool, 可选) — 是否在计算梯度的运行平均值时应用 (1-beta2)。 (默认:True)
- max_grad_norm (浮点数,可选) — 用于剪枝全局梯度范数的值(默认:1.0)
- trust_clip (布尔值) — 启用 LAMBC 信任比率剪枝(默认:False)
- always_adapt (布尔值,可选) — 对 0.0 权重衰减参数应用自适应学习率(默认:False)
实现了来自 apex.optimizers.FusedLAMB 引用中的 FuseLAMB (NvLamb 变体) 的 PyTorch 版本优化器:https://github.com/NVIDIA/DeepLearningExamples/blob/master/PyTorch/LanguageModeling/Transformer-XL/pytorch/lamb.py
LAMB 在论文《Large Batch Optimization for Deep Learning: Training BERT in 76 minutes》中提出。
.. _Large Batch Optimization for Deep Learning - Training BERT in 76 minutes: https://arxiv.org/abs/1904.00962 .. _On the Convergence of Adam and Beyond: https://openreview.net/forum?id=ryQu7f-RZ
步骤
( closure = None )
参数
执行一个优化步骤。
( params lr = 1.0 momentum = 0 dampening = 0 weight_decay = 0 nesterov = False trust_coeff = 0.001 eps = 1e-08 trust_clip = False always_adapt = False )
参数
- params (可迭代对象) — 要优化的参数的可迭代对象或定义参数组的字典。
- lr (浮点数,可选) — 学习率(默认:1.0)。
- momentum (float, 可选) — 惯性因子(默认:0)
- weight_decay (float, 可选) — 权重衰减(L2惩罚)(默认:0)
- dampening (float, 可选) — 惯性 dampening(默认:0)
- nesterov (bool, 可选) — 启用 Nesterov 惯性(默认:False)
- trust_coeff (浮点数) — 用于自适应学习率/trust_ratio的信任系数(默认:0.001)
- eps (浮点数) — 除法分母的eps(默认:1e-8)
- trust_clip (布尔值) — 启用LARC信任比率剪辑(默认:False)
- always_adapt (布尔值) — 总是应用LARS学习率自适应,否则只在group_weight_decay不等于0时应用(默认:False)
LARS for PyTorch
论文:卷积神经网络的大批次训练
- https://arxiv.org/pdf/1708.03888.pdf
执行一个优化步骤。
类 timm.optim.MADGRAD
< 源代码 >( params: Any lr: float = 0.01 momentum: float = 0.9 weight_decay: float = 0 eps: float = 1e-06 decoupled_decay: bool = False )
MADGRAD_: 用于随机优化的动量化、自适应、双重平均梯度方法。
.. _MADGRAD: https://arxiv.org/abs/2101.11075
MADGRAD 是一种通用优化器,可以用作 SGD 或 Adam 替代,可能收敛更快,泛化能力更强。目前仅限 GPU 使用。通常,可以用于 SGD 或 Adam 的相同学习率计划。整体学习率与两种方法均不可比,应通过超参数扫描确定。
MADGRAD 比 其他方法需要的权重衰减更少,通常仅为零。用于 SGD 或 Adam 的 beta1 的动量值也适用于此处。
在稀疏问题上,应将 weight_decay 和 momentum 都设置为 0。
执行一个优化步骤。
类 timm.optim.Nadam
< 来源 >( params lr = 0.002 betas = (0.9, 0.999) eps = 1e-08 weight_decay = 0 schedule_decay = 0.004 )
实现了 Nadam 算法(基于 Nesterov 动量的 Adam 变体)。
该算法已在《Incorporating Nesterov Momentum into Adam》中提出。
http://cs229.stanford.edu/proj2015/054_report.pdf http://www.cs.toronto.edu/~fritz/absps/momentum.pdf
最初来自于: https://github.com/pytorch/pytorch/pull/1408 备注:存在潜在问题,但在某些问题下表现良好。
执行一个优化步骤。
class timm.optim.NvNovoGrad
< 来源 >( params lr = 0.001 betas = (0.95, 0.98) eps = 1e-08 weight_decay = 0 grad_averaging = False amsgrad = False )
参数
- params (可迭代对象) — 要优化的参数的可迭代对象或定义参数组的字典
- lr (浮点数,可选) — 学习率(默认:1e-3)
- betas (浮点数元组,可选) — 用于计算梯度及其平方的运行平均值系数(默认:(0.95, 0.98))
- eps (浮点数,可选) — 加到分母上的项,以提高数值稳定性(默认:1e-8)
- weight_decay (浮点数,可选) — 权重衰减(L2惩罚)(默认:0)grad_averaging — 梯度平均值
- amsgrad (布尔值,可选) — 是否使用论文《On the Convergence of Adam and Beyond》中此算法的AMSGrad变体(默认:False)
实现了Novograd算法。
执行一个优化步骤。
类 timm.optim.RMSpropTF
< 源代码 >( params lr = 0.01 alpha = 0.9 eps = 1e-10 weight_decay = 0 momentum = 0.0 centered = False decoupled_decay = False lr_in_momentum = True )
参数
- params (可迭代对象) — 要优化的参数的可迭代对象或定义参数组的字典
- lr (浮点数,可选) — 学习率(默认:1e-2)
- momentum (浮点数,可选) — 动量因子(默认:0)
- decoupled_decay (bool, 可选) — 如https://arxiv.org/abs/1711.05101所描述的解耦权重衰减
- lr_in_momentum (bool, 可选) — 允许学习率缩放纳入动量缓冲区更新,如Tensorflow的默认设置
实现RMSprop算法(TensorFlow风格的epsilon)
注意:此代码是从PyTorch RMSprop直接复制而来的,并在开方之前应用了eps,并对其他一些参数进行了修改,以更接近Tensorflow的超参数匹配。
重要的更改包括
- 在平方根内应用Epsilon
- square_avg初始化为1
- 更新累积在动量缓冲区中的学习率缩放
由G. Hinton在他的课程中提出。
中心化版本首次出现在《利用循环神经网络生成序列》中。
执行一个优化步骤。
类 timm.optim.SGDP
< 源代码 >( params lr = <必需参数> momentum = 0 dampening = 0 weight_decay = 0 nesterov = False eps = 1e-08 delta = 0.1 wd_ratio = 0.1 )