要約
LR Range Testを行って損失が最小となるときの学習率を初期値として決定して良さそう。
前書き
山岡さんの『ディープラーニングによる将棋AIの作り方3』を読んでいて、floodgateの2017年、2018年の棋譜もhttp://wdoor.c.u-tokyo.ac.jp/shogi/x/から入手できることを知った。2015年から2018年までの棋譜をダウンロードし、R2800以上のソフト同士が投了で終了したものだけを残したところ約1千万局面ほどになった。もちろんデータ数としては足りないのだが、簡単な検証をする分には十分な量なのではないかと思ったのでしばらく教師あり学習で遊んでみたい。
まずどのような実験をするにしても学習率を自動決定できれば嬉しい。Cyclical Learning Rate for Training Neural Networkという論文があり、主題は「学習率を上げたり下げたりしながら学習させることで学習が高速に進む」ことなのだが、その学習率の範囲を決定する方法として行われているLR Range Testが学習率の決定に利用できるのではないかと思ったので実装したみた。実のところ元論文はほとんど読んでおらず、
や
を読んでそれっぽい実装をしてみただけとなる。普通の教師あり学習を、という小さな学習率から始めて1ステップ学習が終わるごとに学習率を倍していき、学習時の損失を記録してくものとなっている。コードはMiacisのlearn.cppにある通りとなる。
実験
実験1:
倍率をとして各バッチサイズについてそれぞれ10回試行して平均を取った結果を示す。
上の記事では最下点における学習率よりも小さい値の方が良いとあるが、まず単純に最も損失が低くなっているときの学習率を見ていくと
バッチサイズ | 最下点での学習率 |
---|---|
8 | 0.000882 |
64 | 0.029991 |
512 | 0.032999 |
4096 | 0.020484 |
となっている。この結果をそのまま採用するならバッチサイズが小さくなったときに最適な学習率が大きくなるということになってしまうが、個人的には違和感がある。最下点あたりでの誤差で多少ぶれがあるのでもう少し試行回数を増やした方が良いかもしれない。
また、経験的にはバッチサイズ4096ならば学習率を0.1〜0.2にしても学習は進む。学習率の上げ方が細かすぎて、良い学習率に到達する前に学習が進みすぎているのかもしれないと考え、学習率の上昇率を1.2倍にして同じ実験を行った。
実験2:
倍率をとして各バッチサイズについてそれぞれ15回以上試行して平均を取った結果を示す。
大きく結果が変わるわけではなかった。最も損失が低くなっているときの学習率は
バッチサイズ | 最下点での学習率 |
---|---|
8 | 0.0034182 |
64 | 0.0146977 |
512 | 0.0253977 |
4096 | 0.0304772 |
となった。試行回数を増やした影響かバッチサイズの大小と最下点での学習率の大小が連動しており、こちらのほうがもっともらしい結果だと感じる。
最下点での学習率を良い学習率として採用して良いのかという問題はあるが、みたところ最下点での学習率もそこまで大きいものではないし、学習中にいくらか学習率は減衰させるので初期学習率は(発散しない程度ならば)多少大きくても良いのではないかと勝手に考えるものとして、とりあえずは最下点での学習率を初期値としてやっていこうと思う。気が向けばCyclical Learning Rateの手法自体も実装してみたい。