スポンサーリンク

【PyTorch】エポックに応じて自動で学習率を変えるtorch.optim.lr_scheduler

Machine Learning

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)

関連記事、参考資料

コメント