PyTorchで、エポックに応じて学習率を変更するSchedulerの基本的な使い方を見ていきます。
PyTorchに実装されているScheduler
以下、リンク先ドキュメントから、PyTorchに実装されているSchedulerは14種類あることがわかります。
— lr_scheduler.LambdaLR
— lr_scheduler.MultiplicativeLR
— lr_scheduler.StepLR
— lr_scheduler.MultiStepLR
— lr_scheduler.ConstantLR
— lr_scheduler.LinearLR
— lr_scheduler.ExponentialLR
— lr_scheduler.CosineAnnealingLR
— lr_scheduler.ChainedScheduler
— lr_scheduler.SequentialLR
— lr_scheduler.ReduceLROnPlateau
— lr_scheduler.CyclicLR
— lr_scheduler.OneCycleLR
— lr_scheduler.CosineAnnealingWarmRestarts
この中からいくつかのSchedulerの使い方を見ていきます。スケジューラーを使うには、モデルとオプティマイザーが必要なため、はじめにモデルを適当に作ります。また、学習率を表示する関数を定義します。
import torch
from torch import nn
import matplotlib.pyplot as plt
model = nn.Sequential(nn.Linear(1, 1), nn.Linear(1, 1))
# 学習率表示用
def lr_plot(scheduler):
lrs = []
for i in range(100):
optimizer.step()
lrs.append(optimizer.param_groups[0]["lr"])
scheduler.step()
plt.plot(lrs)
lr_scheduler.MultiStepLR
マイルストーンを設定し、エポック数がマイルストーンに到達すると、学習率が減衰するスケジューラーです。milestonesにマイルストーンとなるエポック数を指定、gammaにはマイルストーン時に乗算する値を指定します。
optimizer = torch.optim.SGD(model.parameters(), lr=1)
scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
lr_plot(scheduler)
lr_scheduler.LinearLR
線形に学習率を変更していくスケジューラーです。start_factorに1エポック目の学習率を指定、end_factorに最終的な学習率を指定、total_itersに最終的な学習率に何エポックで到達させるか指定します。
optimizer = torch.optim.SGD(model.parameters(), lr=1)
scheduler = torch.optim.lr_scheduler.LinearLR(optimizer, start_factor=1, end_factor=0.1, total_iters=50)
lr_plot(scheduler)
lr_scheduler.ExponentialLR
エポック毎にガンマの値を乗算していくスケジューラーです。gammaにエポック毎に乗算する値を指定します。
optimizer = torch.optim.SGD(model.parameters(), lr=1)
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.1)
lr_plot(scheduler)
コメント