MCTSnetの学習(仮)

 MCTSnetのだいたいの実装が終わり、将棋での教師あり学習を回し始めている。

 簡単に回してみたところ、Backupネットワークでの振る舞いが上手くいっていないように思えたので、論文の3.4 Design choicesに記載されているように、Backupネットワークをゲート付きの差分更新にして学習を行った。

f:id:tokumini:20200723101650p:plain

実験

 floodgateの2016年〜2019年の棋譜を用いて、棋譜で指された行動をOnehotの教師信号として交差エントロピーで損失を計算した。MCTSnetの正しい学習方法は以前記事に書いた通りだが、今回はとりあえず簡便のため、 M = 10回の探索まで都度ルートノードからReadoutを行い、教師と比較して損失を計算したものの和


\displaystyle
\sum _ {m = 1} ^ {M} l _ m

という単純な損失について学習を行った。

結果

f:id:tokumini:20200723095000p:plainf:id:tokumini:20200723095015p:plain
左:学習損失 右:検証損失

 図には1回探索後から10回探索後まで10本の学習曲線があるわけだが、それらがほぼ全て重なるような形になっている。学習が安定したようにも見えるが、Backupネットワークにゲートを追加した結果ゲートが常にOFFになるよう学習され、探索によってルートノードの埋め込みベクトルが全く更新されなくなっただけの可能性もある。

 ちなみにこのPolicy検証損失値が4.0付近という値は非常に悪い。今までのAlphaZeroモデル(10ブロック128チャンネル)などでほぼ同じデータに対して検証損失を計算すると、教師あり学習の場合なら1.5、強化学習の場合でも1.9ほどまでは落ちる。精度が低い原因としては

  • 埋め込みネットワークが3ブロック64チャンネルと小さい
  • バッチサイズ1なのでBatch Normalizationが機能していない
  • そもそも学習もやや足りていない

などが考えられる。どれも基本的にどうしようもない問題なので改善は難しいかもしれない。ネットワークは大きくしたくないし、バッチサイズ複数に対応するのもあまり現実的ではないように思える(MCTSのパスの長さが都度異なるのでどう実装すれば良いのかわからない)。今回の学習量でもかかった時間は2080tiのマシンで14時間ほどで、バッチサイズが1なのでどうしても学習速度は高くならない。

 そもそも探索回数10程度で将棋ではっきり強くなるかはやや疑問であり、どちらかというとオセロの終盤での評価がまともになる可能性を感じているため、オセロでどうにか棋譜を探して教師あり学習をやるというのが現実的な線だろうか。