PyTorch書いてて、ちょっとわからなくなってしまったので、調べたことを備忘として残しておくメモです。
Optimizerの挙動
PyTorchのOptimizerには様々な最適化手法が用意されています。 AdamとかSGDとか、アレです。 大体この辺とAdamWくらいしか目にすることはないかと思いますが、他にもたくさんあります。 詳しくはドキュメントを参照ください。
挙動の確認
さて、この辺は実際に図があると便利なので残しておきます。
最適化関数にもいろいろあるわけです。 この辺については参考文献を見ていただければと思います。
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()
こちらも色々種類があります。
挙動の確認
先程より学習の進行が鈍くなったことがわかるでしょうか? コードではミニバッチは使ってないんですが、schedulerによる学習率の減衰が加わったため学習が遅くなっているわけです。
実際にはサンプルコードのようにoptimizer.stepはミニバッチごと、schedulerはepochごとに減衰させていくのが正しそうです。
参考文献
下記の文献を参考にさせていただきました。
感想
以上、ちょっとPyTorchのコード書いてて「Schedulerってなんだっけな?Optimizerとの違いって何だっけ?」って混乱してしまったので、備忘用のメモでした。