バリューネットワークを実装する前に、検証に使用する学習データの仕様を決めておきたい。
バリューネットワークの入力は、局面と勝敗のセットになる。
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で表しているが、対応する座標が異なる。
通常の将棋盤の座標系
座標と数値
elmoの座標系
教師データの活用方法
elmoの教師データには、
- 局面情報
- 評価値(depth=6)
- 指し手
- 勝敗
の情報が含まれている。
そのため、SL policy network、RL policy network、Value networkの学習データとして使用可能である。
SL policy networkの学習には、局面情報と指し手を使用する。
RL policy networkの学習には、局面情報、評価値、指し手、勝敗を使用する。
評価値は報酬のベースライン(以前の日記で書いた)として使う。
Value networkの学習には、局面情報と勝敗を使用する。
elmoの教師データを使って、それぞれのモデルの精度を上げてからAlphaGoの手法で学習すると、さらに精度を上げることができそうだ。