TadaoYamaokaの日記

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

dlshogiの評価値のスケール調整

dlshogiは、開始局面から170点という比較的大きな評価値を出力する。
これは適切でないため、今回調整を行うことにした。

勝率から評価値への変換

dlshogiの内部では、局面の価値は、評価値を使わず勝率で扱っているが、GUIソフトには評価値として返す必要があるため、勝率から評価値にシグモイドの逆関数で変換を行っている。

\displaystyle
 -a \log(\frac{1}{x} - 1)

ここで、xは勝率である。
係数aは、Aperyややねうら王では、Ponanza定数と呼ばれるa=600が使われている。
ただし、Aperyややねうら王でこの定数を使うのは、学習時だけである。
探索時は評価値そのものを使用している。

dlshogiの係数a

dlshogiでは、以下の2か所で係数aを使用している。

  • 教師ありで棋譜を学習する際に、棋譜に記録された評価値から、勝率に変換する場合
  • 探索時に、GUIソフトに評価値を表示するため、勝率から評価値に変換する場合

かなり初期の頃に、前者の方で、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秒で対局すると、序盤の評価値が小さめの値になったことが確認できる。評価値のグラフ推移も近くなった。
f:id:TadaoYamaoka:20211019225259p:plain

モデルごとに調整が必要なため、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」の行を追記してください。