TadaoYamaokaの開発日記

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

将棋AIの進捗 その43(探索パラメータ調整)

未訪問ノードのQの初期値の変更と、FPU reductionを導入してから、探索パラメータの再調整を行っていなかったので、Optunaで最適化を行った。

FPU reductionはKataGoを参考に、ルートノードは0としていたが、パラメータにして調整するようにした。
また、Leela Chess Zeroでは、ルートノードとゲーム木内のノードで、パラメータを分けているので、同様に別のパラメータとした。

Optunaの分散実行

Optunaは、分散実行に対応しているので、複数の対局を並列で実行してパラメータの探索を行った。

Optunaの分散実行は簡単で、はじめにデータベースを作成して、

optuna create-study --study-name "mcts_params_optimizer" --storage "sqlite:///optimizer.db"

create_studyをload_studyに変更して、複数プロセス実行するだけでよい。

例)

study = create_study(pruner=MedianPruner(n_warmup_steps=args.n_warmup_steps))

study = load_study(study_name='mcts_params_optimizer', storage=args.storage, pruner=MedianPruner(n_warmup_steps=args.n_warmup_steps))

探索パラメータ最適化に使用したコード:
https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/utils/mcts_params_optimizer.py

対局条件

探索パラメータの最適化のための対局は、自己対局ではなく対局相手にelmo(WCSC28)を使用した。

1手にかける時間、勝率を測定するための対局数、探索する値の範囲によって、実行時間が大きく変わるので、適切な設定が難しい。

はじめ1手3秒、300対局で行っていたが、時間がかかりすぎるので、最終的にdlshogiは1万プレイアウト、elmoは500万ノードの条件で、250対局実行するようにした。
投了の条件は、dlshogiは勝率10%未満、elmoは-10000点とした。

これで、1対局約7分、250対局に6時間50分になる。
Optunaは枝刈り機能があるので、20対局以降で統計的に見込みがない場合は枝刈りされるので、実際はこれより短くなる。

これをGPUの数だけ並列で実行して探索を行った。

パラメータ調整の結果

パラメータ調整は1月くらいから条件を変えながら実行していたが、Optunaで以前のパラメータより勝率の高いパラメータを見つけても、Aperyと1手3秒で対局すると勝率が下がるという結果で、そのたびに対局条件を変えていた。

最終的に上記の条件で、以前のパラメータより勝率が上がるパラメータを発見できた。
ただし、数日程度しか実行できていないため、さらに良いパラメータが見つかる可能性はある。

発見した探索パラメータ値は、以下の通り。

パラメータ 以前の値 最適化した値
C_init 1.49 1.07
C_base 39470 36465
C_fpu_reduction 0.20 0.26
C_init_root -(1.49) 1.62
C_base_root -(39470) 31962
C_fpu_reduction_root 0 0.26
Softmax_Temperature 1.66 1.67

以前の記事で、AlphaZeroのPUCT式について解説したが、C_fpu_reduction以外は、PUCT式Q(s,a)+U(s,a)のボーナス項U(s,a)に、上記のパラメータが使用される。

U(s,a)=C(s)P(s,a)\frac{\sqrt{N(s)}}{1+N(s,a)} \\
C(s)=\log{\frac{1+N(s) + C_{base}}{C_{base}}}+C_{init}


C_initは、高いほどボーナス項が優先される(つまり、訪問数が少ないノードを優先して探索する)。
C_baseは、小さいほどボーナス項が優先される。

最適化したパラメータは、C_initを除いて、ボーナス項を優先する方向に調整されている。
ルートノードの方が、よりボーナス項を優先している。

C_fpu_reductionは、未訪問のノードの価値を親ノードの価値からどれくらい減衰させるかのパラメータで、0の場合は減衰なし(親ノードの価値をそのまま使用)になる。
C_fpu_reductionは、以前より高い値になっており、早く減衰させる方向に調整されている。
減衰されると、方策の確率が低い手は、負け扱いになりほとんど探索しないことになる。

最適化後のAperyに対する勝率

最適後のパラメータで、Apery(WCSC28)と1手3秒で100対局した結果は以下の通り。

勝率 信頼区間(95%)
以前 65 28 7 69% 59.93%-78.27%
最適化後 72 25 3 74% 64.72%-81.89%

※CPU 4コア、GPU 2080Ti 1枚

有意差まで測定できていないが、勝率が上がっている。

まとめ

Optunaにより探索パラメータの最適化を行った。
ルートとゲーム木内のパラメータを分けて最適化を行った結果、以前より強くすることができた。


より長時間思考した場合にも勝率が上がるかは測定できていないが、世界コンピュータ将棋オンライン大会に向けては最適化したパラメータの方を採用することにする。
大会は3日後でそれほど大きく変えられないので、あとは時間制御の調整でもしようと思っている。


dlshogiは去年よりかなり強くすることができましたが、入賞レベルの強さ(floodgateの上位を見るとR4400以上?)にはまだ届いていなそうです。
dlshogiの入賞はないと思いますが、dlshogiを使っているQhapaqさんのチームがどこまで強くしているのか楽しみです。

2020/5/2 追記

さらに100局確認したところ、勝率が60%になったので、誤差の範囲か以前より悪い可能性があるので、対局数増やして有意差が確認できるまで元に戻すことにする。