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://huggingface.co/papers/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 預熱或 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)

當在 Trainer 中使用 lr=None 時,您很可能需要使用 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 )

引數

  • 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, optional, defaults to 0.0) — 要應用的權重衰減率。
  • include_in_weight_decay (list[str], optional) — 要應用權重衰減的引數名稱列表(或正則表示式模式)。如果未傳遞,則預設對所有引數應用權重衰減(除非它們在 exclude_from_weight_decay 中)。
  • exclude_from_weight_decay (list[str], optional) — 要從權重衰減中排除的引數名稱列表(或正則表示式模式)。如果傳遞了 include_in_weight_decay,則其中的名稱將覆蓋此列表。
  • name (str, optional, defaults to "AdamWeightDecay") — 應用梯度時建立的操作的可選名稱。
  • kwargs (dict[str, Any], optional) — 關鍵字引數。允許為 {clipnorm, clipvalue, lr, decay}。clipnorm 是按範數裁剪梯度;clipvalue 是按值裁剪梯度,decay 是為了向後相容而包含的,允許學習率的時間反向衰減。lr 也是為了向後相容而包含的,推薦使用 learning_rate

Adam 啟用 L2 權重衰減和梯度的 clip_by_global_norm。僅僅將權重的平方新增到損失函式中並*不是*在 Adam 中使用 L2 正則化/權重衰減的正確方法,因為這會以奇怪的方式與 m 和 v 引數互動,如 Decoupled Weight Decay Regularization 中所示。

相反,我們希望以一種不與 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, optional, defaults to 0) — 線性衰減結束時的最終學習率將是 init_lr * min_lr_ratio
  • adam_beta1 (float, optional, defaults to 0.9) — Adam 中使用的 beta1。
  • adam_beta2 (float, optional, defaults to 0.999) — Adam 中使用的 beta2。
  • adam_epsilon (float, optional, defaults to 1e-8) — Adam 中使用的 epsilon。
  • adam_clipnorm (float, optional, defaults to None) — 如果不為 None,將每個權重張量的梯度範數裁剪到此值。
  • adam_global_clipnorm (float, optional, defaults to None) — 如果不為 None,將梯度範數裁剪到此值。使用此引數時,範數是在所有權重張量上計算的,就像它們被連線成一個單一向量一樣。
  • weight_decay_rate (float, optional, defaults to 0) — 要使用的權重衰減率。
  • power (float, optional, defaults to 1.0) — 用於 PolynomialDecay 的冪。
  • include_in_weight_decay (list[str], optional) — 要應用權重衰減的引數名稱列表(或正則表示式模式)。如果未傳遞,則對除偏置和層歸一化引數外的所有引數應用權重衰減。

建立一個最佳化器,其學習率排程策略包含預熱階段和隨後的線性衰減。

排程器

學習率排程器 (PyTorch)

class transformers.SchedulerType

< >

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

TrainingArguments 中引數 lr_scheduler_type 的排程器名稱。預設情況下,它使用“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, 可選) — 要執行的預熱(warmup)步數。並非所有排程器都需要此引數(因此該引數是可選的),如果未設定而排程器型別需要它,函式將引發錯誤。
  • num_training_steps (`int`, 可選) — 要執行的訓練步數。並非所有排程器都需要此引數(因此該引數是可選的),如果未設定而排程器型別需要它,函式將引發錯誤。
  • scheduler_specific_kwargs (dict, 可選) — 排程器的額外引數,例如帶重啟的餘弦(cosine with restarts)排程器。不匹配的排程器型別和排程器引數將導致排程器函式引發 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) — 預熱(warmup)階段的步數。
  • last_epoch (int, 可選, 預設為 -1) — 恢復訓練時最後一個週期的索引。

建立一個排程器,其學習率在預熱期內從 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) — 預熱(warmup)階段的步數。
  • num_training_steps (int) — 訓練的總步數。
  • num_cycles (float, 可選, 預設為 0.5) — 餘弦排程器中的波形數量(預設是遵循半個餘弦週期從最大值減少到 0)。
  • last_epoch (int, 可選, 預設為 -1) — 恢復訓練時最後一個週期的索引。

建立一個排程器,其學習率在預熱期內從 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) — 預熱(warmup)階段的步數。
  • num_training_steps (int) — 訓練的總步數。
  • num_cycles (int, 可選, 預設為 1) — 要使用的硬重啟次數。
  • last_epoch (int, 可選, 預設為 -1) — 恢復訓練時最後一個週期的索引。

建立一個排程器,其學習率在預熱期內從 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) — 預熱(warmup)階段的步數。
  • num_training_steps (int) — 訓練的總步數。
  • last_epoch (int, 可選, 預設為 -1) — 恢復訓練時最後一個週期的索引。

建立一個排程器,其學習率在預熱期內從 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) — 預熱(warmup)階段的步數。
  • num_training_steps (int) — 訓練的總步數。
  • lr_end (float, 可選, 預設為 1e-7) — 最終學習率。
  • power (float, 可選, 預設為 1.0) — 冪因子。
  • last_epoch (int, 可選, 預設為 -1) — 恢復訓練時最後一個週期的索引。

建立一個排程器,其學習率在預熱期內從 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: typing.Optional[int] = None last_epoch: int = -1 )

引數

  • optimizer (~torch.optim.Optimizer) — 用於排程學習率的最佳化器。
  • num_warmup_steps (int) — 預熱(warmup)階段的步數。
  • timescale (int, 可選, 預設為 num_warmup_steps) — 時間尺度。
  • last_epoch (int, 可選, 預設為 -1) — 恢復訓練時最後一個週期的索引。

建立一個具有逆平方根學習率的排程器,在預熱期內學習率從 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) — 預熱(warmup)階段的步數。
  • num_decay_steps (int) — 衰減階段的步數。
  • num_training_steps (int, 可選) — 訓練的總步數。這是預熱、穩定和衰減階段步數的總和。如果未提供 `num_stable_steps`,則穩定階段將為 `num_training_steps - num_warmup_steps - num_decay_steps`。
  • num_stable_steps (int, 可選) — 穩定階段的步數。請確保 `num_warmup_steps + num_stable_steps + num_decay_steps` 等於 `num_training_steps`,否則其他步驟將預設為最小學習率。
  • warmup_type (str, 可選, 預設為 “linear”) — 使用的預熱型別。可以是 ‘linear’、‘cosine’ 或 ‘1-sqrt’。
  • decay_type (str, 可選, 預設為 “cosine”) — 使用的衰減型別。可以是 ‘linear’、‘cosine’ 或 ‘1-sqrt’。
  • min_lr_ratio (float, 可選, 預設為 0) — 最小學習率與初始學習率的比率。
  • num_cycles (float, 可選, 預設為 0.5) — 餘弦排程器中的波形數量(預設是遵循半個餘弦週期從最大值減少到 0)。
  • last_epoch (int, 可選, 預設為 -1) — 恢復訓練時最後一個週期的索引。

建立一個具有三個階段學習率的排程器

  1. 預熱(warmup):按照 warmup_type 從初始學習率的 min_lr_ratio 倍增加到初始學習率。
  2. 穩定(stable):恆定學習率。
  3. 衰減(decay):按照 decay_type 從初始學習率降低到初始學習率的 min_lr_ratio 倍。

Warmup (TensorFlow)

class transformers.WarmUp

< >

( initial_learning_rate: float decay_schedule_fn: typing.Callable warmup_steps: int power: float = 1.0 name: typing.Optional[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

重置

< >

( )

重置當前副本上累積的梯度。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.