Класс LinearLR
Класс LinearLR из модуля torch.optim.lr_scheduler
позволяет плавно изменять скорость обучения линейно от
начального значения до значения, умноженного на указанный
коэффициент. Процесс изменения происходит в течение
заданного количества шагов. После окончания периода
скорость обучения становится постоянной и равной
произведению начальной скорости обучения на коэффициент.
Первый параметр - оптимизатор, второй - количество шагов
для линейного изменения, третий - коэффициент умножения
для конечной скорости обучения.
Синтаксис
torch.optim.lr_scheduler.LinearLR(
optimizer,
start_factor=1.0 / 3,
end_factor=1.0,
total_iters=5,
last_epoch=-1,
verbose=False
)
Параметры
Обязательные параметры:
-
optimizer- оптимизатор, для которого будет изменяться скорость обучения
Необязательные параметры:
-
start_factor- множитель для начальной скорости обучения, по умолчанию1.0/3.0 -
end_factor- множитель для конечной скорости обучения, по умолчанию1.0 -
total_iters- количество шагов, в течение которых скорость обучения изменяется линейно, по умолчанию5 -
last_epoch- индекс последней эпохи, по умолчанию-1 -
verbose- еслиTrue, выводит сообщение при каждом изменении скорости, по умолчаниюFalse
Пример
Давайте создадим простую модель и оптимизатор
с начальной скоростью обучения 1.0, а затем
применим линейное изменение скорости обучения
в течение 10 эпох от начального значения
до значения, умноженного на 0.1:
import torch
import torch.nn as nn
from torch.optim.lr_scheduler import LinearLR
model = nn.Linear(10, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=1.0)
scheduler = LinearLR(
optimizer,
start_factor=1.0,
end_factor=0.1,
total_iters=10
)
for epoch in range(12):
optimizer.step()
current_lr = optimizer.param_groups[0]['lr']
print(f"Epoch {epoch}: lr = {current_lr:.4f}")
scheduler.step()
Результат выполнения кода:
Epoch 0: lr = 1.0000
Epoch 1: lr = 0.9100
Epoch 2: lr = 0.8200
Epoch 3: lr = 0.7300
Epoch 4: lr = 0.6400
Epoch 5: lr = 0.5500
Epoch 6: lr = 0.4600
Epoch 7: lr = 0.3700
Epoch 8: lr = 0.2800
Epoch 9: lr = 0.1900
Epoch 10: lr = 0.1000
Epoch 11: lr = 0.1000
Пример
Давайте используем параметр start_factor,
чтобы начать обучение с меньшей скорости
и линейно увеличить её до исходной в течение
5 эпох:
import torch
import torch.nn as nn
from torch.optim.lr_scheduler import LinearLR
model = nn.Linear(10, 1)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
scheduler = LinearLR(
optimizer,
start_factor=0.2,
end_factor=1.0,
total_iters=5
)
for epoch in range(8):
optimizer.step()
current_lr = optimizer.param_groups[0]['lr']
print(f"Epoch {epoch}: lr = {current_lr:.6f}")
scheduler.step()
Результат выполнения кода:
Epoch 0: lr = 0.002000
Epoch 1: lr = 0.003600
Epoch 2: lr = 0.005200
Epoch 3: lr = 0.006800
Epoch 4: lr = 0.008400
Epoch 5: lr = 0.010000
Epoch 6: lr = 0.010000
Epoch 7: lr = 0.010000
Пример
Давайте создадим планировщик для группы параметров
с начальной скоростью обучения 0.5 и линейным
уменьшением до 0.1 за 3 эпохи:
import torch
import torch.nn as nn
from torch.optim.lr_scheduler import LinearLR
model = nn.Sequential(
nn.Linear(5, 10),
nn.ReLU(),
nn.Linear(10, 1)
)
optimizer = torch.optim.Adam(model.parameters(), lr=0.5)
scheduler = LinearLR(
optimizer,
start_factor=1.0,
end_factor=0.2,
total_iters=3
)
for epoch in range(6):
optimizer.step()
current_lr = optimizer.param_groups[0]['lr']
print(f"Epoch {epoch}: lr = {current_lr:.4f}")
scheduler.step()
Результат выполнения кода:
Epoch 0: lr = 0.5000
Epoch 1: lr = 0.3667
Epoch 2: lr = 0.2333
Epoch 3: lr = 0.1000
Epoch 4: lr = 0.1000
Epoch 5: lr = 0.1000
Смотрите также
-
класс
StepLR,
который уменьшает скорость обучения через фиксированные интервалы -
класс
MultiStepLR,
который уменьшает скорость обучения на заданных эпохах -
класс
ExponentialLR,
который умножает скорость обучения на коэффициент на каждой эпохе -
класс
ConstantLR,
который умножает скорость обучения на фиксированный коэффициент