将棋AIの棋力計測、こんな方法は駄目だぞ

ちょっと目についたのですが誰も返答しないようなので軽く私見を書いておきます。

要するに、将棋ソフトAとBでは、BのほうがR50強かった。BとCではCのほうがR30強かった。AとCとではR50+R30=R80の差があるはずなのにそうならない。なんで?ということですね。

駄目1. 自己対戦のみに頼っている

基準となる異種の複数のソフトと対局させて計測しましょう。自己対局ですと同じような読み筋なのでわずかに読みが上回ったほうが勝ちやすく、適切な計測にならないことが多いです。(本来のレート差より拡大されて見えやすいです)

また特定のソフト(1つ)に対してチューニングし続けるのも、そのソフトとの相性を上げるだけのチューニングになってしまうので、よろしくないです。自分のソフトの改良のときには、異種の複数のソフトと対戦させるのが基本です。

駄目2. 互角局面集のようなものを使っていない

平手の初期局面から対局を同一のソフトで開始させる場合、特定の戦型ばかりになりやすく、その戦型の勝ち方を知っているほうの勝率が高くなりすぎるということがあります。また、例えばAとBでは必ずAは横歩を取られる変化になるので負けやすいがAとCではその変化にはならないので勝率はそこまでではない、ということもありえます。

平手の初期局面からの序盤のうまさも棋力には違いないでしょうけども、相性が出やすいのでそうやって計測したレーティングではR50+R30=R80みたいな計算式は成り立たないことは容易に想像がつきますね。

駄目3. レーティング計測時の誤差を考慮していない

ソフトAとBの真の勝率がxとして(確率xで表がでるコインのコイントスを想像して)、このN回の試行を観測すると勝率rであったとき、真の勝率xの存在する区間は解析的に求まります。(意味がわからなければ以下にPythonのコードを貼り付けておくのでそのまま使ってくだされ)

Ayaneのレーティング計測のコード
https://github.com/yaneurao/Ayane/blob/5d6cdf51773eb3996bf030ace099d60c5242ee75/source/shogi/Ayane.py#L1349

これにより、計測された勝率rとNから、(有意水準の範囲内である)レーティング差の上限値、下限値が求まります。レーティング差の足し算をするときは、この上限値同士、下限値同士を足していくと良いでしょう。

駄目4. 終盤を強化している

例えば、駒得だけしか考慮しない評価関数の将棋ソフトでは定跡を活用してもR2300あたりが限界です。(2倍の探索量になっても本当にわずかしかレーティングが伸びないです)

これは、序盤で作戦負けになるのが大きく、いくら探索量を増やして終盤を強化したところで上位のソフトには全く歯が立たないからです。しかし、自己対局ですと片側だけ探索量を2倍にするとそこそこ勝率に差が生じます。

これは将棋ソフトの開発初心者がよく陥る罠で、終盤を強化すると自己対局などで勝率は上がるのでそれを信用して終盤力強化のチューニングをひたすらやるのですが、結局、強いソフトとやらせると序盤で差がつくので、全く歯が立ちません。終盤力の強化は主に同系統のソフトの間でしか意味をなさないです。

駄目5. 強いソフトを低depthにして対戦相手に使っている

将棋は終盤の悪手一発で逆転するゲームなので、人間でも弱い者同士の対局ですと、「最後に悪手を出したほうが負け(になるゲームである)」と言われることがあります。なので、弱いソフトが弱いソフト同士でレーティングを計測したところで、最後に間違えないほうが圧倒的に勝ちやすく、すなわち詰み周りの探索を頑張っているほうが勝率は高いです。

しかしそのようなチューニングをしても強いソフトに対しては何の意味もないので、結局のところR1500や2000ぐらいのソフトが特定の弱いソフトに対して勝率が上がるようなチューニングをしてもあまり意味がありません。

もう少し具体的に言いますと、適度に弱いソフトがないので、やねうら王の探索深さを下げて、depth 5とかで対局させてそれを目安にチューニングする開発者の方が時々いらっしゃいますが、depth 5みたいな低depthだと終盤で頓死しまくるので、終盤をきちんと読んでいるほうが勝つとしか言えないです。そういう状況で計測されたレーティング差にはあまり意味がないです。これは、計測の手法がおかしいと言わざるを得ないです。

もし自分のソフトが弱くて基準ソフトがないというのであれば、やねうら王のほうは1秒か2秒に固定して、自分のソフトのほうを思考時間だけを32倍するなどして、自分のソフトを長時間で戦わせてチューニングすべきです。そうしないと終盤力だけを強化する間違ったチューニングをしてしまいます。

まとめ

以上の5点に気をつけていれば、経験的には、レーティング差の足し算自体はわりと成り立つように思っていますが、それでもいくつもレート差を足し合わせると多少のズレは生じるかもしれませんね。

そもそもeloレーティングの計算式は将棋のゲーム性に合致しているのでしょうか?

つまり、Aに対して勝率76%(R200差)のBに、勝率76%のCがいたとしてCはAに91%(R400差)勝てるのでしょうか?そして、これは将棋の棋力R500からR4500のどの区間においても成り立つのでしょうか?

例えば、将棋においてR1000以下のプレイヤーは初心者で、しょっちゅう1手詰めを見落としたり、王手飛車取りに遭ったりするので、R1000以下の区間では、R400の差があっても上位のプレイヤーが91%も勝たないことは容易に想像がつきます。(見落として負けるので..)

そこから外挿するとR1500かR2000ぐらいまでは、それと同様の理屈で、R400差があっても上位のプレイヤーの勝率は91%ほどには高くないことが予想されます。

そんなわけでして、弱い棋力のプレイヤーに対してeloレーティングの式は、補正が必要だという話になるのですが、まあ、それを言い出すとこの記事が終われなくなるので、このへんで筆を置きたいと思います。

追記 2020/7/8 18:00

駄目3. で紹介した方法以外として、eloレーティングに代わるものとしてグリコレーティング(Glicko rating)というのがあるらしいです。

28 thoughts on “将棋AIの棋力計測、こんな方法は駄目だぞ

  1. 以前駒得やねうら王と探索制限技巧で戦わせたことがあったので実感があります。昔のやねうら王nanoとかは探索制限無しで絶妙な棋力を出してくれるのでそういう点では低R帯での強さを測るのに適していたのかもしれないですね。

    >そもそもeloレーティングの計算式は将棋のゲーム性に合致しているのでしょうか?
    >そこから外挿するとR1500かR2000ぐらいまでは(ry
    uuunuuunさんやQhapaqさんが行っているレギュのレーティングは上位陣に対する勝率で最高Rを更新していてイベントごとに最高Rが上昇していきますけど、そうして算出されたレートが差のついた相手に対して期待通り勝率を出せるかは個人的には疑問に思っています。(T.N.K-wcsc28と水匠2-wcsoc2020のR差400らしいですけど同型NNUEで91%も出せるのかという)

    (おまけ、駒得やねうら王と技巧2_D7の棋譜です
    position startpos moves 1g1f 3c3d 1f1e 5c5d 6i7h 8b5b 2h1h 5d5e 5i4h 5a6b 7g7f 6b7b 7h6h 3a4b 5g5f 4b5c 5f5e 5c6d 8i7g 2b3c 5e5d 5b5d 1h1f 2c2d 6h5g 2d2e 5g4f 3c2d 2g2f 2d4f 4g4f G*8i 4i5h 8i8h 7i8h B*2g 1f1g 2e2f P*2h 5d5h+ 4h5h P*5g 5h4h G*5h 4h4g 2g4i+ R*2b 7a6b 2b2a+ 4a5a G*3h 5h6h 3g3f 5g5h+ 2a1a 6h6g B*3c 6g7h L*5f P*5e 5f5e P*5c P*5d 6d5e 3c5e+ 5c5d 5e5d L*5b N*6d 7b8b 6d5b+ 6a5b S*6a N*2e 1g1f 5a6a 1f2f P*5a 2f2e 7h8h N*7e 6b5c 5d6e S*7d L*8f S*7b 6e6f 7d7e 7f7e 4i5i 7g6e 5c5d P*6b 5b6b S*5f 8h8g P*5e P*2d 2e2d P*2c 2d2c+ 5d6e 8f8c+ 7b8c 6f6e L*6d 6e8g 9c9d P*6e N*4d 6e6d 6c6d 5f4e N*6e S*6f P*8f 8g9f 6a7b 1a5a 9d9e 9f8e 5h5g 6f5g 6e5g+ 4g5g 8f8g+ P*8d 8c8d 8e8d P*8c N*9d 9a9d S*9c resign)

    • まあ、件のレーティングサイトは計測誤差を考慮してないので、上ブレした時の数値で次の計算をしてしまいますとレーティングはインフレしていきますね..(´ω`) 例えば、下ブレしたソフトは成績の悪いソフトとしてR計測のトーナメントから除外していくなどで。

  2. 将棋の強さ関係は半順序であり、全順序じゃないですからね。無理やり全順序で表そうとするレーティングでその関係を評価するには注意深く使う必要がありますね。

  3. これ関連で特定の戦型に偏らないように思考時間をぶれさせるみたいなことも前に言ってましたね

  4. あれ?
    新しく強いソフトが出てくれば、数年前のあるソフトの特定バージョンに付いているレーティングというのは、今計測し直したときには下がるというものですよね?

    • 本来eloは初期rating例えば1500で参入し試合を繰り返してratingを更新し収束させるから、新規の強いソフトに吸い取られる事はありうるが、ここの話はちょっと違うと

      • 初期レート1500でゼロサムのレート奪い合いをさせてるのはオンラインゲームに限った話でそんなことは勿論コム将棋ではやってない。eloのウィキにも「疑似」レーティングとして紹介されてる。

  5. 駄目3についてですが十分な対局数でレート差を出している場合、正規分布に近似できる誤差でしょうから誤差の2乗の平均の平方根を合計の誤差とするのは駄目なのでかね?

    • 冷静に考えると正規分布に従うと近似できるのはR差ではなくシグモイド関数を通す前の勝率ですね。R差の誤差の合計は手計算だとシグモイド関数の傾きの変化が無視できる範囲という仮定を置かないとちょっと無理ですね。目の前の計算機にでも頑張ってもらいますか。

      • そこ、私は山岡さんの記事(本文中のソースコードの少し上にあるURL)の式を深く考えずに解析的に解いて使ってたのですが、言われてみれば…という感じです。これ、ポワソン分布とみなして、どやこやするのは筋が悪いのでしょうか?

        • 確かに極端な勝率の場合は正規分布と近似するのは危険ですね。
          どのように扱うのが筋がいいのかは自分もそんなに統計に詳しくないのでよくわかりません。

  6. 駄目4について
    >終盤力の強化は主に同系統のソフトの間でしか意味をなさないです。

    これは、

    自己対戦を含む、序中盤の実力がある程度(かなり?)近いソフトの間でしか意味をなさないです。

    なのでは?

  7. elmoとalphazeroは、角換わり、相掛り半分ずつと戦法偏ってましたよねー
    ディープもでてくるとなると、測る方法無くなってくるような気がします

    • 中終盤の棋力を判定するには戦型をばらけさせた互角局面から開始させるのがよろしいかと存じます(`・ω・´)b

      まあ、それはそれとして、AlphaZeroのような汎化能力の高い評価関数ですと初期局面からの勝ち方も相当学習するので定跡なし時の序盤が非常にうまいですね…。

  8. 将棋ソフト「mEssiah」公式
    『eloレーティング→glicoレーティングに変更することにより解決できました。』

  9. 最強ぷよぷよAI ぷよふら レート3419
    これより強いぷよぷよAIって作れますか?
    https://www.youtube.com/watch?v=-YFTQJY1oAc
    URLの動画の14分21秒ぐらいの所
    やねうらさんなら、なにもない所から1週間ぐらいで
    つくれたりしますか?なんたって天才だから
    挑発みたいになってますが本当に作れそう。

    • AlphaZero式に作るのであれば、計算資源の勝負ですかね。何を特徴量にするかという点で工夫はあるでしょうけども。あとは終盤は、詰将棋のようになるならmate solverみたいなのが欲しいかもですね。

      • コンピューターは3手読みらしいです。
        動画の対戦相手のかたは将棋でいうとA級棋士ぐらいみたいで 現段階で最強同士を比べると人間のほうが強いようにみえます。
        人間で最強はマッキーっていう大阪の大学生でレート
        3600ぐらいあるように見えます。
        驚きの強さ わずかスプーン一杯分!

  10. 振り飛車ソフトに序盤で200,250点くらいプラスの評価してるのに、対局増やすと点数ほど勝てないのも、戦型の偏りによるものなんですかね?

    • 本当に対局増やすと点数ほど勝てないのでしょうか…。
      一応、短い時間(depth 16程度)ではその勝率ではあるはずなのですけど。

      逆に、通常の対局(depth 30程度)で点数ほどの勝率がないのだとしたら、振り飛車はdepthによって勝率が変わるという話になるのかなと。

yrks へ返信する コメントをキャンセル

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