今日は学習率の最適化方法の一つであるCLR(Cyclical Learning Rate)に関してまとめていきます。
下記の論文を参考にしています。
Cyclical Learning Rates for Training Neural Networks
Cyclical Learning Rateの直観的な理解
ニューラルネットワークでの学習率のチューニング方法はAdamやrmspropなど色々とありますが、学習率の最適化を妨げてしまう一つの原因として鞍点の存在があげられます。
鞍点(あんてん、saddle point)は、多変数実関数の変域の中で、ある方向で見れば極大値だが別の方向で見れば極小値となる点である。
(Wikipediaより引用 https://ja.wikipedia.org/wiki/%E9%9E%8D%E7%82%B9)
一般的に学習率はイタレーション事に小さくするため、鞍点においても勾配が小さくなり学習が非効率となってしまいます。
そこでCLRでは学習率をあるレンジで上昇と下降を繰り返すことで、鞍点を横断することができ学習を進めさせることができます。
最もシンプルなCLRのtriangularでは、レンジ上限をmax_lr, 下限をbase_lr(min_lr)とすると図のようにして学習率を推移させます。

triangularの他にもtriangular2やexp_rangeがありますが、これらはレンジがサイクル事に変化していきます(狭くなっていきます)
パラメーターの決め方
CLRの肝になるパラメーターは上記のレンジの幅の決め方以外に
・max_lr(レンジ上限)、min_lr(レンジ下限)
・stepsize
があります。
ステップサイズの決め方に関して
ステップサイズは実験的にイタレーションサイズの2から10倍が良いとされています。
例えば訓練データが50,000あり、バッチサイズが100なら
ステップサイズ=50,000/100*(2~10) となります。
レンジの上限と下限の決め方に関して
レンジの上限下限を決めるためには少ないエポック数で
学習率を線形増加させた時のACCを見るLR range testを行います。

このようなグラフからACCが上昇開始した時の学習率と停滞し始めた時学習率をそれぞれmin_lr、max_lrと設定します。
LRテストはtriangularのモードでminとmaxを任意に設定して、ステップサイズをイタレーションサイズと同じすることによりテストが可能になるので、新しいデータセットではtriangularで学習率とACCの関係性を調べた後にCLRを行います。
どれくらい効果があるのか?
CLR間でもレンジ幅の設定の仕方で正答率にばらつきがあります。
論文で行われていた実験結果だと下のようになります。

この結果から
・policyによって正答率が結構変わる
・データセットの大きさによって使うべきpolicyが変わる
・expを使うモチベーションがあまりわかない
というようなことがわかります。
また一般的なadaptive learning rateとtriangularの比較も行われていました。

数字のレンジの行がCLRによる学習率のチューニングで下限-上限を表しています。
正答率としては劇的な変化はありませんが、少ないイタレーションでadaptive learning rateと近い値を出せていることがわかります。またpolicyをexp_rangeにするなどすればより良い結果が出せるかもしれません。
さらにCLRはadaptive learning rateと組み合わせることが可能で論文ではこれによりadaptive learning rate単体より良い精度が出ている実験結果が示されていました。
まとめ
学習率のチューニングはニューラルネットワークを実装する上で必ず必要になると思うので色々手札を用意しておいて、多様性に富んだモデルを作れればよいですね。
また最後に書いたadaptive learning rateとの組み合わせに関しては、気になるテクニックなので今後勉強予定です。
参考
kerasでのCLRの実装は下記にありました。
Please see https://github.com/bckenstler/CLR.