教師あり学習での実験いろいろ

要約

  • 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にする。

f:id:tokumini:20200509192459p:plainf:id:tokumini:20200509192505p:plain
左:Policy損失 右:Value損失

 学習を続けているとPolicy損失の方は順調に下がるが、Valueの検証損失はわりと早い段階で下げ止まる。Valueについては過学習気味だと判断できると思う。

1要素だけ導入

cosine annealing

f:id:tokumini:20200510102407p:plainf:id:tokumini:20200510102411p:plain

 以下基本的に緑線赤線を下回ると嬉しい、そうでなければ悲しいという見方ができる。

 200Kまではcosine annealingの方が小さい損失になっているが、200Kでbaseline側が学習率1/10になって急激に下がるのでそこで逆転される。Value過学習もきっちり起こっているので微妙そう。

 しかし強化学習だと、学習の立ち上がりが早ければ、良いデータが生成されるタイミングが早くなるので良い可能性もある。また適切な学習率減衰タイミングを見定めるのが大変なので、何も考えず1回Validationを行うタイミングを周期としてcosine annealingをするというのはありかもしれない。個人的にbaselineのような学習率減衰方法だと検証損失のグラフに段ができるのが好きではないという事情もある。

weight decay

f:id:tokumini:20200510102839p:plainf:id:tokumini:20200510102842p:plain

 200Kまでの性能は重み減衰ありの方が悪いのだが、学習率減衰が起こったタイミングで逆転する。重み減衰をかけると重みパラメータが基本的に小さくなるので、相対的に見て学習率が大きくなると考えられる。重み減衰なしの場合より学習率を小さめにした方が良いのかもしれない。

 Value損失もやや改善されていそうだが、検証損失だけでなく学習損失も改善されているので、過学習の抑制ではなさそう?

dropout

f:id:tokumini:20200510103217p:plainf:id:tokumini:20200510103221p:plain

 Valueの検証損失は結構大きく改善された。一方で学習損失は悪化しているので、お手本のような過学習抑制という印象を受ける。しかしPolicy損失はやや悪化しているのが気になるところ。

cosine annealing and weight decay

f:id:tokumini:20200510103719p:plainf:id:tokumini:20200510103723p:plain

 重み減衰が小さい学習率で有効そうだったので、cosine annealingと組み合わせるとどうかという実験をした。検証損失についてPolicy損失はほとんど変わらず、Value損失はやや改善された。

全部入れ

 cosine annealing、dropout、weight decay

手違いで2回学習を回してしまった。

1回目

f:id:tokumini:20200510104442p:plainf:id:tokumini:20200510104445p:plain

2回目

f:id:tokumini:20200510104411p:plainf:id:tokumini:20200510104414p:plain

 Value損失は改善、Policy損失はやや悪化という感じ。もう少し回せばPolicy損失も同水準まで来るかもしれない?

全部比較(検証損失)

f:id:tokumini:20200510105420p:plainf:id:tokumini:20200510105423p:plain

 Policy損失についてbaselineを下回ったのは

  • weight_decayのみ
  • cosine_annealing_and_weight_decay

 Value損失についてbaselineを下回ったのは「cosine_annealingのみ」以外全て。

 バランスとして見るとcosine_annealing_and_weight_decayが一番良さそう。dropoutを入れた場合は「Value損失は改善するがPolicy損失は悪化する」という傾向がはっきり出る。どちらの損失が重要なのかは不明。

  1. Policy損失は学習損失と検証損失の差が小さいが、Value損失では差が大きい
  2. dropoutを入れた場合にValue損失は改善するがPolicy損失は悪化する

という2点から、Policyの方は学習データと検証データの分布にあまり違いがなく、Valueの方は違いが大きいと解釈できそう。なのでdropoutはValue側の全結合層にだけ入れたりした方がよいかもしれない? しかし強化学習でやる場合はPolicyの分布も大きく異なるかもしれない。結局強化学習でも試してみるしかないというようなところはある。

余談

 こういう線の色だけで区別させるグラフは色覚異常の人がわかりにくいのでやめろとよく言われるが、自分用としては見やすいのでこうしてしまう。論文とかで発表する場合はともかく、ブログ記事でどこまでちゃんとやるかは難しいところ……。