接續上一篇討論的Optimizer與Learning Rate,今天來討論關於Learning Rate以及其Scheduler的挑選。
上一篇我們有提及Learning Rate的挑選是個重要的問題,太小會訓練太慢,太大則怕梯度爆炸。但要到底要怎麼挑選呢?是否有任何的依據?
這裡介紹一個十分熱門的參考方法,就是所謂的Learning Rate Finder。透過一個有限次數內的step,每個step使用不同的Learning Rate進行模型的訓練,觀察其Loss的變化程度,依照變化程度去尋找收斂較快的Learning Rate。
具體的作法Pytorch-Lightning的Tuner,可以直接實作,例如下面的例子:
# set tunner
trainer = pl.Trainer(**CONFIG['train']['trainer'])
# tunner
lr_finder = trainer.tuner.lr_find(net, data_generator)
跑出來以後就會得到類似這張圖,以及其建議的Learning Rate:
那麼這次實驗的結果是建議 0.0058,就可以考慮從這個周圍去選取並開始訓練囉!
實作部份可以參考這個tuner.py,一樣只要打下列就能跑:
python src/tuner.py --config=hparam.yaml
另外關於Learning Rate Finder的來源我沒有查到,最早看到是在Deeplearning.ai的課程當中。若有讀者知道的話,也請告訴我,感謝!
那麼拿到 0.0058 以後,其實也是有不少作法,可以就直接用這個值開始訓練。我個人的習慣則是會設置一個在這個值周圍的Scheduler,例如我個人的策略就會是,下降速度稍微慢一點沒關係,畢竟大多的情況通常都是必須要decay learning rate才比較有好結果,因此我會稍微再縮小一點,然後再下調某個range,用週期型的learning rate進行訓練。
所以我這邊使用的是CosineAnnealingLR,從0.001開始,然後最小值到0.00003,具體變化如下圖:
那麼接下來就讓我們進入訓練環節,明天來收菜吧!