学習率の変化による損失と精度への影響 (1)
はじめに
前回の記事において、epochの途中で学習率を変更すると精度が上昇する現象が確認できたため、エポックごとに学習率を変化させた時の損失と精度を調べてみた。
https://github.com/9mao9/changing-learning-rate
実装環境
バージョン情報
- torch 1.10.0+cu111
- torchvision 0.11.1+cu111
- numpy 1.19.5
- sklearn 1.0.2
訓練データはCIFAR-100を利用した。
ネットワークモデルはWideResNetを用いた。
実験条件
- 入力サイズ:[3, 32, 32]
- バッチサイズ:128
- 初期学習率:0.1
- weight decay:5e-4
- optimizer: SGD (momentum: 0.9, nestrov=True)
- transform: RandAugmentation (magnitude: 10)
- Drop out: 0.3
学習率の更新
epoch数が[0, 60, 120]の時、学習率は[0.1, 0.02, 0.04]となる点に対して近似を行い、関数を作成した。学習率の上限は0.1、下限は0.004とし、下限に達するまでepochを増加させた。従って、(i), (ii), (iii)は100 epoch、(iv)は120 epoch、(v)は147 epochまで行った。
(1) 一定:(i) , (ii)
(2) 線形:(iii) , (iv)
(3) 非線形:(v) , (vi)
epoch数をとおいた。各条件を図1に示す。
結果
(i)と(ii)のepochと損失の関係を図2に示す。学習率が高い時の方が早く損失が小さくなり学習が進んでいるように見える。また、精度も早くに高くなっている。
(iii)と(iv)のepochと損失の関係を図3に示す。(iii)では学習率の下限0.004となる74 epochで損失および精度が収束している。(iv)では50 epochで一度収束し、学習率が小さくなるにつれて再度損失が小さくなった。
(v)と(vi)のepochと損失の関係を図4に示す。(v)のように学習の始めで大きく減少し緩やかになる学習率の設定だと損失の変化も緩やかになった。対して、始めは緩やかで徐々に大きく減少していく学習率だと損失がより小さくなった。
学習率が一定の時のepochと損失勾配の関係、線形、非線形の時の学習率と損失勾配の関係を図5に示す。(i)では60 epochで勾配は収束した。(ii)は勾配の振動が大きく最小値に収束していないため、まだ学習の途中であると考えられる。(iii) - (vi)では一度最小値に達した後、再び勾配は大きくなっていった。
損失勾配は式(1)により導出したため、厳密には損失の勾配とは異なる。
は損失勾配、は損失コスト、は学習率である。
結論
本実験より、一般的に言われている「学習率は大きいほど学習が早く進む」ことを確認できた。また、今回用いたネットワークに限定されるかもしれないが、学習率を動的に変化させる方が損失が小さく精度は高くなる傾向にあることがわかった。その際、(iv)または(vi)のような徐々に学習率が小さくなる方法がよさげであった。
勾配と学習率の関係において、一度最小値に達した後、再び勾配は大きなったことについて、勾配の振動については(2)の記事を設けて調査する。