TadaoYamaokaの開発日記

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

将棋AIの実験ノート:活性化関数をReLUに変更

以前に、活性化関数を変えると同じデータを学習した場合でも、方策の傾向が変わることを実験で確かめた。

現状のdlshogiのモデルでは、活性化関数にSwishを使用していたが、最善手を見つけるのに時間のかかると指摘を受けた以下の局面が、活性化関数をReLUにすることで速く見つけられるようになったため、活性化関数をReLUに変更して収束するまで学習を行い、以前のモデルと比較を行った。

sfen lns2gsnl/3k1pr2/p1ppp2Gp/5Ppp1/7r1/2P1+B4/PP1PP1P1P/1bS2S3/LN1GK1GNL b Pp 1

活性化関数をReLUにして学習

現状の20ブロックのモデルは、強化学習で生成したデータを継ぎ足しながら学習したが、ReLUのモデルではすべてのデータをはじめから使用して学習した。

14エポックで収束して、SWAを適用後のモデルの精度は以下のようになった。
現状のモデルは15エポック学習している。
テストデータには、floodgateのR3500以上の棋譜からサンプリングした856,923局面(重複なし)を使用した。

Swishのモデル(現状)
steps = 8367092, swa test loss = 1.3681549, 0.4552350, 0.6860540, 1.8233899, swa test accuracy = 0.5376619, 0.7680360, swa test entropy = 1.2785398, 0.4921690
ReLUのモデル
steps = 7988708, swa test loss = 1.3578349, 0.4554342, 0.6836113, 1.8132691, swa test accuracy = 0.5412843, 0.7685150, swa test entropy = 1.2647612, 0.4957720

ReLUのモデルの方が、方策が0.36%、価値が0.047%だけ正解率が高くなった。
価値は誤差の範囲だが、方策は少し良くなっている。

ReLUは、はじめからすべてのデータを使用しているため、活性化関数により精度が上がったとも言えないが、収束した際の精度は、ReLUでも高くなることが確かめられた。
Swishが効果があるのは、学習初期の効率だけと言えそうだ。

課題局面の指し手

ReLUのモデルで課題の局面を検討したところ、1万ノード読むだけで、最善手が8三馬となった。
Swishのモデルでは50万ノード以上探索が必要だったのに比べて、一瞬で読めるようになった。
この局面では、方策の質が良くなっていると言える。

強さの比較

特定局面だけが改善されただけではうれしくないため、互角局面集を使用して対局させて強さを比較した。
振り飛車を含む10手目互角局面集を使用した。

持ち時間400秒1手2秒加算で、基準に水匠5をリーグに混ぜて対局した。
dlshogiはスレッド数3、水匠5は32スレッドで持ち時間を4倍にしている。

   # PLAYER            :  RATING  ERROR  POINTS  PLAYED   (%)  CFS(%)    W    D    L  D(%)
   1 relu              :    41.1   32.4   102.5     175    59      91   87   31   57    18
   2 swish             :     2.7   33.5    86.5     172    50      94   75   23   74    13
   3 suisho5-32thx4    :   -43.8   33.3    68.0     167    41     ---   53   30   84    18

White advantage = 9.49 +/- 19.82
Draw rate (equal opponents) = 16.64 % +/- 2.33

ReLUの方がR+38.4となった。対局数が少ないため誤差が±32.4あるが、少なくとも弱くはなっていない。

NPSの比較

活性化関数をReLUにしたことで、演算が減るためNPSが高くなるはずである。
8GPU4スレッドでのNPSを比較した。
floodgateからサンプリングした100局面を1秒思考して測定した。
3回測定し、局面ごとの平均をとった。

Swish ReLU ReLU/Swish
mean 313397 323511 1.03227
std 19703.6 20566.3 1.04378
min 273692 273354 0.998765
25% 301892 310787 1.02946
50% 313026 322770 1.03113
75% 321653 335926 1.04437
max 431920 395399 0.915445

100局面の平均値で、NPSが3.2%高くなっている。
75パーセンタイルで、4.4%高い。

モデルの精度よりもNPSが向上した分で強くなっている可能性がある。

まとめ

dlshogiのモデルの活性化関数をSwishからReLUに変更したことで、最善手を見つけるのに時間がかかっていた局面が一瞬で読めるようになることを確認した。
収束するまで学習したモデル精度は、SwishでもReLUでもほぼ変わらないことがわかった。方策の精度はReLUの方が少し高い。
また、活性化関数の演算が減ったことで、NPSが平均3.2%高くなることが分かった。
強さの比較では、ReLUの方がR+38.4となった。

Swishにメリットがあるのは学習初期の効率だけと言えそうなので、今後は、活性化関数にはReLUを使用することにしたい。