TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

将棋でディープラーニングする その46(出力ラベルの表現方法)

開発してるdlshogiでは、出力ラベルを(駒の種類×移動方向+持ち駒の種類)×座標で表現し、出力層にAlphaGoを参考に1×1の畳み込み層を使用している。
AlphaGo Zeroでは、出力ラベルを石の色×座標+passで表しており、全結合層で出力を行っている。
1×1の畳み込み層から全結合層に変えた理由は、論文では特に説明されていない。
精度を上げるため、もしくは単にpassを表現したかったためと思われる。

dlshogiでは、出力層に1×1の畳み込み層を使っているため、駒の種類によっては、移動できない座標にもラベルを割り当てている。
出力を全結合層にすると、移動できない座標にラベルを割り当てる必要はなくなり、割り当てるラベルを減らすことができる。
全結合層に変更することで精度があがるか検証してみたい。

今回は、全結合層の検証の前に、出力ラベルの表現方法について、以前から気になる点があったので検証を行った。

出力ラベルの表現方法の検証

将棋では、駒の移動があるため、座標だけでは、移動元が一意に決められない。
移動元も座標で表すと、移動先との組み合わせが多くなる。
そこで、dlshogiでは、以前に書いた通り、移動元は方向だけで表現している。
また、移動する駒の種類にもラベルを割り当てている。
移動方向は、駒の種類ごとに移動できる方向だけにラベルを割り当て、駒の成りも移動方向の一種として表現する。
出力ラベルは(駒の種類×移動方向+持ち駒の種類)×座標で表現される。
出力ラベルの合計は8181になる。(詳細は以前の日記を参照)

比較対象

元々、移動元を方向で表すアイディアは、not522/CNNShogiからヒントを得たものであった。
not522/CNNShogiでは、移動する駒の種類にはラベルを割り当てていないため、出力ラベルは、(移動方向(桂馬の動き含む)×成りの有無+持ち駒の種類)×座標となり、合計で(10×2+7)×9×9 = 2187となる。

dlshogiで駒の種類にもラベルを割り当てた理由は、異なる駒の移動を同じラベルとして学習すると、モデルに与える情報量が減るため、精度も落ちると考えたためである。

どちらの表現がよいか以前から気になっていたので比較実験してみた。

比較結果

測定条件
  • 5ブロックのWide ResNet
  • 訓練データ:3000万局面
  • テストデータ:100万局面
  • 学習率:0.01
  • 最適化:MomentumSGD
  • ミニバッチサイズ:64
  • 訓練局面elmoの自己対局で生成
  • value networkとマルチタスク学習

policy networkの学習結果

train loss test accuracy
駒の種類あり 1.0487 0.3824
移動方向のみ 1.0470 0.3889

考察

予測に反して、精度はほぼ同じとなった。
対局時に使用したときのレーティングに影響があるかも調べたいが、モデル学習に時間がかかりすぎるので検証はここまでにする。

出力層を全結合層にした場合でも、駒の種類ありと移動方向のみを比較してみたい。

2017/11/18 追記

訓練データを1億局面にして比較してみた。

train loss test accuracy
駒の種類あり 0.9990 0.4081
移動方向のみ 0.9957 0.4087

上記と同様に精度はほとんど変わらなようだ。

2017/11/19 追記

出力層の前の活性化関数が漏れているバグがあったため、修正して再測定した。

train loss test accuracy
駒の種類あり 0.9676 0.4150
移動方向のみ 0.9637 0.4174

※訓練データ:7000万局面
移動方向のみの方が良いという結果になった。