Класс MultiplicativeLR
Класс MultiplicativeLR предназначен для мультипликативного обновления скорости обучения оптимизатора. В отличие от других планировщиков, этот класс умножает текущую скорость обучения на заданное значение (коэффициент) после каждой эпохи. Коэффициент может быть как константой, так и вычисляться динамически с помощью пользовательской функции, что даёт гибкость в управлении процессом обучения.
Синтаксис
torch.optim.lr_scheduler.MultiplicativeLR(
optimizer,
lr_lambda,
last_epoch=-1,
verbose=False
)
Параметры конструктора
Конструктор класса принимает следующие параметры:
-
optimizer- оптимизатор, скорость обучения которого будет изменяться; -
lr_lambda- коэффициент или функция, вычисляющая коэффициент умножения. Может быть числом или функцией, принимающей эпоху и возвращающей число; -
last_epoch- индекс последней эпохи (по умолчанию -1). Используется для восстановления состояния планировщика; -
verbose- еслиTrue, выводит сообщения о каждом изменении скорости обучения.
Пример с константным коэффициентом
Давайте создадим планировщик, который умножает скорость обучения на 0.95 после каждой эпохи:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(10, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
scheduler = torch.optim.lr_scheduler.MultiplicativeLR(
optimizer,
lr_lambda=0.95
)
for epoch in range(5):
current_lr = optimizer.param_groups[0]['lr']
print(f"Epoch {epoch}: lr = {current_lr:.6f}")
scheduler.step()
Результат выполнения кода:
Epoch 0: lr = 0.100000
Epoch 1: lr = 0.095000
Epoch 2: lr = 0.090250
Epoch 3: lr = 0.085738
Epoch 4: lr = 0.081451
Пример с динамическим коэффициентом
Теперь создадим планировщик, который использует функцию для вычисления коэффициента умножения в зависимости от эпохи:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(10, 1)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
def lr_lambda(epoch):
return 1.0 / (epoch + 1)
scheduler = torch.optim.lr_scheduler.MultiplicativeLR(
optimizer,
lr_lambda=lr_lambda
)
for epoch in range(6):
current_lr = optimizer.param_groups[0]['lr']
print(f"Epoch {epoch}: lr = {current_lr:.6f}")
scheduler.step()
Результат выполнения кода:
Epoch 0: lr = 0.010000
Epoch 1: lr = 0.005000
Epoch 2: lr = 0.002500
Epoch 3: lr = 0.001250
Epoch 4: lr = 0.000625
Epoch 5: lr = 0.000313
Пример с восстановлением состояния
Покажем, как использовать параметр last_epoch для продолжения обучения с сохранённой позиции:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(10, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
scheduler = torch.optim.lr_scheduler.MultiplicativeLR(
optimizer,
lr_lambda=0.9,
last_epoch=2,
verbose=True
)
for epoch in range(3, 6):
print(f"Epoch {epoch}: current lr = {optimizer.param_groups[0]['lr']:.6f}")
scheduler.step()
Пример использования с обучением модели
Продемонстрируем использование планировщика в полном цикле обучения модели на синтетических данных:
import torch
import torch.nn as nn
import torch.optim as optim
torch.manual_seed(0)
model = nn.Linear(1, 1)
optimizer = optim.SGD(model.parameters(), lr=1.0)
loss_fn = nn.MSELoss()
scheduler = optim.lr_scheduler.MultiplicativeLR(
optimizer,
lr_lambda=0.95
)
x = torch.linspace(0, 1, 100).reshape(-1, 1)
y = 2 * x + 1 + 0.1 * torch.randn(100, 1)
for epoch in range(10):
optimizer.zero_grad()
pred = model(x)
loss = loss_fn(pred, y)
loss.backward()
optimizer.step()
scheduler.step()
if epoch % 2 == 0:
lr = optimizer.param_groups[0]['lr']
print(f"Epoch {epoch}: loss = {loss.item():.4f}, lr = {lr:.6f}")
Результат выполнения кода:
Epoch 0: loss = 0.8572, lr = 1.000000
Epoch 2: loss = 0.3503, lr = 0.902500
Epoch 4: loss = 0.2984, lr = 0.814506
Epoch 6: loss = 0.2863, lr = 0.735092
Epoch 8: loss = 0.2828, lr = 0.663420
Смотрите также
-
класс
StepLR,
который уменьшает скорость обучения через заданное количество эпох -
класс
ExponentialLR,
который умножает скорость обучения на постоянный коэффициент -
класс
LinearLR,
который линейно изменяет скорость обучения от начального значения -
класс
PolynomialLR,
который изменяет скорость обучения по полиномиальному закону