評価値がオーバーフローするとどうなりますか?

今年の6月ごろ、色んな人から、やねうら王だと教師局面の生成が終わらないことがあるという報告を受けた。

教師局面の生成は複数スレッドで行なうが、長時間生成していると処理が終了しないスレッドが出てくるのだ。原因はいくつかあった。平手の開始局面からランダムムーブを5手ほど(設定で変更可)して、そこから対局をスタートさせるわけであるが、EvalHash(一度計算した評価値をcacheしておく仕組み)や、置換表の衝突など色んな問題により、この現象が生じることがわかった。

結局、置換表はスレッドごとに用意することにして、一度search()を呼び出すごとに、置換表世代を新しくすることにして、かつ、EvalHashは教師局面生成時は無効化するようにした。これで私のほうでは教師局面の生成が終わらないということはなくなったが、それでも何人かの開発者からの「教師局面の生成が終わらない」という叫び声にも似たツイートを目にすることがあった。

その後、なんやかんやしているときに私のほうでも再現したのでデバッガーで調べてみたところ、評価値がオーバーフローしていた。オーバーフローするとすごく良い評価値のはずが、すごく悪い評価値になってしまう。この結果、fail lowが起こり続けて、search()が終了しなくなってしまうのだ。

やっぱりassert大事だよなーと思って、その後、assertをデフォルトで有効にして、やねうら王の実行ファイルを配布した。(7月ごろの話) そうすると、「前バージョンよりnpsがでなくて弱くなっている」という報告が相次ぎ、そして開発者からの「学習中に落ちた」(assertに引っかかっているのだと思われる)と悲鳴にも似たツイートを目にするようになった。仕方ないのでassertをデフォルトで無効にするように変更した。

ともかく、KPPT型評価関数では学習時のeta(学習率)の設定などにより、比較的オーバーフローしやすい。

歩の価値(PawnValue)は、内部的には90になっている(これはApery(WCSC26)の駒割り)が、これを50ぐらいにデノミ(通貨の単位を変更すること)したい。しかしそうすると(内部的な)評価値ベースでやっている枝刈りのパラメーターのチューニングをしなおさないといけなくなるし、従来のKPPT型の評価関数ファイルとの互換性もなくなってしまう。そのため、非常に困っている。

まあ、いまのままeta = 30で教師局面を大量に用意して学習させる限りは、そう簡単にオーバーフローしないので良いと言えば良いのであるが…。(たぬきやリゼロ系は、学習時のeval_limitを大きく設定しているため、手番評価が大きめに出てしまう傾向があり、何かの拍子にオーバーフローしかねない。)

評価値がオーバーフローするとどうなりますか?」への2件のフィードバック

  1. 私もetaは大きめに設定して、何度も溢れさせました。w
    駒のvalue変更もやりましたが、ゼロベースから学習する気力がなかったので諦めました。^^;
    駒の価値のデノミは賛成です。大会終わったので、ゼロベースから学習することもできそうですし。

コメントを残す

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