前回の日記でChainerで作成したAlphaGoのSL policy networkをプロの棋譜を使って学習させてみた。
棋譜は、以前と同様、インターネットの棋譜サイトから入手したプロの棋譜を使用した。
まずは、学習がうまくいくか様子をみるため、特徴はAlphaGoの論文のExtended Data Table 2の上の4つとした。
論文の対戦バージョンでの特徴数は48となっているが、Extended Data Table3で特徴数が4つでもTest Accuaryは47.6%になっている。
特徴数4のうち、1つはすべて1の特徴で、実質棋譜から抽出する特徴は以下の3つになる。
- 黒の石(19×19)
- 白の石(19×19)
- 空白(19×19)
囲碁の知識を一切用いず、盤面の情報のみで学習することになる。
フィルター枚数kは、論文の対戦バージョンと同じ192とした。
学習アルゴリズムはSGDで、dropoutは行わない。
前処理としてC++で作成した囲碁プログラムを利用して棋譜の局面から特徴を抽出してファイルに書き出し、Pythonプログラムから読み込むようにした。
実行時間を測るためにテスト的に、実行したところスループットは、約5.0 minibatch/secだった。
minibatchは論文と同じランダムに選んだ16局面としている。
GPUは、FF14を遊ぶために買ったGeforce GTX 760(2GB)を使用した。
なお、CPUで実行すると実行速度は1/10となり非常に遅かった。
5時間ほどで結果がみられるように、ミニバッチ実行回数を10万として実行した結果が以下のグラフである。
※100ミニバッチおきにlossとaccuracyを計測
accuracyは100ミニバッチおきにトレーニング用データとは別に用意した棋譜からランダムに選んだ局面を10ミニバッチ分実行してテストしている。
そのため折れ線がぶれているが、右肩上がりとなっており、学習が成功していることがわかる。
10万バッチ(160万局面)で、一致率は30%を超えている。
グラフのlossは、まだ下がり続けているのでまだ学習の余地が残っていると思われる。
実行時間は、約5.8時間かかった。
3000万局面を学習しようとすると、108時間 = 4.5日が必要になる。
特徴数が増えると実行時間も増えるので、ちょっと厳しい。
次は、C++でCaffeを使ったら実行速度を改善できないか試してみるつもり。