要約
cosine annealing : 学習率一定よりは良さそうだが、適切なタイミングで1/10する場合よりも良いかというと微妙そう。しかし適切なタイミングを調べるのも大変なので、その手間を省くという意味では有用か
dropout : Value 損失は改善するがPolicy損失は悪化する
weight decay : 少し小さめの学習率、あるいはcosine annealingと組み合わせると効果がありそう
実験
強化学習 を回すのは時間がかかるので、ネットワーク自体の改良は教師あり学習 で検証することにしている。今回は次のものを試した。
cosine annealing : 20Kステップ周期で学習率を0.025から0.0025までcos関数の0~πに従って下げていく。下げ終わったら0.025からまたリスタート。
dropout : PolicyとValue に分岐する直前の層についてだけ確率0.5でdropoutする
weight decay : 係数1e-4の重み減衰をかける
どの実験も基本的にバッチサイズ512で400Kステップ回した。OptimizerはMomentum付きSGD 。
学習データはいつも通りfloodgate2015年の棋譜 を検証データ、2016年~2019年の棋譜 を学習データとして、どちらも両対局者のレートが2800以上のもののみを使用した。学習データについては左右反転のデータ拡張もありで計31,001,064局面、検証データはデータ拡張せず3,192,805局面。
各設定で1回しか実験を回していないので、特にbaselineでたまたま悪い結果を引いていたりすると結論が変わりそうだが、目をつぶっていただく方向で……。個人的な印象としてはそこまで結果がブレることはないと思っているのだが。
baseline
まずは基準となる今までどおりのネットワーク。学習率を0.025から開始し、50%、75%地点である200K、300Kステップ目で学習率を1/10にする。
左:Policy損失 右:Value 損失
学習を続けているとPolicy損失の方は順調に下がるが、Value の検証損失はわりと早い段階で下げ止まる。Value については過学習 気味だと判断できると思う。
1要素だけ導入
以下基本的に緑線 が赤線 を下回ると嬉しい、そうでなければ悲しいという見方ができる。
200Kまではcosine annealingの方が小さい損失になっているが、200Kでbaseline側が学習率1/10になって急激に下がるのでそこで逆転される。Value の過学習 もきっちり起こっているので微妙そう。
しかし強化学習 だと、学習の立ち上がりが早ければ、良いデータが生成されるタイミングが早くなるので良い可能性もある。また適切な学習率減衰タイミングを見定めるのが大変なので、何も考えず1回Validationを行うタイミングを周期としてcosine annealingをするというのはありかもしれない。個人的にbaselineのような学習率減衰方法だと検証損失のグラフに段ができるのが好きではないという事情もある。
weight decay
200Kまでの性能は重み減衰ありの方が悪いのだが、学習率減衰が起こったタイミングで逆転する。重み減衰をかけると重みパラメータが基本的に小さくなるので、相対的に見て学習率が大きくなると考えられる。重み減衰なしの場合より学習率を小さめにした方が良いのかもしれない。
Value 損失もやや改善されていそうだが、検証損失だけでなく学習損失も改善されているので、過学習 の抑制ではなさそう?
dropout
Value の検証損失は結構大きく改善された。一方で学習損失は悪化しているので、お手本のような過学習 抑制という印象を受ける。しかしPolicy損失はやや悪化しているのが気になるところ。
cosine annealing and weight decay
重み減衰が小さい学習率で有効そうだったので、cosine annealingと組み合わせるとどうかという実験をした。検証損失についてPolicy損失はほとんど変わらず、Value 損失はやや改善された。
全部入れ
cosine annealing、dropout、weight decay
手違いで2回学習を回してしまった。
1回目
2回目
Value 損失は改善、Policy損失はやや悪化という感じ。もう少し回せばPolicy損失も同水準まで来るかもしれない?
全部比較(検証損失)
Policy損失についてbaselineを下回ったのは
weight_decayのみ
cosine _annealing_and_weight_decay
Value 損失についてbaselineを下回ったのは「cosine _annealingのみ」以外全て。
バランスとして見るとcosine _annealing_and_weight_decayが一番良さそう。dropoutを入れた場合は「Value 損失は改善するがPolicy損失は悪化する」という傾向がはっきり出る。どちらの損失が重要なのかは不明。
Policy損失は学習損失と検証損失の差が小さいが、Value 損失では差が大きい
dropoutを入れた場合にValue 損失は改善するがPolicy損失は悪化する
という2点から、Policyの方は学習データと検証データの分布にあまり違いがなく、Value の方は違いが大きいと解釈できそう。なのでdropoutはValue 側の全結合層にだけ入れたりした方がよいかもしれない? しかし強化学習 でやる場合はPolicyの分布も大きく異なるかもしれない。結局強化学習 でも試してみるしかないというようなところはある。
余談
こういう線の色だけで区別させるグラフは色覚異常 の人がわかりにくいのでやめろとよく言われるが、自分用としては見やすいのでこうしてしまう。論文とかで発表する場合はともかく、ブログ記事でどこまでちゃんとやるかは難しいところ……。