РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
561 of 769 menu

Класс PolynomialLR

Класс PolynomialLR из модуля torch.optim.lr_scheduler позволяет изменять скорость обучения (learning rate) по полиномиальному закону. Он полезен, когда нужно плавно уменьшать скорость обучения от начального значения до заданного минимального в течение определённого количества эпох.

При создании объекта класса указываются оптимизатор, количество шагов (эпох) для изменения и степень полинома. После каждой эпохи планировщик пересчитывает новое значение скорости обучения.

Синтаксис

torch.optim.lr_scheduler.PolynomialLR( optimizer, total_iters=5, power=1.0, last_epoch=-1, verbose=False )

Метод принимает следующие параметры:

  • optimizer (Optimizer) - оптимизатор, скорость обучения которого будет изменяться
  • total_iters (int) - общее количество итераций (эпох), на протяжении которых применяется полиномиальное изменение, по умолчанию 5
  • power (float) - степень полинома, по умолчанию 1.0 (линейное изменение)
  • last_epoch (int) - индекс последней эпохи, по умолчанию -1
  • verbose (bool) - если True, то выводится сообщение при обновлении скорости, по умолчанию False

Пример

Давайте создадим простой оптимизатор SGD и применим к нему полиномиальное изменение скорости с линейным убыванием:

import torch import torch.nn as nn from torch.optim.lr_scheduler import PolynomialLR # Создаём простую модель model = nn.Linear(10, 1) optimizer = torch.optim.SGD(model.parameters(), lr=0.1) # Создаём планировщик scheduler = PolynomialLR( optimizer, total_iters=5, power=1.0 ) # Симулируем обучение в течение 10 эпох for epoch in range(1, 11): # Обновляем модель (имитация) optimizer.step() # Применяем планировщик scheduler.step() # Получаем текущую скорость current_lr = optimizer.param_groups[0]['lr'] print(f"Epoch {epoch}: lr = {current_lr:.4f}")

Результат выполнения кода:

Epoch 1: lr = 0.0800 Epoch 2: lr = 0.0600 Epoch 3: lr = 0.0400 Epoch 4: lr = 0.0200 Epoch 5: lr = 0.0000 Epoch 6: lr = 0.0000 Epoch 7: lr = 0.0000 Epoch 8: lr = 0.0000 Epoch 9: lr = 0.0000 Epoch 10: lr = 0.0000

Как видно, после истечения total_iters скорость остаётся на достигнутом минимальном значении.

Пример

Теперь давайте изменим степень полинома на 2, чтобы скорость уменьшалась по квадратичному закону:

import torch import torch.nn as nn from torch.optim.lr_scheduler import PolynomialLR model = nn.Linear(10, 1) optimizer = torch.optim.SGD(model.parameters(), lr=0.1) scheduler = PolynomialLR( optimizer, total_iters=4, power=2.0 ) # Фиксируем seed для воспроизводимости torch.manual_seed(0) for epoch in range(1, 8): optimizer.step() scheduler.step() current_lr = optimizer.param_groups[0]['lr'] print(f"Epoch {epoch}: lr = {current_lr:.4f}")

Результат выполнения кода:

Epoch 1: lr = 0.0900 Epoch 2: lr = 0.0700 Epoch 3: lr = 0.0400 Epoch 4: lr = 0.0000 Epoch 5: lr = 0.0000 Epoch 6: lr = 0.0000 Epoch 7: lr = 0.0000

При квадратичной зависимости скорость уменьшается быстрее в начале и медленнее к концу указанного периода.

Пример

Параметр last_epoch позволяет возобновить обучение с определённого шага. Установим его в значение 2, чтобы продолжить с третьей эпохи:

import torch import torch.nn as nn from torch.optim.lr_scheduler import PolynomialLR model = nn.Linear(10, 1) optimizer = torch.optim.SGD(model.parameters(), lr=0.1) scheduler = PolynomialLR( optimizer, total_iters=5, power=1.0, last_epoch=2 ) for epoch in range(1, 8): optimizer.step() scheduler.step() current_lr = optimizer.param_groups[0]['lr'] print(f"Epoch {epoch}: lr = {current_lr:.4f}")

Результат выполнения кода:

Epoch 1: lr = 0.0600 Epoch 2: lr = 0.0400 Epoch 3: lr = 0.0200 Epoch 4: lr = 0.0000 Epoch 5: lr = 0.0000 Epoch 6: lr = 0.0000 Epoch 7: lr = 0.0000

Обратите внимание: из-за last_epoch=2 планировщик начинает отсчёт не с нуля, а с третьей эпохи.

Смотрите также

  • класс StepLR,
    который уменьшает скорость обучения через заданные интервалы
  • класс ExponentialLR,
    который уменьшает скорость обучения по экспоненте
  • класс CosineAnnealingLR,
    который изменяет скорость по косинусоиде
  • класс ReduceLROnPlateau,
    который уменьшает скорость при отсутствии прогресса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить