作成している将棋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)では、精度に違いは見られなかった。