Класс ExponentialLR
Класс ExponentialLR является scheduler'ом из модуля torch.optim.lr_scheduler. Он позволяет умножать текущую скорость обучения на постоянный коэффициент gamma на каждом шаге. Параметр gamma должен быть меньше единицы для уменьшения скорости обучения. Первым параметром конструктор принимает объект оптимизатора, вторым - коэффициент затухания.
Синтаксис
torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1, verbose=False)
Параметры:
-
optimizer- оптимизатор, скорость обучения которого будет изменяться; -
gamma- множитель, на который умножается текущая скорость обучения (должен быть меньше 1 для затухания); -
last_epoch- номер последней эпохи (по умолчанию -1); -
verbose- флаг вывода сообщений при изменении скорости обучения.
Пример с линейной моделью
Создадим простую линейную модель и оптимизатор SGD, затем применим экспоненциальное затухание:
import torch
model = torch.nn.Linear(10, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=1.0)
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
for epoch in range(5):
optimizer.step()
scheduler.step()
print(f'Epoch {epoch}: lr = {optimizer.param_groups[0]["lr"]:.4f}')
Результат выполнения кода:
Epoch 0: lr = 0.9000
Epoch 1: lr = 0.8100
Epoch 2: lr = 0.7290
Epoch 3: lr = 0.6561
Epoch 4: lr = 0.5905
Пример с разными gamma
Сравним поведение скорости обучения при разных значениях коэффициента затухания:
import torch
model1 = torch.nn.Linear(5, 2)
optimizer1 = torch.optim.Adam(model1.parameters(), lr=1.0)
scheduler1 = torch.optim.lr_scheduler.ExponentialLR(optimizer1, gamma=0.8)
model2 = torch.nn.Linear(5, 2)
optimizer2 = torch.optim.Adam(model2.parameters(), lr=1.0)
scheduler2 = torch.optim.lr_scheduler.ExponentialLR(optimizer2, gamma=0.5)
for epoch in range(6):
scheduler1.step()
scheduler2.step()
print(f'Epoch {epoch}: gamma=0.8 -> {optimizer1.param_groups[0]["lr"]:.4f}, gamma=0.5 -> {optimizer2.param_groups[0]["lr"]:.4f}')
Результат выполнения кода:
Epoch 0: gamma=0.8 -> 0.8000, gamma=0.5 -> 0.5000
Epoch 1: gamma=0.8 -> 0.6400, gamma=0.5 -> 0.2500
Epoch 2: gamma=0.8 -> 0.5120, gamma=0.5 -> 0.1250
Epoch 3: gamma=0.8 -> 0.4096, gamma=0.5 -> 0.0625
Epoch 4: gamma=0.8 -> 0.3277, gamma=0.5 -> 0.0313
Epoch 5: gamma=0.8 -> 0.2621, gamma=0.5 -> 0.0156
Пример с пользовательской начальной эпохой
Параметр last_epoch позволяет задать начальный номер эпохи для продолжения обучения:
import torch
model = torch.nn.Linear(10, 5)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95, last_epoch=10)
for epoch in range(3):
scheduler.step()
print(f'Epoch {epoch}: lr = {optimizer.param_groups[0]["lr"]:.6f}')
Результат выполнения кода:
Epoch 0: lr = 0.063025
Epoch 1: lr = 0.059874
Epoch 2: lr = 0.056880
Смотрите также
-
класс
StepLR,
который уменьшает скорость обучения с фиксированным шагом -
класс
MultiStepLR,
который уменьшает скорость обучения на заданных эпохах -
класс
CosineAnnealingLR,
который использует косинусное затухание скорости обучения -
класс
ReduceLROnPlateau,
который уменьшает скорость обучения при остановке улучшения метрики