やねうら王では、FV_SCALEという思考エンジンオプションが存在する。これは、評価値を計算する関数(評価関数と呼ばれる)が値を返す直前に割り算するときに用いられる。
static_eval(静的な評価値) = 内部的に計算した評価値 / FV_SCALE
となっている。
ちなみに探索した評価値は、歩の価値が100となるようにスケーリングしなおしてGUI側に出力している。
やねうら王では、
PAWN_VALUE(歩の価値) = 90
なので、
GUI側に出力している評価値 = 100 × eval(探索した評価値) / PAWN_VALUE
となる。
この90は、少し小さくしておかないと評価値が16bit符号付き整数の範囲に収まらないことがあったからそうしてある。
また、このFV_SCALEのデフォルト値は16である。
これが16なのはなぜなのかと言うと、Bonanzaのソースコードでそうなっていたからである。
では、Bonanzaではなぜ16なのであろうか?そして、最近、FV_SCALEを20や24のように上げるのが流行なのだが、なぜ上げると強くなるのであろうか?
今回は、このへんについて詳しく解説したい。
まず、前者だが、『コンピュータ将棋の進歩6』に次のように書かれている。

Bonanza 6では三駒関係が導入されており、三駒関係では1500回程度、玉と他の2駒の合わせて3駒の位置関係に点数がついていて、それを足し合わせる。
ところが、点数は量子化(整数化)されているので、足し合わせるときに量子化誤差が乗ってくる。
この誤差は、ひとつあたり(四捨五入して整数にしているとすると)最大で0.5で、「標準偏差0.5の正規分布と仮定すると…」のように上の本には書かれている。私はちょっとその仮定はおかしいと思っていて、信号処理の分野での量子化の議論でよく出てくるように、ここは一様分布であると仮定すべきだと思う。
(量子化後に値が0になるときの元の値は)区間[-0.5, 0.5)の一様分布だと仮定すると、一様分布の分散 σ^2 は(一様分布の分散の公式より)
$$ \sigma ^2 = \frac{(b-a)^2}{12} = \frac{1}{12}$$
となる。
それでこれを(三駒関係の加算回数である)1500回ほど足した時の分散は、中心極限定理により個々の分散の和となるので、つまり、
$$ 分散の和 \sigma_{sum} ^ 2 = \frac{1500}{12} $$
$$ 標準偏差 \sigma_{sum} = \sqrt{\frac{1500}{12}} ≒ 11.18 $$
なので、16で割って(割る数を2のべき乗にしたほうがシフト演算で済むので高速)、スケールダウンしておけば、この量子化誤差の影響が減少する。
$$ スケールダウン後の標準偏差 \sigma_{sum}’ = \frac{\sigma_{sum}}{16} ≒ 0.7 $$
そんな感じの理屈で、BonanzaではFV_SCALEは16となっていて、やねうら王もFV_SCALEのデフォルト値はそうなっているが、現在やねうら王では三駒関係は使っていない(使うことはできるが、NNUEという浅い層のニューラルネットワークを用いるほうが強いので、やねうら王を利用するほとんどの開発者がNNUEを用いている)ので、あまり関係ない。
それで、やねうら王でなぜFV_SCALEを大きくしたほうが強くなるのかについてなのだが、これは、やねうら王の探索部を参考にしているStockfishのほうで、昨年ぐらいに評価値のスケーリングが大きく変わった。そのせいで、探索部の枝刈りなどの条件がその新しいスケーリングにおける最適な値となっている。
やねうら王の探索部にStockfishのコードを持ってくるときにその値をSPSA(確率的最適化手法の一つ)を用いてチューニングすべきなのだが、やねうら王では、十分な計算資源がなくてそのチューニングを最近できていない。
そのため、評価値側のスケーリングを(FV_SCALEの値を大きくして)調整すると強くなる…ということなのだと思う。十分に検証できていないのであくまで私の予想であるが。
そんなわけで、従来の評価関数ファイルをFV_SCALE = 16で運用しているのであれば、最新のやねうら王で、FV_SCALE = 20~36あたりの最適値にすれば(調整前よりも)強い可能性は大いにある。