読者です 読者をやめる 読者になる 読者になる

TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

CaffeでSL policy networkを学習

前回の日記で定義した、AlphaGoのSL policy networkをCaffeで学習してみた。

以前にChainerを使って学習した結果と速度、精度を比較するため、条件を合わせている。

  • インターネットから入手したプロの棋譜を使用
  • 特徴はAlphaGoの論文のExtended Data Table 2の上の4つ
  • フィルターは192枚
  • ランダムに選んだ16局面を1ミニバッチとする
  • ミニバッチを10万回繰り返す
  • 100ミニバッチ置きに、学習用とは別の局面からランダムに選んだ10ミニバッチで正解率を評価

学習の結果は以下のグラフの通りとなった。

f:id:TadaoYamaoka:20160701212745p:plain

Chainerで学習した結果とほぼ同じグラフとなっている。

f:id:TadaoYamaoka:20160604211240p:plain

ChainerのlossがCaffeと比べて滑らかなのは、100ミニバッチの平均で計算していたためである。

実行時間は、Chainerでは5時間47分、Caffeでは5時間40分とほとんど差がなかった。

f:id:TadaoYamaoka:20160701215346p:plain

CaffeはC++で実装しているので、Chainerよりも速くなることを期待していたが、意外な結果となった。

実行時間のほとんどを占めるのがGPUの計算時間で、どちらもcuDNNを使用しているので、その部分では差が出ない。
次に時間がかかるのはメモリの転送となるが、こちらも差は出ない。
それ以外のCPU部分の実行時間で差がでるはずだが、全体に占める割合は少なく、ChainerのPython部分のオーバーヘッドはほとんど無視できる程度のようだ。

PythonC++で差が出る部分は、基本データ型や関数が抽象化されている部分のオーバーヘッドだが、NumPyを使っているので基本データ型はほとんど使用していない。
関数呼び出しのオーバーヘッドも無視できる程度だったということだろう。

実行速度にほとんど差がなければ、扱いやすさではChainerの方が上なので、今後はChainerを使用していこうと思う。


次は特徴を論文と同じ48にして学習してみることにする。

github.com