TadaoYamaokaの日記

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

将棋でディープラーニングする その26(学習の高速化)

前回の日記で書いたC++でミニバッチデータを作成する処理を組み込んで、バリューネットワークの学習の速度が改善されたか確認を行った。

測定条件

  • 学習データはelmo_for_learnで生成した100万局面
  • ミニバッチサイズ32
  • 1エポック

測定結果

Python(変更前) 0:30:08
C++(変更後) 0:11:05

学習時間が37%に短縮できた。

elmoと同じ50億局面を学習するには、38.5日かかる見積もりとなる。(前回は105日の見積もり)

SL policy networkで測定

今までSL policy networkは、CSA形式の棋譜データを使用していたが、elmoで生成した教師データで学習するように変更した。
こちらもC++化による効果を確認した。

50000イテレーションの時間を比較した。(使用する学習データは異なる)

Python(変更前) 0:24:50
C++(変更後) 0:16:32

学習時間が67%に短縮された。
SL policy networkでは棋譜データからミニバッチデータを作成していたのでバリューネットワークのようにハフマン符号のデコードがなかったため、改善効果は比較的少なめである。
それでも十分速くなっている。

精度の評価

精度については以下のようになった。

train loss test accuracy
Python(変更前) 2.49 0.36
C++(変更後) 2.76 0.31

elmoの学習データを使用する精度が落ちているように見える。
これは、棋譜には序盤に重複データが多く含まれているが、elmoの学習データは異なる局面から生成しているので重複が少ないためと思われる。

1000万局面を学習

elmo_for_learnで生成した1000万局面を学習させてみた。
f:id:TadaoYamaoka:20170528233243p:plain

train loss 2.27
test accuracy 0.36
時間 1:41:08

train lossは下がり続けており、学習局面を増やせばまだ精度が上げられそうだ。

elmoと同じ50億局面を学習するには、35.1日かかる見積もりとなる。


今まで詰みの判定に外部のUSIエンジンを使用していたが、C++のライブラリを使用するようにしたので、詰みの判定処理もC++のライブラリで行うようにしたい。
今回は学習用途だったため探索の処理をコメントアウトしたが、詰みの探索ができるようにして、USIエンジンに頼らず対局できるようにする予定。

github.com