TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

将棋AIの進捗 その14(自己対局による強化学習)

自己対局による強化学習の検証をはじめた。

強化学習の手法は、以前の日記で書いた通りで、Alpha Zeroの手法を参考にして、1手800シミュレーションで自己対局を行う。

自己対局→学習のサイクルを繰り返してモデルを成長させる。
1回のサイクルで、どれだけの自己対局を行うかは、AlphaZeroの論文には記載がないが、AlphaGo Zeroの論文には、

In each iteration, αθ* plays 25,000 games of self-play, using 1,600 simulations of MCTS to select each move.

と記載されている。
平均手数は200手とすると、1回のサイクルで500万局面を生成している。

ただし、モデルの学習は、

Each mini-batch of data is sampled uniformly at random from all positions from the most recent 500,000 games of self-play.

と記載されているため、学習には、過去のサイクルで生成した教師局面も使用している。
平均手数は200手とすると、1回の学習に1億局面を使用している。

モデルの学習に、過去のサイクルで生成した局面も使用しているので、同じ局面が20回使用されることになる。
データ不足を補うためのデータオーギュメンテーションを行っているとも解釈できる。

また、1回の学習局面が少ないと同一ゲームは似た局面が多くなるため、局面に偏りができる。
独立同分布にするには、理想的は1ゲームから1局面のみサンプリングすることだが、膨大な計算リソースが必要になるため現実的ではない。
そのため1回に学習する局面は多い方が良い。

AlphaZeroの論文では詳細な記載がないが、AlphaGo Zeroの手法を参考にして自己対局→学習のサイクルを回したい。

自己対局をマルチGPUで行うことで、秒間17.9局面が生成できるようになっている。
1回のサイクルで、500万局面生成するとすると、1サイクル3.2日になる。

テスト

バグがないか確認のために、少なめの200万局面を生成してテストを行ってみた。
hcpeフォーマットでMCTSの探索結果のルートノードの勝率を評価値にして記録している。
生成した教師局面の勝率と評価値の関係は以下のようになった。
f:id:TadaoYamaoka:20180313213148p:plain
なんとなく、正しく生成されていそうである。

学習開始するモデルは、elmoで生成した教師局面4.9億で事前訓練したモデルを使用している。
自己対局で200万局面を6サイクル回して学習したモデルで、初期モデルと対局させてみた。
f:id:TadaoYamaoka:20180313213532p:plain:w350
微妙に弱くなっているようだが、対局数50回では、有意水準0.05では勝率61%以下は互角と言える。
まだ傾向をみるには局面数が少なそうだ。

とりあえずバグはなさそうなので、AlphaGo Zeroと同様に500万局面でサイクルを回しはじめた。

スケールアウトについて

GPU2枚で自己対局を行っているが、時間がかかるので自己学習をスケールアウトさせることを考えている。
leela-zeroというAlphaGo Zeroのクローンでは、コミュニティに自己対局を協力してもらっているようだ。
これと同じようなことができないかと思っている。
leela-zeroは、OpenCLを使っているので実行環境のセットアップが必要ないため協力してもらいやすい作りになっている。
dlshogiはChainerを使っているので、環境構築がややこしい。
ここを改善したいと思っている。
具体的には、CUDA+cuDNNのみ動かせるようにして環境構築を不要にしたい。
当面は自分だけで検証をおこなう予定だが、ぼちぼち改良を進めたいと思っている。