量子化誤差とやねうら王のFV_SCALEの件

やねうら王では、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あたりの最適値にすれば(調整前よりも)強い可能性は大いにある。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です