apex.optimizers¶
-
class
apex.optimizers.
FusedAdam
(params, lr=0.001, bias_correction=True, betas=(0.9, 0.999), eps=1e-08, adam_w_mode=True, weight_decay=0.0, amsgrad=False, set_grad_none=True)[源代码]¶ 实现 Adam 算法。
目前仅支持 GPU。 需要通过
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
安装 Apex。此版本的融合 Adam 实现了 2 个融合。
Adam 更新的元素操作的融合
一个多张量应用启动器,将应用于所有模型参数的元素更新批量处理为一个或几个内核启动器。
apex.optimizers.FusedAdam
可以用作torch.optim.Adam
的直接替代品opt = apex.optimizers.FusedAdam(model.parameters(), lr = ....) ... opt.step()
apex.optimizers.FusedAdam
可以与 Amp 一起使用或不一起使用。 如果您希望将FusedAdam
与 Amp 一起使用,您可以选择任何opt_level
opt = apex.optimizers.FusedAdam(model.parameters(), lr = ....) model, opt = amp.initialize(model, opt, opt_level="O0" or "O1 or "O2") ... opt.step()
通常,建议使用
opt_level="O1"
。警告
FusedAdam
的先前版本允许向step
传递许多其他参数。 这些附加参数现在已弃用且不必要。Adam 已在 Adam: A Method for Stochastic Optimization 中提出。
- 参数
params (iterable) – 要优化的参数的可迭代对象或定义参数组的字典。
lr (float, optional) – 学习率。 (默认:1e-3)
betas (Tuple[float, float], optional) – 用于计算梯度及其平方的运行平均值的系数。(默认:(0.9,0.999))
eps (float, optional) – 添加到分母以提高数值稳定性的项。(默认:1e-8)
weight_decay (float, optional) – 权重衰减(L2惩罚)(默认:0)
amsgrad (boolean, optional) – 是否使用论文 On the Convergence of Adam and Beyond 中的此算法的 AMSGrad 变体 (default: False) FusedAdam 中不支持!
adam_w_mode (boolean, optional) – 应用 L2 正则化或权重衰减,True 表示解耦权重衰减(也称为 AdamW)(默认:True)
set_grad_none (bool, optional) – 调用 zero_grad() 方法时是否将 grad 设置为 None。(默认:True)
-
class
apex.optimizers.
FusedLAMB
(params, lr=0.001, bias_correction=True, betas=(0.9, 0.999), eps=1e-06, weight_decay=0.01, amsgrad=False, adam_w_mode=True, grad_averaging=True, set_grad_none=True, max_grad_norm=1.0)[源代码]¶ 实现 LAMB 算法。
目前仅支持 GPU。 需要通过
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
安装 Apex。此版本的融合 LAMB 实现了 2 个融合。
LAMB 更新的元素操作的融合
一个多张量应用启动器,将应用于所有模型参数的元素更新批量处理为一个或几个内核启动器。
apex.optimizers.FusedLAMB
的用法与任何普通 Pytorch 优化器相同opt = apex.optimizers.FusedLAMB(model.parameters(), lr = ....) ... opt.step()
apex.optimizers.FusedLAMB
可以与 Amp 一起使用或不一起使用。 如果您希望将FusedLAMB
与 Amp 一起使用,您可以选择任何opt_level
opt = apex.optimizers.FusedLAMB(model.parameters(), lr = ....) model, opt = amp.initialize(model, opt, opt_level="O0" or "O1 or "O2") ... opt.step()
通常,建议使用
opt_level="O1"
。LAMB 在 Large Batch Optimization for Deep Learning: Training BERT in 76 minutes 中提出。
- 参数
params (iterable) – 要优化的参数的可迭代对象或定义参数组的字典。
lr (float, optional) – 学习率。 (默认:1e-3)
betas (Tuple[float, float], optional) – 用于计算梯度及其范数的运行平均值的系数。(默认:(0.9,0.999))
eps (float, optional) – 添加到分母以提高数值稳定性的项。(默认:1e-8)
weight_decay (float, optional) – 权重衰减(L2惩罚)(默认:0)
amsgrad (boolean, optional) – 是否使用论文 On the Convergence of Adam and Beyond 中的此算法的 AMSGrad 变体,现在不支持!(默认:False)
adam_w_mode (boolean, optional) – 应用 L2 正则化或权重衰减,True 表示解耦权重衰减(也称为 AdamW)(默认:True)
grad_averaging (bool, optional) – 在计算梯度的运行平均值时,是否将 (1-beta2) 应用于 grad。(默认:True)
set_grad_none (bool, optional) – 调用 zero_grad() 方法时是否将 grad 设置为 None。(默认:True)
max_grad_norm (float, optional) – 用于裁剪全局 grad 范数的值(默认:1.0)
-
class
apex.optimizers.
FusedNovoGrad
(params, lr=0.001, bias_correction=True, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.0, amsgrad=False, reg_inside_moment=False, grad_averaging=True, norm_type=2, init_zero=False, set_grad_none=True)[源代码]¶ 实现 NovoGrad 算法。
目前仅支持 GPU。 需要通过
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
安装 Apex。此版本的融合 NovoGrad 实现了 2 个融合。
NovoGrad 更新的元素操作的融合
一个多张量应用启动器,将应用于所有模型参数的元素更新批量处理为一个或几个内核启动器。
apex.optimizers.FusedNovoGrad
的用法与任何 Pytorch 优化器相同opt = apex.optimizers.FusedNovoGrad(model.parameters(), lr = ....) ... opt.step()
apex.optimizers.FusedNovoGrad
可以与 Amp 一起使用或不一起使用。 如果您希望将FusedNovoGrad
与 Amp 一起使用,您可以选择任何opt_level
opt = apex.optimizers.FusedNovoGrad(model.parameters(), lr = ....) model, opt = amp.initialize(model, opt, opt_level="O0" or "O1 or "O2") ... opt.step()
通常,建议使用
opt_level="O1"
。它已在 Jasper: An End-to-End Convolutional Neural Acoustic Model 中提出。 更多信息: https://nvda.org.cn/OpenSeq2Seq/html/optimizers.html#novograd
- 参数
params (iterable) – 要优化的参数的可迭代对象或定义参数组的字典。
lr (float, optional) – 学习率。 (默认:1e-3)
betas (Tuple[float, float], optional) – 用于计算梯度及其范数的运行平均值的系数。(默认:(0.9,0.999))
eps (float, optional) – 添加到分母以提高数值稳定性的项。(默认:1e-8)
weight_decay (float, optional) – 权重衰减(L2惩罚)(默认:0)
amsgrad (boolean, optional) – 是否使用论文 On the Convergence of Adam and Beyond 中的此算法的 AMSGrad 变体,现在不支持!(默认:False)
reg_inside_moment (bool, optional) – 是否在动量计算中进行正则化(范数和 L2)。 True 表示包括,False 表示不包括,仅在更新项上进行。(默认:False)
grad_averaging (bool, optional) – 在计算梯度的运行平均值时,是否将 (1-beta2) 应用于 grad。(默认:True)
norm_type (int, optional) – 为每一层计算哪个范数。 2 表示 L2 范数,0 表示无穷范数。 现在只支持这 2 种类型。(默认:2)
init_zero (bool, 可选) – 是否使用 0 初始化 norm (从第一步开始平均) 还是使用第一步的 norm (从第二步开始平均)。True 表示使用 0 初始化。(默认值:False)
set_grad_none (bool, optional) – 调用 zero_grad() 方法时是否将 grad 设置为 None。(默认:True)
-
class
apex.optimizers.
FusedSGD
(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False, wd_after_momentum=False, materialize_master_grads=True)[源代码]¶ 实现了随机梯度下降(可以选择使用动量)。
目前仅支持 GPU。 需要通过
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
安装 Apex。此版本的 fused SGD 实现了 2 个融合。
SGD 更新的元素级操作的融合
一个多张量应用启动器,将应用于所有模型参数的元素更新批量处理为一个或几个内核启动器。
apex.optimizers.FusedSGD
可以用作torch.optim.SGD
的直接替代品opt = apex.optimizers.FusedSGD(model.parameters(), lr = ....) ... opt.step()
apex.optimizers.FusedSGD
可以与 Amp 一起使用或不一起使用。 如果您希望将FusedSGD
与 Amp 一起使用,您可以选择任何opt_level
opt = apex.optimizers.FusedSGD(model.parameters(), lr = ....) model, opt = amp.initialize(model, opt, opt_level="O0" or "O1 or "O2") ... opt.step()
通常,建议使用
opt_level="O1"
。Nesterov 动量基于 On the importance of initialization and momentum in deep learning 中的公式。
- 参数
例子
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) >>> optimizer.zero_grad() >>> loss_fn(model(input), target).backward() >>> optimizer.step()
注意
带有动量/Nesterov 的 SGD 的实现与 Sutskever et. al. 和其他一些框架中的实现略有不同。
考虑到动量的具体情况,更新可以写成
\[\begin{split}v = \rho * v + g \\ p = p - lr * v\end{split}\]其中 p、g、v 和 \(\rho\) 分别表示参数、梯度、速度和动量。
这与 Sutskever et. al. 和其他框架形成对比,后者采用以下形式的更新
\[\begin{split}v = \rho * v + lr * g \\ p = p - v\end{split}\]Nesterov 版本也进行了类似修改。