TadaoYamaokaの開発日記

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

【将棋AI】N駒関係をMulti-Head Self-Attentionで学習する 続き2

前回に引き続き、将棋AIへのMulti-Head Self-Attentionの適用を試してみた。

前回は、dlshogiと同じ入力特徴量を使用したが、Multi-Head Self-Attentionに合わせて以下の変更を行った。

  • 各位置の特徴ベクトルに位置の情報を入力する
  • 持ち駒の枚数の特徴ベクトルをすべて1ではなく、持ち駒の枚数に対応するワンホットベクトルとする
各位置の特徴ベクトルに位置の情報を入力する

段と筋をそれぞれ、9次元のワンホットベクトルとして、各位置の特徴ベクトルに連結する。

これは、自然言語処理のTransformerで、単語の位置をPositional Encodingに相当する。
Transformerの論文では、sin関数とcos関数を使用して埋め込みベクトルと同じ次元にエンコードしたベクトルを加算している。

将棋の場合は、2次元座標であることと、加算よりも連結の方が情報の欠落がないので、上記の通り連結することにした。

持ち駒の表現

持ち駒は、持ち駒の枚数(歩は最大8枚)に応じた要素のみを1としたワンホットベクトルで表す。
先後を別にして、各28次元で、合計56次元となる。
その特徴ベクトルを、持ち駒の枚数に対応した位置の特徴ベクトルに設定する。

特徴ベクトルは、盤上の位置でも持ち駒の位置でも同じ次元とするが、それぞれ値を設定する場所を分ける。
特徴ベクトルの次元は、137次元(=盤上62次元 + 座標 18次元 + 持ち駒 56次元)となる。

測定結果

入力特徴量を上記の通り変更して、前回と同じ条件で測定した。

モデル 訓練平均損失(方策, 価値, 評価値, 合計) 評価損失(方策, 価値, 評価値, 合計) 正解率((方策, 価値)
Multi-Head Self-Attention(変更後) 1.933, 0.440, 0.465, 2.382 1.849, 0.921, 1.011, 2.800 0.214, 0.540
Multi-Head Self-Attention(前回) 1.961, 0.438, 0.464, 2.408 1.687, 0.653, 0.714, 2.361 0.244, 0.622

精度が上がるという予想に反して、前回よりも精度が下がってしまった。
特徴ベクトルの次元が前回の64次元から136次元に増えるため、モデルのパラメータが大幅に増えていることが影響していそうである。

次元圧縮

そこで、特徴ベクトルの次元を前回と同じ64次元に、次元圧縮してみた。

具体的には、136次元の特徴ベクトルを全結合層を通して、64次元にする。
全結合層のバイアスと活性化関数はなしで、モデルの重みは、入力する単語の位置によらず共有する。

f:id:TadaoYamaoka:20200719142916p:plain

自然言語処理の単語の埋め込みと同じような処理を行っている。

変換した埋め込みベクトルをそのままTransformerに入力すると、学習が不安定になったため、Batch Normalizationを追加した。

次元圧縮して入力次元を前回と揃えた結果は、以下の通りになった。

モデル 訓練平均損失(方策, 価値, 評価値, 合計) 評価損失(方策, 価値, 評価値, 合計) 正解率((方策, 価値)
Multi-Head Self-Attention(次元圧縮後) 1.823, 0.425, 0.451, 2.257 1.613, 0.627, 0.692, 2.262 0.259, 0.634
Multi-Head Self-Attention(前回) 1.961, 0.438, 0.464, 2.408 1.687, 0.653, 0.714, 2.361 0.244, 0.622

次元圧縮を行うと、前回よりも精度が向上している。
疎ベクトルの入力を埋め込み表現にすることは効果があるようだ。


ここで、前回も次元64のままでも埋め込み表現にすれば精度が上がって、今回試した入力の特徴ベクトルの変更による改善ではないのではないかという疑問が生じる。
そこで、前回の入力特徴ベクトルを埋め込み表現にした場合も測定してみた。

モデル 訓練平均損失(方策, 価値, 評価値, 合計) 評価損失(方策, 価値, 評価値, 合計) 正解率((方策, 価値)
Multi-Head Self-Attention(前回+埋め込み表現) 1.860, 0.428, 0.454, 2.297 1.649, 0.654, 0.725, 2.328 0.251, 0.612

方策の精度が少し上がっているが、逆に価値の精度は下がっている、評価損失の合計はほとんど差がない。

したがって、精度向上は、埋め込み表現による向上よりも、入力特徴量の変更によるものと言える。

まとめ

入力特徴量に、位置を表す情報を加えて、持ち駒の枚数の表現を駒の種類と枚数を表すワンホットベクトルにすることで、精度が向上した。
ただし、入力特徴を次元の高い疎ベクトルのまま入力すると精度が下がる。
対策として、疎ベクトルを低次元に投影して、埋め込み表現にすると良い。


今回の結果でも、前回測定したdlshogiの10ブロックのResnetと比較すると精度が低い。
Transformerを多層にする、出力の全結合層の層数、ユニット数を増やすといったことも試してみたが、Resnetを超えることはできなかった。
将棋のような2次元座標で表せるゲームの場合、畳み込み層は強力なようだ。

次回は、Transformerの結果を、畳み込み層の入力とするということを試してみたい。