Transformers 4.37 中文文档(十五)(4)https://developer.aliyun.com/article/1564967
AdaFactor(PyTorch)
class transformers.Adafactor
( params lr = None eps = (1e-30, 0.001) clip_threshold = 1.0 decay_rate = -0.8 beta1 = None weight_decay = 0.0 scale_parameter = True relative_step = True warmup_init = False )
参数
params
(Iterable[nn.parameter.Parameter]
)— 要优化的参数的可迭代对象或定义参数组的字典。lr
(float
,可选)— 外部学习率。eps
(Tuple[float, float]
,可选,默认为(1e-30, 0.001)
)— 平方梯度和参数比例的正则化常数clip_threshold
(float
,可选,默认为 1.0)— 最终梯度更新的均方根阈值decay_rate
(float
,可选,默认为-0.8)— 用于计算平方运行平均值的系数beta1
(float
,可选)— 用于计算梯度的运行平均值的系数weight_decay
(float
,可选,默认为 0.0)— 权重衰减(L2 惩罚)scale_parameter
(bool
,可选,默认为True
)— 如果为 True,则学习率将按均方根缩放relative_step
(bool
,可选,默认为True
)— 如果为 True,则计算时间相关的学习率,而不是外部学习率warmup_init
(bool
,可选,默认为False
)— 时间相关的学习率计算取决于是否使用了热身初始化
AdaFactor 的 PyTorch 实现可用作 Adam 原始 fairseq 代码的替代品:github.com/pytorch/fairseq/blob/master/fairseq/optim/adafactor.py
论文:Adafactor:自适应学习率与亚线性内存成本 arxiv.org/abs/1804.04235
请注意,此优化器根据scale_parameter
、relative_step
和warmup_init
选项内部调整学习率。要使用手动(外部)学习率调度,您应将scale_parameter=False
和relative_step=False
。
此实现处理低精度(FP16,bfloat)值,但我们尚未进行彻底测试。
推荐的 T5 微调设置(discuss.huggingface.co/t/t5-finetuning-tips/684/3
):
- 不建议在没有 LR 热身或 clip_threshold 的情况下进行训练。
- 使用计划的 LR 热身到固定的 LR
- 使用 clip_threshold=1.0 (
arxiv.org/abs/1804.04235
)
- 禁用相对更新
- 使用 scale_parameter=False
- 不应该在 Adafactor 旁边使用额外的优化器操作,如梯度裁剪。
示例:
Adafactor(model.parameters(), scale_parameter=False, relative_step=False, warmup_init=False, lr=1e-3)
其他人报告以下组合效果很好:
Adafactor(model.parameters(), scale_parameter=True, relative_step=True, warmup_init=True, lr=None)
当使用lr=None
与 Trainer 时,您很可能需要使用AdafactorSchedule
调度器如下:
from transformers.optimization import Adafactor, AdafactorSchedule optimizer = Adafactor(model.parameters(), scale_parameter=True, relative_step=True, warmup_init=True, lr=None) lr_scheduler = AdafactorSchedule(optimizer) trainer = Trainer(..., optimizers=(optimizer, lr_scheduler))
用法:
# replace AdamW with Adafactor optimizer = Adafactor( model.parameters(), lr=1e-3, eps=(1e-30, 1e-3), clip_threshold=1.0, decay_rate=-0.8, beta1=None, weight_decay=0.0, relative_step=False, scale_parameter=False, warmup_init=False, )
步骤
( closure = None )
参数
闭包
(可调用,可选)— 重新评估模型并返回损失的闭包。
执行单个优化步骤
AdamWeightDecay(TensorFlow)
class transformers.AdamWeightDecay
( learning_rate: Union = 0.001 beta_1: float = 0.9 beta_2: float = 0.999 epsilon: float = 1e-07 amsgrad: bool = False weight_decay_rate: float = 0.0 include_in_weight_decay: Optional = None exclude_from_weight_decay: Optional = None name: str = 'AdamWeightDecay' **kwargs )
参数
learning_rate
(Union[float, tf.keras.optimizers.schedules.LearningRateSchedule]
,可选,默认为 0.001)— 要使用的学习率或计划。beta_1
(float
,可选,默认为 0.9)— Adam 中的 beta1 参数,即第 1 动量估计的指数衰减率。beta_2
(float
,可选,默认为 0.999)— Adam 中的 beta2 参数,即第 2 动量估计的指数衰减率。epsilon
(float
,可选,默认为 1e-07)— Adam 中的 epsilon 参数,这是用于数值稳定性的小常数。amsgrad
(bool
,可选,默认为False
)— 是否应用 AMSGrad 变体的算法,参见关于 Adam 及其更多的收敛性。weight_decay_rate
(float
,可选,默认为 0.0)— 要应用的权重衰减。include_in_weight_decay
(List[str]
,可选)— 要应用权重衰减的参数名称(或 re 模式)的列表。如果没有传递,则默认情况下将权重衰减应用于所有参数(除非它们在exclude_from_weight_decay
中)。exclude_from_weight_decay
(List[str]
,可选)— 要排除不应用权重衰减的参数名称(或 re 模式)的列表。如果传递了include_in_weight_decay
,则其中的名称将取代此列表。name
(str
,可选,默认为"AdamWeightDecay"
)— 应用梯度时创建的操作的可选名称。kwargs
(Dict[str, Any]
,可选)— 关键字参数。允许为{clipnorm
,clipvalue
,lr
,decay
}。clipnorm
是按范数裁剪梯度;clipvalue
是按值裁剪梯度,decay
包含了向后兼容性,允许学习率的时间反转衰减。lr
包含了向后兼容性,建议使用learning_rate
代替。
Adam 启用 L2 权重衰减和梯度的全局范数裁剪。只是将权重的平方添加到损失函数中不是使用 Adam 进行 L2 正则化/权重衰减的正确方式,因为这将以奇怪的方式与 m 和 v 参数交互,如解耦权重衰减正则化所示。
相反,我们希望以一种不会与 m/v 参数交互的方式衰减权重。这相当于使用纯(非动量)SGD 将权重的平方添加到损失中。
from_config
( config )
使用其配置创建具有 WarmUp 自定义对象的优化器。
transformers.create_optimizer
( init_lr: float num_train_steps: int num_warmup_steps: int min_lr_ratio: float = 0.0 adam_beta1: float = 0.9 adam_beta2: float = 0.999 adam_epsilon: float = 1e-08 adam_clipnorm: Optional = None adam_global_clipnorm: Optional = None weight_decay_rate: float = 0.0 power: float = 1.0 include_in_weight_decay: Optional = None )
参数
init_lr
(float
)—热身阶段结束时的期望学习率。num_train_steps
(int
)—训练步骤的总数。num_warmup_steps
(int
)—热身步骤的数量。min_lr_ratio
(float
,可选,默认为 0)—线性衰减结束时的最终学习率将为init_lr * min_lr_ratio
。adam_beta1
(float
,可选,默认为 0.9)—Adam 中使用的 beta1。adam_beta2
(float
,可选,默认为 0.999)—Adam 中使用的 beta2。adam_epsilon
(float
,可选,默认为 1e-8)—Adam 中使用的 epsilon。adam_clipnorm
(float
,可选,默认为None
)—如果不是None
,则将每个权重张量的梯度范数剪裁为此值。adam_global_clipnorm
(float
,可选,默认为None
)—如果不是None
,则将梯度范数剪裁为此值。使用此参数时,规范是在所有权重张量上计算的,就好像它们被连接成一个单一向量。weight_decay_rate
(float
,可选,默认为 0)—要使用的权重衰减。power
(float
,可选,默认为 1.0)—用于 PolynomialDecay 的幂。include_in_weight_decay
(List[str]
,可选)—要应用权重衰减的参数名称(或 re 模式)的列表。如果未传递任何内容,则将权重衰减应用于除偏置和层归一化参数之外的所有参数。
创建一个使用热身阶段后跟线性衰减的学习率时间表的优化器。
时间表
学习率时间表(Pytorch)
class transformers.SchedulerType
( value names = None module = None qualname = None type = None start = 1 )
一个枚举。
transformers.get_scheduler
( name: Union optimizer: Optimizer num_warmup_steps: Optional = None num_training_steps: Optional = None scheduler_specific_kwargs: Optional = None )
参数
name
(str
或SchedulerType
)—要使用的调度程序的名称。optimizer
(torch.optim.Optimizer
)—训练期间将使用的优化器。num_warmup_steps
(int
,可选)—要执行的热身步骤数。并非所有调度程序都需要(因此参数是可选的),如果未设置并且调度程序类型需要,则函数将引发错误。num_training_steps
(int
,可选)—要执行的训练步骤数。并非所有调度程序都需要(因此参数是可选的),如果未设置并且调度程序类型需要,则函数将引发错误。scheduler_specific_kwargs
(dict
,可选)—用于诸如带重启的余弦等调度程序的额外参数。不匹配的调度程序类型和调度程序参数将导致调度程序函数引发 TypeError。
从其名称获取任何调度程序的统一 API。
transformers.get_constant_schedule
( optimizer: Optimizer last_epoch: int = -1 )
参数
optimizer
(~torch.optim.Optimizer
)—要为其调度学习率的优化器。last_epoch
(int
,可选,默认为-1)—恢复训练时的最后一个时期的索引。
使用优化器中设置的学习率创建一个具有恒定学习率的时间表。
transformers.get_constant_schedule_with_warmup
( optimizer: Optimizer num_warmup_steps: int last_epoch: int = -1 )
参数
optimizer
(~torch.optim.Optimizer
)—要为其调度学习率的优化器。num_warmup_steps
(int
)—热身阶段的步数。last_epoch
(int
,可选,默认为-1)—恢复训练时的最后一个时期的索引。
创建一个具有恒定学习率的时间表,在此期间学习率在 0 和优化器中设置的初始 lr 之间线性增加的热身期之前。
#### transformers.get_cosine_schedule_with_warmup
( optimizer: Optimizer num_warmup_steps: int num_training_steps: int num_cycles: float = 0.5 last_epoch: int = -1 )
参数
optimizer
(~torch.optim.Optimizer
) — 要调整学习率的优化器。num_warmup_steps
(int
) — 热身阶段的步数。num_training_steps
(int
) — 总训练步数。num_cycles
(float
, optional, defaults to 0.5) — 余弦计划中波数的数量(默认值是从最大值到 0 按照半余弦减少)。last_epoch
(int
, optional, defaults to -1) — 恢复训练时的最后一个周期的索引。
创建一个学习率随余弦函数值下降的计划,从优化器中设置的初始 lr 到 0,经过一个热身阶段,在此期间学习率线性增加从 0 到优化器中设置的初始 lr。
#### transformers.get_cosine_with_hard_restarts_schedule_with_warmup
( optimizer: Optimizer num_warmup_steps: int num_training_steps: int num_cycles: int = 1 last_epoch: int = -1 )
参数
optimizer
(~torch.optim.Optimizer
) — 要调整学习率的优化器。num_warmup_steps
(int
) — 热身阶段的步数。num_training_steps
(int
) — 总训练步数。num_cycles
(int
, optional, defaults to 1) — 要使用的硬重启次数。last_epoch
(int
, optional, defaults to -1) — 恢复训练时的最后一个周期的索引。
创建一个学习率随余弦函数值下降的计划,从优化器中设置的初始 lr 到 0,经过几次硬重启,在此期间学习率线性增加从 0 到优化器中设置的初始 lr。
#### transformers.get_linear_schedule_with_warmup
( optimizer num_warmup_steps num_training_steps last_epoch = -1 )
参数
optimizer
(~torch.optim.Optimizer
) — 要调整学习率的优化器。num_warmup_steps
(int
) — 热身阶段的步数。num_training_steps
(int
) — 总训练步数。last_epoch
(int
, optional, defaults to -1) — 恢复训练时的最后一个周期的索引。
创建一个学习率从优化器中设置的初始 lr 线性下降到 0 的计划,在此期间学习率从 0 线性增加到优化器中设置的初始 lr。
#### transformers.get_polynomial_decay_schedule_with_warmup
( optimizer num_warmup_steps num_training_steps lr_end = 1e-07 power = 1.0 last_epoch = -1 )
参数
optimizer
(~torch.optim.Optimizer
) — 要调整学习率的优化器。num_warmup_steps
(int
) — 热身阶段的步数。num_training_steps
(int
) — 总训练步数。lr_end
(float
, optional, defaults to 1e-7) — 最终 LR。power
(float
, optional, defaults to 1.0) — 功率因子。last_epoch
(int
, optional, defaults to -1) — 恢复训练时的最后一个周期的索引。
创建一个学习率从优化器中设置的初始 lr 按多项式衰减到由lr_end定义的最终 lr 的计划,在此期间学习率从 0 线性增加到优化器中设置的初始 lr。
注意:power 默认为 1.0,与 fairseq 实现相同,fairseq 实现又基于原始 BERT 实现 github.com/google-research/bert/blob/f39e881b169b9d53bea03d2d341b31707a6c052b/optimization.py#L37
transformers.get_inverse_sqrt_schedule
( optimizer: Optimizer num_warmup_steps: int timescale: int = None last_epoch: int = -1 )
参数
optimizer
(~torch.optim.Optimizer
) — 要调整学习率的优化器。num_warmup_steps
(int
) — 热身阶段的步数。timescale
(int
, 可选, 默认为num_warmup_steps
) — 时间尺度。last_epoch
(int
, 可选, 默认为 -1) — 恢复训练时的最后一个时代的索引。
创建一个具有反平方根学习率的调度,从优化器中设置的初始 lr 开始,在一个热身期间之后,该期间将使 lr 从 0 线性增加到优化器中设置的初始 lr。
Warmup(TensorFlow)
类 transformers.WarmUp
( initial_learning_rate: float decay_schedule_fn: Callable warmup_steps: int power: float = 1.0 name: str = None )
参数
initial_learning_rate
(float
) — 热身后调度的初始学习率(这将是热身结束时的学习率)。decay_schedule_fn
(Callable
) — 在热身后应用于剩余训练的调度函数。warmup_steps
(int
) — 训练中热身阶段的步数。power
(float
, 可选, 默认为 1.0) — 用于多项式热身的幂(默认为线性热身)。name
(str
, 可选) — 调度期间返回张量的可选名称前缀。
对给定学习率衰减调度应用热身调度。
梯度策略
GradientAccumulator(TensorFlow)
类 transformers.GradientAccumulator
( )
梯度累积实用程序。与分布策略一起使用时,应在副本上下文中调用累加器。梯度将在每个副本上本地累积,无需同步。然后用户应调用.gradients
,根据需要缩放梯度,并将结果传递给apply_gradients
。
重置
( )
重置当前副本上累积的梯度。
创建一个学习率从优化器中设置的初始 lr 按多项式衰减到由lr_end定义的最终 lr 的计划,在此期间学习率从 0 线性增加到优化器中设置的初始 lr。
注意:power 默认为 1.0,与 fairseq 实现相同,fairseq 实现又基于原始 BERT 实现 github.com/google-research/bert/blob/f39e881b169b9d53bea03d2d341b31707a6c052b/optimization.py#L37
transformers.get_inverse_sqrt_schedule
( optimizer: Optimizer num_warmup_steps: int timescale: int = None last_epoch: int = -1 )
参数
optimizer
(~torch.optim.Optimizer
) — 要调整学习率的优化器。num_warmup_steps
(int
) — 热身阶段的步数。timescale
(int
, 可选, 默认为num_warmup_steps
) — 时间尺度。last_epoch
(int
, 可选, 默认为 -1) — 恢复训练时的最后一个时代的索引。
创建一个具有反平方根学习率的调度,从优化器中设置的初始 lr 开始,在一个热身期间之后,该期间将使 lr 从 0 线性增加到优化器中设置的初始 lr。
Warmup(TensorFlow)
类 transformers.WarmUp
( initial_learning_rate: float decay_schedule_fn: Callable warmup_steps: int power: float = 1.0 name: str = None )
参数
initial_learning_rate
(float
) — 热身后调度的初始学习率(这将是热身结束时的学习率)。decay_schedule_fn
(Callable
) — 在热身后应用于剩余训练的调度函数。warmup_steps
(int
) — 训练中热身阶段的步数。power
(float
, 可选, 默认为 1.0) — 用于多项式热身的幂(默认为线性热身)。name
(str
, 可选) — 调度期间返回张量的可选名称前缀。
对给定学习率衰减调度应用热身调度。
梯度策略
GradientAccumulator(TensorFlow)
类 transformers.GradientAccumulator
( )
梯度累积实用程序。与分布策略一起使用时,应在副本上下文中调用累加器。梯度将在每个副本上本地累积,无需同步。然后用户应调用.gradients
,根据需要缩放梯度,并将结果传递给apply_gradients
。
重置
( )
重置当前副本上累积的梯度。