TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

将棋AI実験ノート:自己対局の評価値の補正

Discordで、評価値と勝率を変換する際の以下のシグモイド関数の係数aは、dlshogiはelmo_for_learnの自己対局から求めた756.0864962951762という値を使用しているが、floodgateの棋譜などを学習する場合はもっと低い値になるので補正すべきというやり取りがあった。

\displaystyle
\frac{1}{1 + \exp(-score / a)}

floodgateの棋譜から調査

R3800以上の棋譜

実際にどれくらいの値なのか2019年~2020年のR3800以上のfloodgateの棋譜から調べてみたところ、
a = 236.94908509
という結果であった。

R2000以上の棋譜

R2000以上とすると、
a = 398.66185164
という結果であった。

調査に使用したスクリプトcsa_score_value_fit.py · GitHub

Discordでのやり取りの通り、係数aは小さい値になった。
また、レーティングが高いほど、係数aが小さくなる傾向がありそうである。

自己対局の評価値と勝率の関係

dlshogiの自己対局で生成した教師データに対しても、評価値と勝率の係数を調べてみた。
自己対局では評価値はルートノードの訪問回数が最も多い子ノードの平均価値(勝率)を、評価値に変換して記録している。
その際の係数には、a=756.0864962951762を使用しているため、その値に近い値になると考えていた。

しかし、実際に調べてみると、
a = 488.09106542
という結果であった。

調査に使用したスクリプトhcpe_score_value_fit.py · GitHub

これは、自己対局時の探索で求めた勝率と、実際の対局結果を統計処理した勝率にずれがあることを示している。
係数が小さい方にずれているということは、実際の勝率が探索で求めた勝率よりも高いことを示している。
なぜ係数が小さい方にずれるのかは分からないが、探索で求めた評価値をそのまま学習に使うよりも、実際の勝敗から求めた係数で補正した方がよい可能性がある。

評価値を補正して学習

評価値を勝敗から求めた係数で補正したデータを使用し、dlshogiのモデルを学習して、補正なしの場合とありの場合で、精度を比較した。
テストデータには、2017年~2018年6月のfloodgateのR3500以上の棋譜からサンプリングした856,923局面(重複なし)を使用した。
初期値とデータのシャッフルにより結果が変わるため4回測定して平均を求めている。

精度は、方策、価値(勝率)、Q値(評価値)のテスト損失で比較する。
(正解率は、テストデータのクラスの分布が不均衡だと比較しにくいため、精度の比較には損失の方がよい)

変換に使用したスクリプトfix_hcpe_eval.py · GitHub

floodgateの棋譜

2019年~2020年のR3800以上のfloodgateの棋譜(6235207局面)の評価値を補正して、初期値から学習した結果は以下の通り。

方策 価値(勝率) Q値(評価値)
補正なし 1.70100901 0.656220725 0.688526105
補正あり 1.713669813 0.65317638 0.691249333

補正ありの場合が、価値の損失が小さくなっている。
(その変わり、方策の損失が大きくなっているが、これは、初期値から学習した段階では、方策と価値がトレードオフの関係で学習されるためと考えられる。)

補正を行うことで、価値の精度が上がることを示している。

Q値(評価値)が、補正を行った方が高くなっているのは、テストデータの評価値は補正を行っていないためと考えられる。
テストデータに評価値を補正したデータを使用すると、

方策 価値(勝率) Q値(評価値)
補正なし 1.648518813 0.65597565 0.659327383
補正あり 1.659034425 0.65457407 0.65837852

補正ありの方が、Q値(評価値)の損失も小さくなった。

自己対局の棋譜

自己対局で生成した教師データ(4千万局面)の評価値を補正して、学習済みモデルに追加学習を行った結果は以下の通り。

方策 価値(勝率) Q値(評価値)
補正なし 0.816202783 0.49896154 0.644653933
補正あり 0.812867498 0.493460893 0.658458863

補正ありの場合が、価値の損失が小さくなっている。
また、方策の損失も小さくなっている。
Q値(評価値)の損失は大きくなっているが、テストデータの評価値の補正を行っていないためである。

テストデータに評価値を補正したデータを使用すると以下の通りになった。

方策 価値(勝率) Q値(評価値)
補正なし 0.80054098 0.498679225 0.512195093
補正あり 0.79759852 0.493009955 0.508437538

Q値(評価値)の損失についても小さくなっている。

まとめ

floodgateの評価値と勝率の変換に使用するシグモイド関数の係数は、コンピュータ将棋界隈で知られている600よりも小さい値であることがわかった。
また、自己対局時の探索で求めたPVの平均価値(勝率)と、実際の対局結果の統計から求めた勝率にはずれがあることが確認できた。

どちらのデータも学習に使用する場合、評価値を実際の対局結果から求めた係数で補正することで、価値の精度が向上することが確かめられた。

dlshogiの学習スクリプトにも評価値を自動で補正するオプションを処理を追加する予定である。