TadaoYamaokaの日記

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

将棋でディープラーニングする その21(elmoの学習データ)

バリューネットワークを実装する前に、検証に使用する学習データの仕様を決めておきたい。

バリューネットワークの入力は、局面と勝敗のセットになる。

AlphaGoの論文ではRL policy networkで終局まで打った際の勝敗データを使用しているが、私の検証しているRL policy networkはまだ精度が悪いため、まともなデータが生成できない。
今年のコンピュータ将棋選手権で優勝したelmoは、教師データとして勝敗データを使用している。
そのため、バリューネットワークの入力データとして流用が可能である。
そこで、elmoを使用して教師データを生成することにする。

elmoで教師データ生成

elmoで教師データを生成するには、elmo_for_learnを使用する。
生成方法は、説明があるのでその通りに行えばできる。
Windowsでビルドするには、MSYS2を使用する。

教師データのフォーマット

elmoの教師データは、局面の情報がハフマン符号で圧縮されている。
ハフマン符号はelmoのソースコードのposition.cpp:33に記述されている。
デコードするにはハフマン符号の伸縮を行えばよい。

Pythonで読めるようにする

Pythonで使用したいため、elmoのC++のコードを参考に、ほぼそのままPythonに移植した。
github.com

elmoとpython-shogiでは将棋盤の座標系が異なるため注意が必要である。
どちらも座標を数値0~80で表しているが、対応する座標が異なる。

通常の将棋盤の座標系

f:id:TadaoYamaoka:20170523210704p:plain

座標と数値

f:id:TadaoYamaoka:20170523212436p:plain

elmoの座標系

f:id:TadaoYamaoka:20170523211203p:plain

python-shogiの座標系

f:id:TadaoYamaoka:20170523212953p:plain

ちょうどpython-shogiの座標系を左に90°回転するとelmoの座標系になる。

上記のpythonのコードでは座標系の変換も行っている。

教師データの活用方法

elmoの教師データには、

  • 局面情報
  • 評価値(depth=6)
  • 指し手
  • 勝敗

の情報が含まれている。

そのため、SL policy network、RL policy network、Value networkの学習データとして使用可能である。

SL policy networkの学習には、局面情報と指し手を使用する。
RL policy networkの学習には、局面情報、評価値、指し手、勝敗を使用する。
評価値は報酬のベースライン(以前の日記で書いたv(s_t^i))として使う。
Value networkの学習には、局面情報と勝敗を使用する。

elmoの教師データを使って、それぞれのモデルの精度を上げてからAlphaGoの手法で学習すると、さらに精度を上げることができそうだ。