dlshogiは、開始局面から170点という比較的大きな評価値を出力する。
これは適切でないため、今回調整を行うことにした。
勝率から評価値への変換
dlshogiの内部では、局面の価値は、評価値を使わず勝率で扱っているが、GUIソフトには評価値として返す必要があるため、勝率から評価値にシグモイドの逆関数で変換を行っている。
ここで、は勝率である。
係数aは、Aperyややねうら王では、Ponanza定数と呼ばれるa=600が使われている。
ただし、Aperyややねうら王でこの定数を使うのは、学習時だけである。
探索時は評価値そのものを使用している。
dlshogiの係数a
dlshogiでは、以下の2か所で係数aを使用している。
かなり初期の頃に、前者の方で、elmo_for_learnの自己対局データを教師あり学習するために、係数aを調整した。
そして、その際に調整した係数aを後者の方でも使用している。
その値は、a=756.0864962951762となっており、この値が大きいことが大きめの評価値の原因になっている。
係数aの特定
評価値と勝率の関係は、使用するエンジン、読みの深さ、評価関数の精度によって、変わるものである。
そのため、ある特定の条件でしか調整できない。
参考として、dlshogiの自己対局のデータで、係数aを近似すると、以下のようになる。
モデル | プレイアウト数 | 係数a |
---|---|---|
dlshogi with GCT | 3000 | 456 |
dlshogi-dr2_exhi | 10000 | 473 |
dlshogi-dr2_exhi | 15000 | 458 |
モデルにより基準が異なり、同じモデルでも読みが深くなると小さくなる。
水匠4改の固定ノード数での自己対局では、以下のようになる。
ノード数 | 係数a |
---|---|
5M | 180 |
8M | 171 |
学習時にはa=600が使われているが、それよりもかなり小さい値になる。
係数aの再調整
初期にelmo_for_learnで調整した係数aが、現状のモデルと乖離しているため、再調整が必要と考えている。
何を基準に調整するかが問題になるが、例えば自己対局時のデータを使うと、読みが浅いため検討で使うと大きめの値がでてしまう。
かといって、長時間の対局で十分なデータを集めるのは難しい。
しかも、モデルごとに調整が必要なため、毎回実施が必要になる。
ユースケースを考えると、大きめの値で困るのは、検討時に水匠4などと比較した時なので、開始局面付近で同じくらいの値になっていればよさそうである。
そこで、開始局面で水匠4で1億ノード検討した際の評価値(71)とほぼ同じになるように調整することにする。
dlshogiと水匠4が互角の条件では、ノード数を1/338すればよいので、30万プレイアウトで、評価値が同じになるように調整する。
ということで、調整した結果、a=285という値になった。
水匠4と1手3秒で対局すると、序盤の評価値が小さめの値になったことが確認できる。評価値のグラフ推移も近くなった。
モデルごとに調整が必要なため、USIオプション(Eval_Coef)にして、デフォルト値は今まで通りa=756で、モデルごとの.iniファイルで上書きできるようにした。
まとめ
dlshogiの序版の評価値は大げさすぎるという意見があったので、評価値のスケールを調整した。
どういう基準で調整するかは、決まった基準があるわけでないので、今回は水匠4と互角の探索ノード数で、開始局面の評価値が一致するという条件で調整した。
↓Windows用ビルド済みファイルはこちら
https://gist.github.com/TadaoYamaoka/cc0fcbb0a9e7b62062215f6ee02ae9ad/raw/eab5bad93047f2d8b308bce40c71ec3abaecd467/dlshogi_eval_coef.zip
.exeファイルを差し替えてください。
Eval_Coefは、デフォルトの756になっているので、285に変更してください。
もしくは、model-dr2_exhi.onnx.iniに、「Eval_Coef=285」の行を追記してください。
2023/8/26追記
評価値と勝率の関係をグラフにしたものを以下に示す。