前回の日記で定義した、AlphaGoのSL policy networkをCaffeで学習してみた。
以前にChainerを使って学習した結果と速度、精度を比較するため、条件を合わせている。
- インターネットから入手したプロの棋譜を使用
- 特徴はAlphaGoの論文のExtended Data Table 2の上の4つ
- フィルターは192枚
- ランダムに選んだ16局面を1ミニバッチとする
- ミニバッチを10万回繰り返す
- 100ミニバッチ置きに、学習用とは別の局面からランダムに選んだ10ミニバッチで正解率を評価
学習の結果は以下のグラフの通りとなった。
Chainerで学習した結果とほぼ同じグラフとなっている。
ChainerのlossがCaffeと比べて滑らかなのは、100ミニバッチの平均で計算していたためである。
実行時間は、Chainerでは5時間47分、Caffeでは5時間40分とほとんど差がなかった。
CaffeはC++で実装しているので、Chainerよりも速くなることを期待していたが、意外な結果となった。
実行時間のほとんどを占めるのがGPUの計算時間で、どちらもcuDNNを使用しているので、その部分では差が出ない。
次に時間がかかるのはメモリの転送となるが、こちらも差は出ない。
それ以外のCPU部分の実行時間で差がでるはずだが、全体に占める割合は少なく、ChainerのPython部分のオーバーヘッドはほとんど無視できる程度のようだ。
PythonとC++で差が出る部分は、基本データ型や関数が抽象化されている部分のオーバーヘッドだが、NumPyを使っているので基本データ型はほとんど使用していない。
関数呼び出しのオーバーヘッドも無視できる程度だったということだろう。
実行速度にほとんど差がなければ、扱いやすさではChainerの方が上なので、今後はChainerを使用していこうと思う。
次は特徴を論文と同じ48にして学習してみることにする。