Transformers 4.37 中文文档(十五)(5)

简介: Transformers 4.37 中文文档(十五)

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 )

参数

  • paramsIterable[nn.parameter.Parameter])— 要优化的参数的可迭代对象或定义参数组的字典。
  • lrfloat可选)— 外部学习率。
  • epsTuple[float, float]可选,默认为(1e-30, 0.001))— 平方梯度和参数比例的正则化常数
  • clip_thresholdfloat可选,默认为 1.0)— 最终梯度更新的均方根阈值
  • decay_ratefloat可选,默认为-0.8)— 用于计算平方运行平均值的系数
  • beta1float可选)— 用于计算梯度的运行平均值的系数
  • weight_decayfloat可选,默认为 0.0)— 权重衰减(L2 惩罚)
  • scale_parameterbool可选,默认为True)— 如果为 True,则学习率将按均方根缩放
  • relative_stepbool可选,默认为True)— 如果为 True,则计算时间相关的学习率,而不是外部学习率
  • warmup_initbool可选,默认为False)— 时间相关的学习率计算取决于是否使用了热身初始化

AdaFactor 的 PyTorch 实现可用作 Adam 原始 fairseq 代码的替代品:github.com/pytorch/fairseq/blob/master/fairseq/optim/adafactor.py

论文:Adafactor:自适应学习率与亚线性内存成本 arxiv.org/abs/1804.04235 请注意,此优化器根据scale_parameterrelative_stepwarmup_init选项内部调整学习率。要使用手动(外部)学习率调度,您应将scale_parameter=Falserelative_step=False

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

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

  • 不建议在没有 LR 热身或 clip_threshold 的情况下进行训练。
  • 禁用相对更新
  • 使用 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_rateUnion[float, tf.keras.optimizers.schedules.LearningRateSchedule]可选,默认为 0.001)— 要使用的学习率或计划。
  • beta_1float可选,默认为 0.9)— Adam 中的 beta1 参数,即第 1 动量估计的指数衰减率。
  • beta_2float可选,默认为 0.999)— Adam 中的 beta2 参数,即第 2 动量估计的指数衰减率。
  • epsilonfloat可选,默认为 1e-07)— Adam 中的 epsilon 参数,这是用于数值稳定性的小常数。
  • amsgradbool可选,默认为False)— 是否应用 AMSGrad 变体的算法,参见关于 Adam 及其更多的收敛性
  • weight_decay_ratefloat可选,默认为 0.0)— 要应用的权重衰减。
  • include_in_weight_decayList[str]可选)— 要应用权重衰减的参数名称(或 re 模式)的列表。如果没有传递,则默认情况下将权重衰减应用于所有参数(除非它们在exclude_from_weight_decay中)。
  • exclude_from_weight_decayList[str]可选)— 要排除不应用权重衰减的参数名称(或 re 模式)的列表。如果传递了include_in_weight_decay,则其中的名称将取代此列表。
  • namestr可选,默认为"AdamWeightDecay")— 应用梯度时创建的操作的可选名称。
  • kwargsDict[str, Any]可选)— 关键字参数。允许为{clipnormclipvaluelrdecay}。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_lrfloat)—热身阶段结束时的期望学习率。
  • num_train_stepsint)—训练步骤的总数。
  • num_warmup_stepsint)—热身步骤的数量。
  • min_lr_ratiofloat可选,默认为 0)—线性衰减结束时的最终学习率将为init_lr * min_lr_ratio
  • adam_beta1float可选,默认为 0.9)—Adam 中使用的 beta1。
  • adam_beta2float可选,默认为 0.999)—Adam 中使用的 beta2。
  • adam_epsilonfloat可选,默认为 1e-8)—Adam 中使用的 epsilon。
  • adam_clipnormfloat可选,默认为None)—如果不是None,则将每个权重张量的梯度范数剪裁为此值。
  • adam_global_clipnormfloat可选,默认为None)—如果不是None,则将梯度范数剪裁为此值。使用此参数时,规范是在所有权重张量上计算的,就好像它们被连接成一个单一向量。
  • weight_decay_ratefloat可选,默认为 0)—要使用的权重衰减。
  • powerfloat可选,默认为 1.0)—用于 PolynomialDecay 的幂。
  • include_in_weight_decayList[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 )

参数

  • namestrSchedulerType)—要使用的调度程序的名称。
  • optimizertorch.optim.Optimizer)—训练期间将使用的优化器。
  • num_warmup_stepsint可选)—要执行的热身步骤数。并非所有调度程序都需要(因此参数是可选的),如果未设置并且调度程序类型需要,则函数将引发错误。
  • num_training_stepsint可选)—要执行的训练步骤数。并非所有调度程序都需要(因此参数是可选的),如果未设置并且调度程序类型需要,则函数将引发错误。
  • scheduler_specific_kwargsdict可选)—用于诸如带重启的余弦等调度程序的额外参数。不匹配的调度程序类型和调度程序参数将导致调度程序函数引发 TypeError。

从其名称获取任何调度程序的统一 API。

transformers.get_constant_schedule

<来源>

( optimizer: Optimizer last_epoch: int = -1 )

参数

  • optimizer~torch.optim.Optimizer)—要为其调度学习率的优化器。
  • last_epochint可选,默认为-1)—恢复训练时的最后一个时期的索引。

使用优化器中设置的学习率创建一个具有恒定学习率的时间表。

transformers.get_constant_schedule_with_warmup

<来源>

( optimizer: Optimizer num_warmup_steps: int last_epoch: int = -1 )

参数

  • optimizer~torch.optim.Optimizer)—要为其调度学习率的优化器。
  • num_warmup_stepsint)—热身阶段的步数。
  • last_epochint可选,默认为-1)—恢复训练时的最后一个时期的索引。

创建一个具有恒定学习率的时间表,在此期间学习率在 0 和优化器中设置的初始 lr 之间线性增加的热身期之前。

#### transformers.get_cosine_schedule_with_warmup

< source >

( 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

< source >

( 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

< source >

( 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

< source >

( 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

重置

<来源>

( )

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

相关文章
|
3月前
|
存储 缓存 PyTorch
Transformers 4.37 中文文档(十四)(6)
Transformers 4.37 中文文档(十四)
72 4
|
3月前
|
存储 PyTorch 测试技术
Transformers 4.37 中文文档(十四)(5)
Transformers 4.37 中文文档(十四)
51 4
|
3月前
|
存储 JSON 缓存
Transformers 4.37 中文文档(十五)(1)
Transformers 4.37 中文文档(十五)
67 1
|
3月前
|
存储
Transformers 4.37 中文文档(十五)(2)
Transformers 4.37 中文文档(十五)
56 1
|
3月前
|
自然语言处理 算法 PyTorch
Transformers 4.37 中文文档(十五)(4)
Transformers 4.37 中文文档(十五)
38 1
|
3月前
|
存储 自然语言处理
Transformers 4.37 中文文档(十五)(3)
Transformers 4.37 中文文档(十五)
46 1
|
3月前
|
自然语言处理 PyTorch TensorFlow
Transformers 4.37 中文文档(十七)(4)
Transformers 4.37 中文文档(十七)
38 1
|
3月前
|
PyTorch TensorFlow 算法框架/工具
Transformers 4.37 中文文档(十七)(2)
Transformers 4.37 中文文档(十七)
32 1
|
3月前
|
文字识别 PyTorch TensorFlow
Transformers 4.37 中文文档(十七)(5)
Transformers 4.37 中文文档(十七)
42 1
|
3月前
|
存储 PyTorch TensorFlow
Transformers 4.37 中文文档(十七)(1)
Transformers 4.37 中文文档(十七)
42 1