複数評価関数での合議の為の学習
まず、従来の*1合議では、単一の評価関数&パラメータから、評価値に適当な乱数を足して複数の合議クライアントを生成します。で、複数クライアントが個別に探索し、その結果から得票数が最高の手だったり評価値が最高の手だったりを選択します。
私が今からやろうとしているのは多数決合議ですが、複数の評価関数&パラメータを使用するのが異なります。
複数の評価関数は、評価項目の有効・無効を切り替えて生成します。大体こんな感じ。(○が付いている評価項目が有効。)
No. | 駒割 | 絶対位置評価 | 二駒相対 | 二駒絶対 | 駒の自由度 | 王将の移動可能範囲 | 王将周辺の利き |
---|---|---|---|---|---|---|---|
1 | ○ | ○ | ○ | ||||
2 | ○ | ○ | ○ | ○ | |||
3 | ○ | ○ | ○ | ○ | |||
4 | ○ | ○ | ○ | ○ | ○ | ||
略 | |||||||
16 | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
二駒絶対〜王将周辺の利きまでの4項目の有効・無効の組み合わせ、トータル16種類から16個の評価関数(16個の合議クライアント)を生成します。
選手権等での対局時は、各クライアントがシングルスレッドの探索ルーチンを使用し、16クライアントが16並列で探索します。
次にパラメータの学習方法ですが、16個の合議クライアントをランダムな組み合わせで対局させ(1vs5, 13vs8, 4vs2…)、その結果から強化学習(SR-PGLeaf)で評価関数パラメータの学習をします。ここは、第25回選手権バージョンとほとんど変わりません。
んで、こうすると何が嬉しいかというと
- 合議による棋力の底上げが可能
- 多様なプレイヤー同士の対局から学習する事により、様々な棋譜を生成する事が可能
の2点です。
特に2.が重要で、従来の*2学習方式では対振り飛車が苦手だったり、相居飛車前提で駒を移動させたりという問題が解決出来るのではないかと考えています。
さて、ここからが本題の、開発日記の内容。
上記の学習方式で、5五将棋を450万局ほど学習させてみました。探索は全幅1手+静止探索6手。クライアントごとの勝率と、予測報酬のRMSEは下のグラフのとおり。
一部のクライアント*3は勝率が低く、RMSEが大きめですが、まぁどちらも許容範囲内かと。
合議をアンサンブル学習の一種と考えると、「強いクライアントを作る」より「多様なクライアントを作る」方が重要ですので、多少勝率の低いクライアントが混じっていてもOKかな、と。