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

Класс 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,
    который изменяет скорость обучения по косинусоидальному закону
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить