Transformers 文档

优化

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始

优化

.optimization 模块提供

  • 一个具有固定权重衰减的优化器,可用于微调模型,以及
  • 以继承自 _LRSchedule 的计划对象形式的多个计划
  • 一个梯度累积类,用于累积多个批次的梯度

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, optional) — 外部学习率。
  • eps (Tuple[float, float], optional, defaults to (1e-30, 0.001)) — 平方梯度和参数尺度的正则化常数
  • clip_threshold (float, optional, defaults to 1.0) — 最终梯度更新的均方根阈值
  • decay_rate (float, optional, defaults to -0.8) — 用于计算平方运行平均值的系数
  • beta1 (float, optional) — 用于计算梯度运行平均值的系数
  • weight_decay (float, optional, defaults to 0.0) — 权重衰减(L2 惩罚)
  • scale_parameter (bool, optional, defaults to True) — 如果为 True,则学习率按均方根缩放
  • relative_step (bool, optional, defaults to True) — 如果为 True,则计算时间相关的学习率,而不是外部学习率
  • warmup_init (bool, optional, defaults to False) — 时间相关的学习率计算取决于是否正在使用预热初始化

AdaFactor pytorch 实现可以用作 Adam 的直接替换,原始 fairseq 代码: https://github.com/pytorch/fairseq/blob/master/fairseq/optim/adafactor.py

论文: Adafactor: Adaptive Learning Rates with Sublinear Memory Cost https://arxiv.org/abs/1804.04235 请注意,此优化器内部会根据 scale_parameterrelative_stepwarmup_init 选项调整学习率。要使用手动(外部)学习率计划,您应该设置 scale_parameter=Falserelative_step=False

此实现处理低精度 (FP16, bfloat) 值,但我们尚未彻底测试。

推荐的 T5 微调设置 (https://discuss.huggingface.co/t/t5-finetuning-tips/684/3)

  • 不建议在没有 LR 预热或梯度裁剪阈值的情况下进行训练。

  • 禁用相对更新

  • 使用缩放参数=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=NoneTrainer 一起使用时,您很可能需要使用 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,
)

step

< >

( closure = None )

参数

  • closure (callable, optional) — 重新评估模型并返回损失的闭包。

执行单个优化步骤

AdamWeightDecay (TensorFlow)

class transformers.AdamWeightDecay

< >

( learning_rate: typing.Union[float, tf_keras.src.optimizers.schedules.learning_rate_schedule.LearningRateSchedule] = 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: typing.Optional[list[str]] = None exclude_from_weight_decay: typing.Optional[list[str]] = None name: str = 'AdamWeightDecay' **kwargs )

参数

  • learning_rate (Union[float, LearningRateSchedule], optional, defaults to 0.001) — 要使用的学习率或计划。
  • beta_1 (float, optional, defaults to 0.9) — Adam 中的 beta1 参数,它是第一个动量估计的指数衰减率。
  • beta_2 (float, optional, defaults to 0.999) — Adam 中的 beta2 参数,它是第二个动量估计的指数衰减率。
  • epsilon (float, optional, defaults to 1e-07) — Adam 中的 epsilon 参数,这是一个用于数值稳定性的较小常数。
  • amsgrad (bool, optional, defaults to False) — 是否应用此算法的 AMSGrad 变体,请参阅 On the Convergence of Adam and Beyond。
  • weight_decay_rate (float, 可选,默认为 0.0) — 应用的权重衰减率。
  • include_in_weight_decay (List[str], 可选) — 要应用权重衰减的参数名称(或正则表达式)列表。 如果未传入任何值,则默认情况下权重衰减将应用于所有参数(除非它们在 exclude_from_weight_decay 中)。
  • exclude_from_weight_decay (List[str], 可选) — 从应用权重衰减中排除的参数名称(或正则表达式)列表。 如果传入了 include_in_weight_decay,则其中的名称将取代此列表。
  • name (str, 可选,默认为 "AdamWeightDecay") — 应用梯度时创建的操作的可选名称。
  • kwargs (Dict[str, Any], 可选) — 关键字参数。 允许为 {clipnorm, clipvalue, lr, decay}。 clipnorm 是按范数裁剪梯度;clipvalue 是按值裁剪梯度;decay 的包含是为了向后兼容,以允许学习率的时间反向衰减。 lr 的包含是为了向后兼容,建议使用 learning_rate 代替。

Adam 启用了梯度上的 L2 权重衰减和 clip_by_global_norm。 仅仅将权重的平方添加到损失函数中,不是 将 L2 正则化/权重衰减与 Adam 一起使用的正确方法,因为这会以奇怪的方式与 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: typing.Optional[float] = None adam_global_clipnorm: typing.Optional[float] = None weight_decay_rate: float = 0.0 power: float = 1.0 include_in_weight_decay: typing.Optional[list[str]] = 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 的 power 值。
  • include_in_weight_decay (List[str], 可选) — 要应用权重衰减的参数名称(或正则表达式)列表。 如果未传入任何值,则权重衰减将应用于除偏差和层归一化参数之外的所有参数。

创建一个优化器,该优化器具有学习率计划,该计划使用预热阶段,然后是线性衰减。

计划表

学习率计划表 (PyTorch)

class transformers.SchedulerType

< >

( value names = None module = None qualname = None type = None start = 1 )

lr_scheduler_type 参数在 TrainingArguments 中的计划表名称。 默认情况下,它使用“linear”。 在内部,这会从 Trainer 中检索 get_linear_schedule_with_warmup 计划表。 计划表类型

  • “linear” = get_linear_schedule_with_warmup
  • “cosine” = get_cosine_schedule_with_warmup
  • “cosine_with_restarts” = get_cosine_with_hard_restarts_schedule_with_warmup
  • “polynomial” = get_polynomial_decay_schedule_with_warmup
  • “constant” = get_constant_schedule
  • “constant_with_warmup” = get_constant_schedule_with_warmup
  • “inverse_sqrt” = get_inverse_sqrt_schedule
  • “reduce_lr_on_plateau” = get_reduce_on_plateau_schedule
  • “cosine_with_min_lr” = get_cosine_with_min_lr_schedule_with_warmup
  • “warmup_stable_decay” = get_wsd_schedule

transformers.get_scheduler

< >

( name: typing.Union[str, transformers.trainer_utils.SchedulerType] optimizer: Optimizer num_warmup_steps: typing.Optional[int] = None num_training_steps: typing.Optional[int] = None scheduler_specific_kwargs: typing.Optional[dict] = None )

参数

  • name (strSchedulerType) — 要使用的计划表的名称。
  • optimizer (torch.optim.Optimizer) — 训练期间将使用的优化器。
  • num_warmup_steps (int, 可选) — 要执行的预热步骤的数量。 并非所有计划表都要求这样做(因此该参数是可选的),如果未设置且计划表类型需要它,则该函数将引发错误。
  • num_training_steps (int“, optional) — 要执行的训练步数。并非所有调度器都要求此参数(因此该参数是可选的),如果调度器类型需要但未设置此参数,则该函数将引发错误。
  • scheduler_specific_kwargs (dict, optional) — 调度器的额外参数,例如带重启的余弦调度器。调度器类型和调度器参数不匹配将导致调度器函数引发 TypeError。

用于从名称获取任何调度器的统一 API。

transformers.get_constant_schedule

< >

( optimizer: Optimizer last_epoch: int = -1 )

参数

  • optimizer (~torch.optim.Optimizer) — 用于设置学习率的优化器。
  • last_epoch (int, optional, 默认为 -1) — 恢复训练时,上次 epoch 的索引。

创建一个使用优化器中设置的学习率的恒定学习率调度器。

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, optional, 默认为 -1) — 恢复训练时,上次 epoch 的索引。

创建一个恒定学习率调度器,该调度器在预热期之前,学习率在预热期间从 0 线性增加到优化器中设置的初始学习率。

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, 默认为 0.5) — 余弦调度中的波浪数(默认值是仅从最大值减小到 0,遵循半余弦函数)。
  • last_epoch (int, optional, 默认为 -1) — 恢复训练时,上次 epoch 的索引。

创建一个学习率调度器,该调度器在预热期之后,学习率从优化器中设置的初始学习率开始,按照余弦函数的值减小到 0;在预热期间,学习率从 0 线性增加到优化器中设置的初始学习率。

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, 默认为 1) — 要使用的硬重启次数。
  • last_epoch (int, optional, 默认为 -1) — 恢复训练时,上次 epoch 的索引。

创建一个学习率调度器,该调度器在预热期之后,学习率从优化器中设置的初始学习率开始,按照余弦函数的值减小到 0,并进行多次硬重启;在预热期间,学习率从 0 线性增加到优化器中设置的初始学习率。

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, 默认为 -1) — 恢复训练时,上次 epoch 的索引。

创建一个学习率调度器,该调度器在预热期之后,学习率从优化器中设置的初始学习率线性减小到 0;在预热期间,学习率从 0 线性增加到优化器中设置的初始学习率。

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) — 最终学习率。
  • power (float, optional, defaults to 1.0) — 幂因子。
  • last_epoch (int, optional, defaults to -1) — 恢复训练时上个 epoch 的索引。

创建一个学习率计划,该计划在预热期后,学习率从优化器中设置的初始学习率线性增加到 0,然后在预热期结束后,学习率从优化器中设置的初始学习率以多项式衰减方式降低到由 *lr_end* 定义的最终学习率。

注意:*power* 默认值为 1.0,与 fairseq 实现一致,而 fairseq 实现又基于 BERT 的原始实现,地址为 https://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, optional, defaults to num_warmup_steps) — 时间尺度。
  • last_epoch (int, optional, defaults to -1) — 恢复训练时上个 epoch 的索引。

创建一个学习率计划,该计划使用反平方根学习率,在预热期之后,学习率从优化器中设置的初始学习率线性增加到 0,然后再从初始学习率开始反平方根衰减。

transformers.get_wsd_schedule

< >

( optimizer: Optimizer num_warmup_steps: int num_decay_steps: int num_training_steps: typing.Optional[int] = None num_stable_steps: typing.Optional[int] = None warmup_type: str = 'linear' decay_type: str = 'cosine' min_lr_ratio: float = 0 num_cycles: float = 0.5 last_epoch: int = -1 )

参数

  • optimizer (~torch.optim.Optimizer) — 用于安排学习率的优化器。
  • num_warmup_steps (int) — 预热阶段的步数。
  • num_decay_steps (int) — 衰减阶段的步数。
  • num_training_steps (int, optional) — 训练的总步数。这是预热、稳定和衰减步数的总和。如果未提供 `num_stable_steps`,则稳定阶段将为 `num_training_steps - num_warmup_steps - num_decay_steps`。
  • num_stable_steps (int, optional) — 稳定阶段的步数。请确保 `num_warmup_steps + num_stable_steps + num_decay_steps` 等于 `num_training_steps`,否则其他阶段将默认为最小学习率。
  • warmup_type (str, optional, defaults to “linear”) — 要使用的预热类型。可以是 ‘linear’、‘cosine’ 或 ‘1-sqrt’。
  • decay_type (str, optional, defaults to “cosine”) — 要使用的衰减类型。可以是 ‘linear’、‘cosine’ 或 ‘1-sqrt’。
  • min_lr_ratio (float, optional, defaults to 0) — 最小学习率,表示为初始学习率的比率。
  • num_cycles (float, optional, defaults to 0.5) — 余弦计划中的波浪数(默认值是仅从最大值降至 0,遵循半余弦)。
  • last_epoch (int, optional, defaults to -1) — 恢复训练时上个 epoch 的索引。

创建一个具有三个阶段的学习率计划

  1. 预热阶段:从最小学习率比率乘以初始学习率增加到初始学习率,遵循 warmup_type。
  2. 稳定阶段:恒定的学习率。
  3. 衰减阶段:从初始学习率降低到最小学习率比率乘以初始学习率,遵循 decay_type。

Warmup (TensorFlow) (TensorFlow 预热)

class transformers.WarmUp

< >

( initial_learning_rate: float decay_schedule_fn: typing.Callable warmup_steps: int power: float = 1.0 name: str = None )

参数

  • initial_learning_rate (float) — 预热后计划的初始学习率(因此这将是预热结束时的学习率)。
  • decay_schedule_fn (Callable) — 在预热之后应用于剩余训练过程的计划函数。
  • warmup_steps (int) — 训练预热部分的步数。
  • power (float, optional, defaults to 1.0) — 用于多项式预热的幂(默认值为线性预热)。
  • name (str, optional) — 计划期间返回张量的可选名称前缀。

在给定的学习率衰减计划上应用预热计划。

梯度策略

GradientAccumulator (TensorFlow)

class transformers.GradientAccumulator

< >

( )

梯度累积实用工具。当与分布式策略一起使用时,累积器应在副本上下文中调用。梯度将在每个副本上本地累积,而无需同步。然后,用户应调用 .gradients,如果需要,可以缩放梯度,并将结果传递给 apply_gradients

reset

< >

( )

重置当前副本上累积的梯度。

< > Update on GitHub