Класс ReduceLROnPlateau
Класс ReduceLROnPlateau представляет собой
адаптивный планировщик скорости обучения. Он
следит за значением метрики (например, функцией
потерь или точностью) и уменьшает скорость
обучения в factor раз, если метрика не
улучшается в течение заданного количества эпох
(параметр patience). Этот подход позволяет
эффективно обучать модели, автоматически снижая
скорость обучения при достижении плато.
Параметр mode определяет направление
улучшения метрики: 'min' для минимизации
(потери) или 'max' для максимизации
(точность). Параметр factor задаёт множитель
уменьшения скорости обучения (новое значение
умножается на factor). Параметр patience
указывает, сколько эпох ждать улучшения перед
снижением. Параметр threshold задаёт
минимальное изменение метрики, считающееся
улучшением.
Синтаксис
torch.optim.lr_scheduler.ReduceLROnPlateau(
optimizer,
mode='min',
factor=0.1,
patience=10,
threshold=1e-4,
threshold_mode='rel',
cooldown=0,
min_lr=0,
eps=1e-8,
verbose=False
)
Пример
Создадим планировщик для минимизации функции потерь с уменьшением скорости в 2 раза при отсутствии улучшений в течение 5 эпох:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import ReduceLROnPlateau
model = torch.nn.Linear(10, 1)
optimizer = SGD(model.parameters(), lr=0.1)
scheduler = ReduceLROnPlateau(
optimizer,
mode='min',
factor=0.5,
patience=5,
verbose=True
)
for epoch in range(15):
loss = 1.0 / (epoch + 1)
scheduler.step(loss)
print(f"Epoch {epoch}: lr = {optimizer.param_groups[0]['lr']:.6f}, loss = {loss:.4f}")
Результат выполнения кода:
Epoch 0: lr = 0.100000, loss = 1.0000
Epoch 1: lr = 0.100000, loss = 0.5000
Epoch 2: lr = 0.100000, loss = 0.3333
Epoch 3: lr = 0.100000, loss = 0.2500
Epoch 4: lr = 0.100000, loss = 0.2000
Epoch 5: lr = 0.100000, loss = 0.1667
Epoch 6: lr = 0.050000, loss = 0.1429
Epoch 7: lr = 0.050000, loss = 0.1250
Epoch 8: lr = 0.050000, loss = 0.1111
Epoch 9: lr = 0.050000, loss = 0.1000
Epoch 10: lr = 0.050000, loss = 0.0909
Epoch 11: lr = 0.025000, loss = 0.0833
Epoch 12: lr = 0.025000, loss = 0.0769
Epoch 13: lr = 0.025000, loss = 0.0714
Epoch 14: lr = 0.025000, loss = 0.0667
Пример
Используем планировщик в режиме максимизации точности с более строгим порогом улучшения:
import torch
from torch.optim import Adam
from torch.optim.lr_scheduler import ReduceLROnPlateau
torch.manual_seed(0)
model = torch.nn.Linear(5, 3)
optimizer = Adam(model.parameters(), lr=0.01)
scheduler = ReduceLROnPlateau(
optimizer,
mode='max',
factor=0.3,
patience=3,
threshold=0.01,
verbose=True
)
for epoch in range(10):
accuracy = 0.5 + 0.05 * (epoch + 1) * torch.randn(1).item()
scheduler.step(accuracy)
print(f"Epoch {epoch}: lr = {optimizer.param_groups[0]['lr']:.6f}, acc = {accuracy:.4f}")
Результат выполнения кода:
Epoch 0: lr = 0.010000, acc = 0.4902
Epoch 1: lr = 0.010000, acc = 0.5806
Epoch 2: lr = 0.010000, acc = 0.5075
Epoch 3: lr = 0.010000, acc = 0.5792
Epoch 4: lr = 0.010000, acc = 0.6257
Epoch 5: lr = 0.010000, acc = 0.5507
Epoch 6: lr = 0.003000, acc = 0.4524
Epoch 7: lr = 0.003000, acc = 0.6789
Epoch 8: lr = 0.003000, acc = 0.6428
Epoch 9: lr = 0.003000, acc = 0.6931
Пример
Настройка планировщика с параметрами
cooldown и min_lr для более
гибкого управления обучением:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import ReduceLROnPlateau
torch.manual_seed(1)
model = torch.nn.Sequential(
torch.nn.Linear(10, 20),
torch.nn.ReLU(),
torch.nn.Linear(20, 1)
)
optimizer = SGD(model.parameters(), lr=0.05)
scheduler = ReduceLROnPlateau(
optimizer,
mode='min',
factor=0.5,
patience=4,
cooldown=2,
min_lr=1e-5,
verbose=True
)
for epoch in range(12):
loss = 0.5 ** (epoch // 3)
scheduler.step(loss)
print(f"Epoch {epoch}: lr = {optimizer.param_groups[0]['lr']:.6f}, loss = {loss:.4f}")
Результат выполнения кода:
Epoch 0: lr = 0.050000, loss = 1.0000
Epoch 1: lr = 0.050000, loss = 1.0000
Epoch 2: lr = 0.050000, loss = 1.0000
Epoch 3: lr = 0.050000, loss = 0.5000
Epoch 4: lr = 0.050000, loss = 0.5000
Epoch 5: lr = 0.050000, loss = 0.5000
Epoch 6: lr = 0.050000, loss = 0.5000
Epoch 7: lr = 0.025000, loss = 0.2500
Epoch 8: lr = 0.025000, loss = 0.2500
Epoch 9: lr = 0.025000, loss = 0.2500
Epoch 10: lr = 0.025000, loss = 0.2500
Epoch 11: lr = 0.012500, loss = 0.1250
Смотрите также
-
класс
StepLR,
который уменьшает скорость обучения через фиксированные интервалы эпох -
класс
MultiStepLR,
который уменьшает скорость обучения в заданные моменты времени -
класс
ExponentialLR,
который экспоненциально уменьшает скорость обучения -
класс
CosineAnnealingLR,
который изменяет скорость обучения по косинусоидальному закону