Re:ゼロから始めるML生活

どちらかといえばエミリア派です

【備忘録】PyTorchのOptimizerとSchedulerの挙動

f:id:nogawanogawa:20181029135436p:plain:w600

PyTorch書いてて、ちょっとわからなくなってしまったので、調べたことを備忘として残しておくメモです。

Optimizerの挙動

pytorch.org

PyTorchのOptimizerには様々な最適化手法が用意されています。 AdamとかSGDとか、アレです。 大体この辺とAdamWくらいしか目にすることはないかと思いますが、他にもたくさんあります。 詳しくはドキュメントを参照ください。

pytorch.org

挙動の確認

さて、この辺は実際に図があると便利なので残しておきます。

f:id:nogawanogawa:20220102225011p:plain

最適化関数にもいろいろあるわけです。 この辺については参考文献を見ていただければと思います。

Scheduler

本家の説明を見てみます。

torch.optim.lr_scheduler provides several methods to adjust the learning rate based on the number of epochs. torch.optim.lr_scheduler.ReduceLROnPlateau allows dynamic learning rate reducing based on some validation measurements. torch.optim — PyTorch 1.10.1 documentation

なにも考えずにOptimizerを使うと、ミニバッチごとに学習率が変化するわけです。 これをepochごとにも調整したい場合があったりします。

そんなときに使用するのがschedulerってイメージですかね。

model = [Parameter(torch.randn(2, 2, requires_grad=True))]
optimizer = SGD(model, 0.1)
scheduler = ExponentialLR(optimizer, gamma=0.9)

for epoch in range(20):
    for input, target in dataset:
        optimizer.zero_grad()
        output = model(input)
        loss = loss_fn(output, target)
        loss.backward()
        optimizer.step()
    scheduler.step()

こちらも色々種類があります。

pytorch.org

挙動の確認

f:id:nogawanogawa:20220102231543p:plain

先程より学習の進行が鈍くなったことがわかるでしょうか? コードではミニバッチは使ってないんですが、schedulerによる学習率の減衰が加わったため学習が遅くなっているわけです。

実際にはサンプルコードのようにoptimizer.stepはミニバッチごと、schedulerはepochごとに減衰させていくのが正しそうです。

参考文献

下記の文献を参考にさせていただきました。

pytorch.org

rightcode.co.jp

katsura-jp.hatenablog.com

感想

以上、ちょっとPyTorchのコード書いてて「Schedulerってなんだっけな?Optimizerとの違いって何だっけ?」って混乱してしまったので、備忘用のメモでした。