Transformers documentation

Оптимизация

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Оптимизация

Модуль .optimization предоставляет:

  • оптимизатор с фиксированным weight decay, который можно использовать для дообучения моделей, и
  • несколько расписаний в виде объектов расписаний, наследующих от _LRSchedule:
  • класс накопления градиентов для накопления градиентов нескольких батчей

AdaFactor

класс transformers.Adafactor

< >

( paramslr = Noneeps = (1e-30, 0.001)clip_threshold = 1.0decay_rate = -0.8beta1 = Noneweight_decay = 0.0scale_parameter = Truerelative_step = Truewarmup_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: 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_parameter, relative_step и warmup_init. Чтобы использовать ручное (внешнее) расписание скорости обучения, необходимо установить scale_parameter=False и relative_step=False.

Эта реализация поддерживает значения с низкой точностью (FP16, bfloat), однако мы не проводили её тщательное тестирование.

Рекомендуемые настройки дообучения T5 (https://huggingface.co/proxy/discuss.huggingface.co/t/t5-finetuning-tips/684/3):

  • Не рекомендуется выполнять обучение без LR warmup или clip_threshold.

    • использование запланированного прогрева LR до фиксированного LR
    • используйте clip_threshold=1.0 (https://huggingface.co/papers/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

scheduler следующим образом:

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) — замыкание, которое повторно вычисляет модель и возвращает потерю.

Выполняет один шаг оптимизации

Расписания

SchedulerType

класс transformers.SchedulerType

< >

( valuenames = Nonemodule = Nonequalname = Nonetype = Nonestart = 1boundary = None )

Имена планировщиков для параметра lr_scheduler_type в TrainingArguments. По умолчанию используется «linear». Внутренне это получает планировщик get_linear_schedule_with_warmup из Trainer. Типы планировщиков:

get_scheduler

transformers.get_scheduler

< >

( name: str | SchedulerTypeoptimizer: Optimizernum_warmup_steps: int | None = Nonenum_training_steps: int | None = Nonescheduler_specific_kwargs: dict | None = None )

Параметры

  • name (str или SchedulerType) — Имя планировщика, который следует использовать.
  • optimizer (torch.optim.Optimizer) — Оптимизатор, который будет использоваться во время обучения.
  • num_warmup_steps (int, необязательный) — Количество шагов прогрева. Не все планировщики требуют этот параметр (поэтому аргумент является необязательным); если он не задан, а тип планировщика его требует, функция вызовет ошибку.
  • num_training_steps (`int“, необязательный) — Количество шагов обучения. Не все планировщики требуют этот параметр (поэтому аргумент является необязательным); если он не задан, а тип планировщика его требует, функция вызовет ошибку.
  • scheduler_specific_kwargs (dict, необязательный) — Дополнительные параметры для планировщиков, например, для косинусного с перезапусками. Несоответствие типа планировщика и его параметров приведет к тому, что функция планировщика вызовет TypeError.

Единый API для получения любого планировщика по его имени.

get_constant_schedule

transformers.get_constant_schedule

< >

( optimizer: Optimizerlast_epoch: int = -1 )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • last_epoch (int, необязательный, по умолчанию -1) — Индекс последней эпохи при возобновлении обучения.

Создайте расписание с постоянной скоростью обучения, используя скорость обучения, заданную в оптимизаторе.

get_constant_schedule_with_warmup

transformers.get_constant_schedule_with_warmup

< >

( optimizer: Optimizernum_warmup_steps: intlast_epoch: int = -1 )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • num_warmup_steps (int) — Количество шагов для фазы прогрева.
  • last_epoch (int, необязательный, по умолчанию -1) — Индекс последней эпохи при возобновлении обучения.

Создайте расписание с постоянной скоростью обучения, предшествующее которому период прогрева, в течение которого скорость обучения линейно возрастает от 0 до начального значения lr, заданного в оптимизаторе.

get_cosine_schedule_with_warmup

transformers.get_cosine_schedule_with_warmup

< >

( optimizer: Optimizernum_warmup_steps: intnum_training_steps: intnum_cycles: float = 0.5last_epoch: int = -1 )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • num_warmup_steps (int) — Количество шагов для фазы прогрева.
  • num_training_steps (int) — Общее количество шагов обучения.
  • num_cycles (float, необязательный, по умолчанию 0.5) — Количество волн в косинусной расписке (по умолчанию значение просто уменьшается от максимального до 0 по закону полукосинуса).
  • last_epoch (int, необязательный, по умолчанию -1) — Индекс последней эпохи при возобновлении обучения.

Создайте расписание с коэффициентом обучения, который уменьшается по значениям косинусоидальной функции от начального значения lr, заданного в оптимизаторе, до 0, после периода прогрева, в течение которого он линейно возрастает от 0 до начального значения lr, заданного в оптимизаторе.

get_cosine_with_hard_restarts_schedule_with_warmup

transformers.get_cosine_with_hard_restarts_schedule_with_warmup

< >

( optimizer: Optimizernum_warmup_steps: intnum_training_steps: intnum_cycles: int = 1last_epoch: int = -1 )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • num_warmup_steps (int) — Количество шагов для фазы прогрева.
  • num_training_steps (int) — Общее количество шагов обучения.
  • num_cycles (int, необязательный, по умолчанию 1) — Количество жёстких перезапусков.
  • last_epoch (int, необязательный, по умолчанию -1) — Индекс последней эпохи при возобновлении обучения.

Создайте расписание с коэффициентом обучения, который уменьшается по значениям косинусоидальной функции от начального значения lr, заданного в оптимизаторе, до 0, с несколькими жёсткими перезапусками, после периода прогрева, в течение которого он линейно возрастает от 0 до начального значения lr, заданного в оптимизаторе.

get_cosine_with_min_lr_schedule_with_warmup

transformers.get_cosine_with_min_lr_schedule_with_warmup

< >

( optimizer: Optimizernum_warmup_steps: intnum_training_steps: intnum_cycles: float = 0.5last_epoch: int = -1min_lr: float | None = Nonemin_lr_rate: float | None = None )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • num_warmup_steps (int) — Количество шагов для фазы прогрева.
  • num_training_steps (int) — Общее количество шагов обучения.
  • num_cycles (float, необязательный, по умолчанию 0.5) — Количество волн в косинусной расписке (по умолчанию значение просто уменьшается от максимального до 0 по закону полукосинуса).
  • last_epoch (int, необязательный, по умолчанию -1) — Индекс последней эпохи при возобновлении обучения.
  • min_lr (float, необязательный) — Минимальная скорость обучения, к которой нужно прийти после косинусной расписки.
  • min_lr_rate (float, необязательный) — Минимальная скорость обучения как доля от начальной скорости обучения. Если задано, min_lr не должно быть задано.

Создайте расписание с коэффициентом обучения, который уменьшается по значениям косинусоидальной функции от начального lr, заданного в оптимизаторе, до min_lr, после периода прогрева, в течение которого он линейно возрастает от 0 до начального lr, заданного в оптимизаторе.

get_cosine_with_min_lr_schedule_with_warmup_lr_rate

transformers.get_cosine_with_min_lr_schedule_with_warmup_lr_rate

< >

( optimizer: Optimizernum_warmup_steps: intnum_training_steps: intnum_cycles: float = 0.5last_epoch: int = -1min_lr: float | None = Nonemin_lr_rate: float | None = Nonewarmup_lr_rate: float | None = None )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • num_warmup_steps (int) — Количество шагов для фазы прогрева.
  • num_training_steps (int) — Общее количество шагов обучения.
  • num_cycles (float, необязательный, по умолчанию 0.5) — Количество волн в косинусной расписке (по умолчанию значение просто уменьшается от максимального до 0 по закону полукосинуса).
  • last_epoch (int, необязательный, по умолчанию -1) — Индекс последней эпохи при возобновлении обучения.
  • min_lr (float, необязательный) — Минимальная скорость обучения, к которой нужно прийти после косинусной расписки.
  • min_lr_rate (float, необязательный) — Минимальная скорость обучения как доля от начальной скорости обучения. Если задано, min_lr не должно быть задано.
  • warmup_lr_rate (float, необязательный) — Минимальная скорость обучения в виде отношения к начальной скорости обучения. Если не задано, warmup_lr_rate будет рассматриваться как float(1/num_warmup_steps).

Создайте расписание с коэффициентом обучения, который уменьшается по значениям косинусоидальной функции от начального lr, заданного в оптимизаторе, до min_lr, после периода прогрева, в течение которого он линейно возрастает от 0 до начального lr, заданного в оптимизаторе.

GreedyLR

класс transformers.GreedyLR

< >

( optimizer: Optimizermode: str = 'min'factor: float = 0.95patience: int = 10threshold: float = 1e-06threshold_mode: str = 'abs'cooldown: int = 0warmup: int = 0min_lr: float | list[float] = 0.001max_lr: float | list[float] = 1.0eps: float = 1e-08verbose: bool = Falsesmooth: bool = Falsewindow_size: int = 50reset_start: int = 500 )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • mode (str, необязательный, по умолчанию "min") — Одно из значений ‘min’ или ‘max’. В режиме ‘min’ LR снижается, когда метрика перестает уменьшаться; в режиме ‘max’ — когда перестает увеличиваться.
  • factor (float, необязательный, по умолчанию 0.95) — Коэффициент, на который будет скорректирована скорость обучения. На плато скорость обучения умножается на factor, а при улучшении — делится на factor. Должно быть < 1.0.
  • patience (int, необязательный, по умолчанию 10) — Количество эпох без улучшения, после которого будет скорректирована скорость обучения.
  • threshold (float, необязательный, по умолчанию 1e-06) — Порог для измерения нового оптимума.
  • threshold_mode (str, необязательный, по умолчанию "abs") — Одно из значений ‘rel’ или ‘abs’.
  • cooldown (int, необязательный, по умолчанию 0) — Количество эпох ожидания перед возобновлением нормальной работы после снижения LR.
  • warmup (int, необязательный, по умолчанию 0) — Количество эпох ожидания перед возобновлением нормальной работы после повышения LR.
  • min_lr (float или list[float], необязательный, по умолчанию 0.001) — Нижняя граница для коэффициента обучения.
  • max_lr (float или list[float], необязательный, по умолчанию 1.0) — Верхняя граница для коэффициента обучения.
  • eps (float, необязательный, по умолчанию 1e-08) — Минимальное затухание, применяемое к lr.
  • verbose (bool, необязательный, по умолчанию False) — Если True, выводит сообщение в stdout для каждого обновления.
  • smooth (bool, необязательный, по умолчанию False) — Если True, применяется сглаживание скользящим средним к метрикам.
  • window_size (int, необязательный, по умолчанию 50) — Размер окна для скользящего среднего при smooth=True.
  • reset_start (int, необязательный, по умолчанию 500) — Количество шагов ожидания на min_lr перед сбросом к начальному состоянию.

Адаптивный планировщик скорости обучения, реагирующий на метрики обучения.

GreedyLR динамически корректирует скорость обучения на основе результатов обучения:

  • Увеличивает LR, если метрики последовательно улучшаются (делит на коэффициент)
  • Уменьшает LR при стабилизации метрик (умножает на коэффициент)

Это отличается от традиционных планировщиков, таких как косинусная аннеалинг, тем, что реагирует на фактическую динамику обучения, а не следует заранее заданному расписанию.

Ссылка: GreedyLR: A Novel Adaptive Learning Rate Scheduler <https://arxiv.org/abs/2512.14527>_

Пример:

>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
>>> scheduler = GreedyLR(optimizer, mode="min", patience=10)
>>> for epoch in range(100):
...     train(...)
...     val_loss = validate(...)
...     scheduler.step(val_loss)

get_last_lr

< >

( )

Возвращает последнее вычисленное значение коэффициента обучения текущим планировщиком.

load_state_dict

< >

( state_dict: dict[str, Any] )

Загрузить состояние из словаря.

state_dict

< >

( )

Возвращает состояние планировщика в виде словаря.

шаг

< >

( metrics: floatepoch: int | None = None )

Параметры

  • metrics (float) — Значение метрики, используемое для принятия решений о корректировке скорости обучения.
  • epoch (int, необязательный) — Текущий номер эпохи. Если None, используется внутренний счётчик.

Выполнить шаг планировщика на основе переданных метрик.

get_greedy_schedule

transformers.get_greedy_schedule

< >

( optimizer: Optimizer**kwargs )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • kwargs (dict, необязательный) — Дополнительные параметры, передаваемые планировщику. См. GreedyLR для списка возможных параметров.

Создайте адаптивный планировщик скорости обучения, который корректирует LR на основе метрик обучения.

get_linear_schedule_with_warmup

transformers.get_linear_schedule_with_warmup

< >

( optimizernum_warmup_stepsnum_training_stepslast_epoch = -1 )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • num_warmup_steps (int) — Количество шагов для фазы прогрева.
  • num_training_steps (int) — Общее количество шагов обучения.
  • last_epoch (int, необязательный, по умолчанию -1) — Индекс последней эпохи при возобновлении обучения.

Создайте расписание с коэффициентом обучения, который линейно уменьшается от начального lr, заданного в оптимизаторе, до 0, после периода прогрева, в течение которого он линейно возрастает от 0 до начального lr, заданного в оптимизаторе.

get_polynomial_decay_schedule_with_warmup

transformers.get_polynomial_decay_schedule_with_warmup

< >

( optimizernum_warmup_stepsnum_training_stepslr_end = 1e-07power = 1.0last_epoch = -1 )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • num_warmup_steps (int) — Количество шагов для фазы прогрева.
  • num_training_steps (int) — Общее количество шагов обучения.
  • lr_end (float, необязательный, по умолчанию 1e-7) — Конечное значение LR.
  • power (float, необязательный, по умолчанию 1.0) — Коэффициент степени.
  • last_epoch (int, необязательный, по умолчанию -1) — Индекс последней эпохи при возобновлении обучения.

Создайте расписание с коэффициентом обучения, который уменьшается по полиномиальному закону затухания от начального lr, заданного в оптимизаторе, до конечного lr, определённого параметром lr_end, после периода прогрева, в течение которого он линейно возрастает от 0 до начального lr, заданного в оптимизаторе.

Примечание: power по умолчанию равно 1.0, как в реализации fairseq, которая, в свою очередь, основана на исходной реализации BERT по адресу https://github.com/google-research/bert/blob/f39e881b169b9d53bea03d2d341b31707a6c052b/optimization.py#L37

get_inverse_sqrt_schedule

transformers.get_inverse_sqrt_schedule

< >

( optimizer: Optimizernum_warmup_steps: inttimescale: int | None = Nonelast_epoch: int = -1 )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • num_warmup_steps (int) — Количество шагов для фазы прогрева.
  • timescale (int, необязательный, по умолчанию num_warmup_steps) — Масштаб времени.
  • last_epoch (int, необязательный, по умолчанию -1) — Индекс последней эпохи при возобновлении обучения.

Создайте расписание с обратной квадратно-корневой функцией для скорости обучения, начиная с начального значения lr, заданного в оптимизаторе, после периода прогрева, в течение которого lr линейно увеличивается от 0 до начального значения lr, заданного в оптимизаторе.

get_reduce_on_plateau_schedule

transformers.get_reduce_on_plateau_schedule

< >

( optimizer: Optimizer**kwargs )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • kwargs (dict, необязательный) — Дополнительные параметры, передаваемые планировщику. См. torch.optim.lr_scheduler.ReduceLROnPlateau для списка возможных параметров.

Создайте расписание с постоянной скоростью обучения, которая снижается, когда метрика перестала улучшаться.

get_wsd_schedule

transformers.get_wsd_schedule

< >

( optimizer: Optimizernum_warmup_steps: intnum_decay_steps: intnum_training_steps: int | None = Nonenum_stable_steps: int | None = Nonewarmup_type: str = 'linear'decay_type: str = 'cosine'min_lr_ratio: float = 0num_cycles: float = 0.5last_epoch: int = -1 )

Параметры

  • optimizer (~torch.optim.Optimizer) — Оптимизатор, для которого планируется изменение скорости обучения.
  • num_warmup_steps (int) — Количество шагов для фазы прогрева.
  • 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”) — Тип warmup. Может быть ‘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: увеличение с min_lr_ratio от начальной скорости обучения до начальной скорости обучения в соответствии с warmup_type.
  2. stable: постоянная скорость обучения.
  3. decay: снижение от начальной скорости обучения до значения, равного min_lr_ratio от начальной скорости обучения, в соответствии с decay_type.
Update on GitHub