Класс LambdaLR
Класс LambdaLR используется для изменения скорости обучения оптимизатора
с помощью произвольной функции, задаваемой пользователем. Он принимает
оптимизатор и лямбда-функцию, которая вычисляет множитель для текущей
скорости обучения на каждой эпохе. Это позволяет реализовать любую стратегию
изменения скорости обучения, не ограничиваясь встроенными расписаниями.
Синтаксис
torch.optim.lr_scheduler.LambdaLR(
optimizer,
lr_lambda,
last_epoch=-1,
verbose=False
)
Параметры:
optimizer - оптимизатор, скорость обучения которого
будет изменяться;
lr_lambda - функция или список функций, принимающих
номер эпохи и возвращающих множитель для скорости обучения;
last_epoch - номер последней эпохи (по умолчанию -1);
verbose - если True, выводит сообщение при
каждом изменении скорости обучения.
Пример
Давайте создадим простое расписание, которое линейно уменьшает скорость обучения:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import LambdaLR
# Создаём модель с одним параметром
model = torch.nn.Linear(10, 1)
optimizer = SGD(model.parameters(), lr=0.1)
# Лямбда-функция: линейное уменьшение от 1 до 0 за 10 эпох
scheduler = LambdaLR(
optimizer,
lr_lambda=lambda epoch: 1 - epoch / 10
)
# Симулируем обучение
for epoch in range(5):
optimizer.step()
scheduler.step()
current_lr = optimizer.param_groups[0]['lr']
print(f'Epoch {epoch + 1}: learning rate = {current_lr:.4f}')
Результат выполнения кода:
Epoch 1: learning rate = 0.0900
Epoch 2: learning rate = 0.0800
Epoch 3: learning rate = 0.0700
Epoch 4: learning rate = 0.0600
Epoch 5: learning rate = 0.0500
Пример
Давайте реализуем экспоненциальное затухание скорости обучения:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import LambdaLR
# Создаём модель с двумя параметрами
model = torch.nn.Linear(10, 2)
optimizer = SGD(model.parameters(), lr=0.1)
# Лямбда-функция: экспоненциальное затухание
scheduler = LambdaLR(
optimizer,
lr_lambda=lambda epoch: 0.9 ** epoch
)
# Симулируем обучение
for epoch in range(5):
optimizer.step()
scheduler.step()
current_lr = optimizer.param_groups[0]['lr']
print(f'Epoch {epoch + 1}: learning rate = {current_lr:.4f}')
Результат выполнения кода:
Epoch 1: learning rate = 0.0900
Epoch 2: learning rate = 0.0810
Epoch 3: learning rate = 0.0729
Epoch 4: learning rate = 0.0656
Epoch 5: learning rate = 0.0590
Пример
Давайте создадим расписание с различными функциями для разных групп параметров:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import LambdaLR
# Создаём модель с двумя параметрами
model = torch.nn.Linear(10, 2)
# Разные скорости для разных групп параметров
optimizer = SGD([
{'params': model.weight, 'lr': 0.1},
{'params': model.bias, 'lr': 0.01}
])
# Разные функции для каждой группы
scheduler = LambdaLR(
optimizer,
lr_lambda=[
lambda epoch: 0.8 ** epoch, # для весов
lambda epoch: 0.9 ** epoch # для смещений
]
)
# Симулируем обучение
for epoch in range(4):
optimizer.step()
scheduler.step()
lr_weight = optimizer.param_groups[0]['lr']
lr_bias = optimizer.param_groups[1]['lr']
print(f'Epoch {epoch + 1}: weight LR = {lr_weight:.4f}, bias LR = {lr_bias:.4f}')
Результат выполнения кода:
Epoch 1: weight LR = 0.0800, bias LR = 0.0090
Epoch 2: weight LR = 0.0640, bias LR = 0.0081
Epoch 3: weight LR = 0.0512, bias LR = 0.0073
Epoch 4: weight LR = 0.0410, bias LR = 0.0066
Пример
Давайте реализуем расписание с "разогревом" и последующим затуханием:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import LambdaLR
model = torch.nn.Linear(10, 1)
optimizer = SGD(model.parameters(), lr=0.1)
# Функция: разогрев 5 эпох, затем линейное затухание
def warmup_decay(epoch):
if epoch < 5:
return 0.2 + 0.8 * (epoch / 5) # разогрев от 0.2 до 1.0
else:
return max(0.01, 1.0 - 0.1 * (epoch - 5)) # затухание
scheduler = LambdaLR(optimizer, lr_lambda=warmup_decay)
# Симулируем обучение
for epoch in range(10):
optimizer.step()
scheduler.step()
current_lr = optimizer.param_groups[0]['lr']
print(f'Epoch {epoch + 1}: learning rate = {current_lr:.4f}')
Результат выполнения кода:
Epoch 1: learning rate = 0.0400
Epoch 2: learning rate = 0.0600
Epoch 3: learning rate = 0.0800
Epoch 4: learning rate = 0.1000
Epoch 5: learning rate = 0.1200
Epoch 6: learning rate = 0.0900
Epoch 7: learning rate = 0.0600
Epoch 8: learning rate = 0.0300
Epoch 9: learning rate = 0.0100
Epoch 10: learning rate = 0.0100
Смотрите также
-
класс
StepLR,
который уменьшает скорость обучения с фиксированным шагом -
класс
ExponentialLR,
который уменьшает скорость обучения экспоненциально -
класс
CosineAnnealingLR,
который использует косинусоидальное расписание -
класс
MultiplicativeLR,
который умножает скорость обучения на заданную функцию