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

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