やねうら王のバグなどまとめ [コンピュータ将棋]
そろそろAtCoderも終わってしまいそうなので、現状までわかったことをまとめ。新規なところは特に無い。
■バージョン
やねうら王 classic v2.17
■落ちる原因
「pseudoLegalが相手番の違法手(多分Dropのみ)を弾くことが出来ない」
旧置換表の場合は、(多分実装ミスによって)Sideビット(bit0)が落ちてしまうため、相手番のハッシュキーを参照する。このため、Dropのコメントに書かれているように違法手チェックを省くと先手が1段目に歩を打つようなことが発生する。旧置換表でもSideビットを保存するように変更すると、置換表を参照するときはクラスタが自分の手番側のものであることが保証されるので落ちなくなる。
実際に違法手の数をカウントしたところ、ベンチマークコマンドで3回程度発生していたものが発生しなくなる。(歩、香、桂のDropの違法手のみの数)
この問題は旧置換表だけでなくCounter Moveでも発生する。Counter Moveの場合、ハッシュキーに関係なく盤面だけを見るので、手順前後などで違法手が発生する確率がかなり高い。
試しにStockfishのbenchコマンドで計測してみたところ、約4割程度は違法手だった。
Counter MoveでのDropには手番が入っていないので、手番を取り違えるとpseudoLegalを抜けてしまうので違法手を指してしまう。Dropするための要件には「手駒を持っているかどうか」という条件が入っているため、自分だけ持っている駒では発生しないが、終盤になって互いに歩を持っている場合などは頻繁に発生するためpseudoLegalをすり抜ける。
以下の局面はCounterMoveとして先手が1段目に歩を打ったとして処理される。
+R7l/2K1+N1+S1s/p1+P2gnpp/6+b2/2+SGG4/3P1+b3/P5+pPP/5+r3/+n1+pk4L w SL2Pgnl6p 160
KILLER(COUNTERMOVE)によって71に歩が出現して、さらに移動して69にいる玉をキャプチャーして発覚した。(実際にはその2,3手前にも先手と後手の金を取り違えてるような気もするが・・・)
Dropの対策以外も必要そうな気がするが、ひとまずDropの対策を入れたところ落ちなくなった。レーティング的には誤差の範囲でほぼ互角(若干マシになったかもしれないが)
■置換表
基本的にSidebitは保存したほうが良い。これによって手番が保証されるので、ある程度はpseudoLegalのお世話にならなずに済む。
置換表の参照回数はNPSの1.2倍程度だった。
16bit/32bit/48bitの書き換え回数なども調べてみたが、程度の差がある程度で基本的にbitが大きいほどハッシュ衝突的には少ない。ただ、旧置換表48bitと新置換表16bitのほうがキャッシュ参照速度的には14%ほど新置換表のほうが速く、読む深さに差が出てくるため、強さ的には新置換表のほうが良かった。
また手を間違えるようなハッシュの衝突が出るのはハッシュサイズが小さい場合ではなく、大きい場合だった。一瞬小さいほうが現象が出やすいのではないかと思っていたが、ある程度大きい方がハッシュキーがぶつかって違法酒が出る確率があがる。(多分256MB以上と以下で確率が結構変わる)。これはよく考えれば当たり前で、ハッシュキーを保存する空間が大きいほど、同値になるハッシュが出てくるので、ぶつかる可能性があがる。
■Counter Move
上記のようにCounter MoveをいれることでpseudoLegalをすり抜ける違法手が出てきてしまうのであれば、使わなければよいではないかという話もあり、無効化してみると落ちなくなる代わりにすごく弱くなる。
Counter Moveがあると超高速で読みが深くなるため、勝率的にはかなり差があるように思われる。
■一手詰め判定
自玉に王手がかかってなくても王手チェックをしてしまうので最後のmateのところで、負け局面で盛大に勝ちを確信するようなことがある。
表示上はバグなのだが、他の要因がいろいろあってレーティングには直接影響しない。
■やねうら王2015に負け越す理由
バグで落ちる要因はわかったが、落ちなくなったところでレーティングがあがるわけではないので、原因は全然わからなかった。
■バージョン
やねうら王 classic v2.17
■落ちる原因
「pseudoLegalが相手番の違法手(多分Dropのみ)を弾くことが出来ない」
旧置換表の場合は、(多分実装ミスによって)Sideビット(bit0)が落ちてしまうため、相手番のハッシュキーを参照する。このため、Dropのコメントに書かれているように違法手チェックを省くと先手が1段目に歩を打つようなことが発生する。旧置換表でもSideビットを保存するように変更すると、置換表を参照するときはクラスタが自分の手番側のものであることが保証されるので落ちなくなる。
実際に違法手の数をカウントしたところ、ベンチマークコマンドで3回程度発生していたものが発生しなくなる。(歩、香、桂のDropの違法手のみの数)
この問題は旧置換表だけでなくCounter Moveでも発生する。Counter Moveの場合、ハッシュキーに関係なく盤面だけを見るので、手順前後などで違法手が発生する確率がかなり高い。
試しにStockfishのbenchコマンドで計測してみたところ、約4割程度は違法手だった。
Counter MoveでのDropには手番が入っていないので、手番を取り違えるとpseudoLegalを抜けてしまうので違法手を指してしまう。Dropするための要件には「手駒を持っているかどうか」という条件が入っているため、自分だけ持っている駒では発生しないが、終盤になって互いに歩を持っている場合などは頻繁に発生するためpseudoLegalをすり抜ける。
以下の局面はCounterMoveとして先手が1段目に歩を打ったとして処理される。
+R7l/2K1+N1+S1s/p1+P2gnpp/6+b2/2+SGG4/3P1+b3/P5+pPP/5+r3/+n1+pk4L w SL2Pgnl6p 160
KILLER(COUNTERMOVE)によって71に歩が出現して、さらに移動して69にいる玉をキャプチャーして発覚した。(実際にはその2,3手前にも先手と後手の金を取り違えてるような気もするが・・・)
Dropの対策以外も必要そうな気がするが、ひとまずDropの対策を入れたところ落ちなくなった。レーティング的には誤差の範囲でほぼ互角(若干マシになったかもしれないが)
■置換表
基本的にSidebitは保存したほうが良い。これによって手番が保証されるので、ある程度はpseudoLegalのお世話にならなずに済む。
置換表の参照回数はNPSの1.2倍程度だった。
16bit/32bit/48bitの書き換え回数なども調べてみたが、程度の差がある程度で基本的にbitが大きいほどハッシュ衝突的には少ない。ただ、旧置換表48bitと新置換表16bitのほうがキャッシュ参照速度的には14%ほど新置換表のほうが速く、読む深さに差が出てくるため、強さ的には新置換表のほうが良かった。
また手を間違えるようなハッシュの衝突が出るのはハッシュサイズが小さい場合ではなく、大きい場合だった。一瞬小さいほうが現象が出やすいのではないかと思っていたが、ある程度大きい方がハッシュキーがぶつかって違法酒が出る確率があがる。(多分256MB以上と以下で確率が結構変わる)。これはよく考えれば当たり前で、ハッシュキーを保存する空間が大きいほど、同値になるハッシュが出てくるので、ぶつかる可能性があがる。
■Counter Move
上記のようにCounter MoveをいれることでpseudoLegalをすり抜ける違法手が出てきてしまうのであれば、使わなければよいではないかという話もあり、無効化してみると落ちなくなる代わりにすごく弱くなる。
Counter Moveがあると超高速で読みが深くなるため、勝率的にはかなり差があるように思われる。
■一手詰め判定
自玉に王手がかかってなくても王手チェックをしてしまうので最後のmateのところで、負け局面で盛大に勝ちを確信するようなことがある。
表示上はバグなのだが、他の要因がいろいろあってレーティングには直接影響しない。
■やねうら王2015に負け越す理由
バグで落ちる要因はわかったが、落ちなくなったところでレーティングがあがるわけではないので、原因は全然わからなかった。
コメント 0