Класс 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,
который уменьшает скорость при отсутствии прогресса