TadaoYamaokaの開発日記

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

将棋でディープラーニングする その53(価値ネットワークの精度向上)

作成している将棋AIは、現在自己対局による強化学習を続けています。
floodgateの棋譜との一致率は徐々に上がっており、少しずつですが強くなっています。
48サイクル回したところで、GeForce 1080を1枚搭載したノートPCで、GPSFishに1手3秒で勝ち越すようになりました。

対局数100 先手勝ち57(56%) 後手勝ち41(41%) 引き分け2
selfplay048temp100
勝ち58(57%) 先手勝ち33(33%) 後手勝ち25(25%)
GPSfish 0.2.1+r2837 gcc 4.8.1 osl wordsize 32 gcc 4.8.1 64bit
勝ち40(40%) 先手勝ち24(24%) 後手勝ち16(16%)

有意水準以下なのでまだ有意に強くなったとはいえませんが。

自己対局はGPUを2080 Tiに交換したのとFP16化したことで、1サイクル3.5日かかっていたのが2.5日になりました。
それでも時間がかかるので成長速度はゆっくりです。
AlphaZeroのようにわずか2時間でとはいきません。
AlphaZeroが2時間に対して、こちらは1年近くかけています。
しかも、ネットワークの規模はResNet10ブロックなので1/4です。(AlphaZeroは40ブロック)

ということで、もう少し効率よく精度をあげる方法を模索したいと思っています。
囲碁の方では、価値ネットワークにプーリングを使用することが試されているようなので試してみました。

dlshogiでは、方策ネットワークを価値ネットワークを同じネットワークにして、マルチタスク学習を行っているため、価値ネットワークのみに単純にプーリングを適用できない構成になっています。
そこで、出力側の方策ネットワークを価値ネットワークで分岐させている部分にプーリングを適用して実験してみました。

現在のネットワーク構成

方策ネットワークと価値ネットワークで共通部分
  • 10ブロックのResNet(畳み込み2層)
  • フィルターサイズ3×3
  • フィルター数192
  • BatchNormalization
  • ドロップアウト
  • プーリングなし
方策ネットワークの出力部分
  • フィルター1×1の畳み込み
  • フィルター数2187:駒の種類と移動方向の組み合わせ
  • 位置ごとに異なるバイアス
価値ネットワークの出力部分

1層目

  • フィルター1×1の畳み込み
  • フィルター数2187:方策ネットワークと同じ

2層目

  • 全結合層:ノード数256

3層目

  • 全結合層:ノード数1

テストパターン

プーリングの他に、ストライドありでオーバーラップさせた畳み込みや、パディングなしで画像サイズを削減した畳み込みも試した。

test1 現在の構成
test2 1層目をストライド3、フィルターサイズ3×3、フィルター枚数192×3に変更
test3 最後のブロックを方策と価値で分けて、価値の方をストライド3、フィルター5×5、フィルター枚数192×3の畳み込みの後に、フィルター3×3、フィルター枚数192*3の畳み込みに変更。ResNetブロックの後、フィルター枚数192*3の畳み込みとフィルター枚数3×3、パディングなしの畳み込み。その後全結合層。
test4 1層目をストライド3、フィルターサイズ5×5、フィルター枚数192×3に変更し、その後にサイズ3×3の平均プーリング
test5 1層目をストライド3、フィルターサイズ5×5、フィルター枚数192×3に変更
test6 1層目はそのままで、その後に、サイズ3×3の平均プーリング
test7 1層目をストライド3、フィルターサイズ5×5、フィルター枚数192×3×3に変更
test8 1層目はそのままのものと、ストライド3、フィルターサイズ5×5、フィルター枚数192×3の畳み込みの出力を連結(concat)
test9 1層目をストライド3、フィルターサイズ5×5、フィルター枚数はそのままに変更
test10 共通部分のフィルター枚数を256に変更

測定結果

ランダムに初期化されたモデルから、自己対局で生成した1000万局面を毎回シャフルして5回測定した。

パターン 平均 中央値
方策の一致率 価値の一致率 方策の一致率 価値の一致率
test1 0.340667506 0.646848387 0.3411726 0.647756696
test2 0.340076311 0.648765304 0.3398553 0.6486792
test3 0.340311587 0.648855639 0.34040904 0.64919275
test4 0.340737118 0.649633029 0.34051056 0.64909655
test5 0.341156782 0.648948858 0.340723008 0.648917139
test6 0.340287269 0.64832114 0.340290305 0.6485846
test7 0.340536236 0.648031611 0.340501636 0.6472785
test8 0.341074753 0.649948122 0.340924477 0.649788767
test9 0.340526263 0.64853402 0.340724289 0.648599923
test10 0.345498568 0.650716498 0.34547478 0.6507526

それぞれの列で上位3つに色を付けた。

考察

モデル構成そのままでフィルター枚数を増やしたtest10が最も精度が高くなっているが、学習時間が1.5倍近く増えているため、参考値扱いである。

test10を除くと、test8が最も価値の精度が高かった。
test8は、チャネル方向に重み共有した畳み込み(1×1フィルター)と、空間方法に重み共有した畳み込み(オーバーラップさせたストライド)の両方を行って、それぞれの連結している。
現在のモデルは、1×1の畳み込みで、チャネル方向の重み共有で、空間の情報を残している。

test2~test9は何らかの空間方向の重み共有を行っており、test1よりも価値の平均の精度が高くなっている。

このことから、実験回数がそれぞれ5回のみで、収束するまで学習していないので、はっきりは言えないが、価値ネットワークには空間方法の重み共有が有効である可能性がある。
また、test8が最も精度が高かったことから、チャネル方向の重み共有も有効で、併用すると効果が上がる可能性がある。

オーバーラップしながらストライドした畳み込み(test9)と、平均プーリング(test6)では、精度に違いは見られなかった。

まとめ

価値ネットワークは、チャネル方向(1×1の畳み込み)にも空間方向(ストライドあり畳み込みもしくはプーリング)にも重み共有を行った方が精度が上がる可能性がある。


新しいモデルに切り替えて強化学習を試したいが、今からモデルを変更して学習をやり直すのも大変なので、しばらくは同じモデルで強化学習は進めるつもりです。