持ち駒の正規化

記事の要約

 持ち駒は正規化した方が良さそう。

前書き

 WCSC29会場にて山岡さんから『ディープラーニングを使った将棋AIの作り方3』を購入させていただいた。AlphaZero的な強化学習ということで大枠は変わらないが、読んでいるといくらかMiacisの実装と異なる点があることに気づいた。計算資源との兼ね合いもあるが、簡単に検証できるものはできるだけしていきたい。

 今回は持ち駒の正規化について検証を行った。持ち駒の正規化とは、ニューラルネットワークへに対して持ち駒の枚数を入力するとき、各持ち駒の数を直接入力するのではなく最大枚数で割ることによって0から1の範囲に正規化することを指す。駒種による最大枚数の違いや、盤上の駒の有無を0,1で表現していることを考えると正規化する方が自然であると思われる。

 以前正規化を試したときは性能が悪化した記憶があり、ソースコード中にもそのような記述があったが、データが残っておらず信用できないと判断したためもう一度検証する。

実験

 上記の本では歩の枚数だけ例外的に最大枚数ではなく8で割った値を入力とすると記述されていたが、個人的な好みから歩も最大枚数である18で割った数を入力とした。

 floodgate2016年の棋譜を用いて教師あり学習を行った。主要な設定は

  • バッチサイズは4096、学習率は0.1
  • 学習データの1/10を検証データとし、1エポックごとに検証データに対して損失を計算。前回に比べて下がっていなかった場合には学習率を1/2に減衰
  • 6回連続で損失が下がらなかった時点で学習を終了

である。両手法ともランダムに初期化した同一のパラメータを初期値とし、乱数シードも固定し学習データのシャッフル方法も同一であるようにした。

 検証データに対する損失推移は以下のようになった。

f:id:tokumini:20190507180057p:plainf:id:tokumini:20190507180104p:plain
左:Policy損失 右:Value損失

 一番損失が低いエポックでの結果は次のようになった。

手法 Policy損失 Value損失
正規化あり 1.895 0.3868
正規化なし 1.909 0.3963

 1回の実験ではっきりしたことは言えないが、やや正規化ありの方が良い結果である。

 気になる点として、学習率を0.2にすると正規化なしでは学習できるのに対して正規化ありでは学習できなかった(value損失が常にほぼ2になってしまった。これはvalueが常に1または-1を出力するようになったことを示している。policyの学習は進んでいた)。入力を正規化するとそれに合わせて適切なパラメータも小さくなるはずであり、相対的に学習率が大きくなっているのかもしれない。ただの偶然であった可能性もある。