科学技術の発展は計測技術によって支えられ、計測技術の進歩は新たな科学的発見の基盤となってきた。将棋AIの世界においてもそれは同様で、前のバージョンからわずかでも強くなったのかを正確に計測することができれば、そのわずかな棋力向上を繰り返し、最強の探索部が書けるという理屈がある。
前のバージョンより有意に強いのか?これは、高校の統計学で学ぶ(?)統計的仮説検定やP値のことを思い出せば、かなりの回数を対局させなければ小さな棋力向上は掬えないことがわかる。
実際、私が将棋AIの探索部を改良する時は、少なくとも3000局ぐらいは前のバージョンや他のソフトと対局させて有意に強くなっているのかを検証している。通常、私は並列自己対局で320局(40コアXeon Dual × 4PC)の並列対局をさせている。従来はこの並列対局ができなかったのだが(将棋所を複数起動して対局させていた)、自作の自己対局スクリプトで並列対局できるようになってから世界が変わったわけである。
棋力計測のための対局回数がわりと多いのはこれで十分伝わったかと思うが、しかし初期局面から対局を開始すると、そのソフトの癖が出て、基準となるソフトとの相性問題が出てくる。改良したソフトと基準ソフトとだと何回対局させても矢倉にしかならず、結局、矢倉の指し手の上手さの評価にしかなっていない、というようなことが起こりうる。
もし将棋が矢倉しか出てこないゲームであるか、矢倉以外をやってくる相手になら多少悪手を指しても余裕で勝てる、みたいな状況であるなら、こういう計測でも問題ないのだが、実際はそうではない。
そこで、やねうら王では、互角局面集を用意してその局面から対局を開始させることで様々な局面での棋力を計測しようとしてきた。
将棋AIの棋力計測、こんな方法は駄目だぞ
https://yaneuraou.yaneu.com/2020/07/04/rating-measurement/
しかし、将棋AIの世界は、昨年ぐらいから角換り先手必勝がその結論となった。正確に言うと、水匠と言う有名な将棋AIの指し手(1手につき100万局面~1億局面を探索させる)だと、先手が正確に指すと後手はどうあがいても千日手にすら持ち込めないということが証明されてしまった。
角換りは終わったのかについて1万文字程度で
https://yaneuraou.yaneu.com/2023/06/03/the-kakugawari-is-over/
定跡がある世界ではどうなるのか見てみよう。
将棋AIは探索する局面が多いほど強くなる。水匠7は1手100万局面を探索する設定だと、floodgate(将棋AIの対局場)でR3400-3600程度である。ここに私のペタショック定跡を搭載させると、R4300ぐらいのソフトに対して自分が必勝の局面に誘導できて、そのまま勝ち切ってしまうことがある。
R800差だと期待勝率は(レートの高いほうは)99.02%なので、本来100回に1回ぐらいしか勝てないはずなのだが、定跡ありだと数回に1回、こうやって勝ってしまう。
こういう世界において、棋力計測に様々な戦型が含まれる互角局面集を用いるのはちょっとおかしいのである。確かに様々な戦型が含まれていれば、オールラウンダーとして強いかどうかの計測にはなるし、探索部の性能評価にはわりと良いのだが、その将棋AIが大会で順当に勝てるかという観点においては、あまり好ましくないのである。
角換りの後手が必敗だとしたら、後手番としては、角換りを避けられるかどうかの勝負であり、後手なのに角換りにしてしまうソフトはその時点でいまの大会では優勝できないと言っても過言ではないのである。
そういう意味では、棋力計測は、複数の基準ソフトを用意し、基準ソフトに定跡を搭載し、リーグ形式で戦わせてその勝率からレートを推定する方法がより実戦に近くて好ましいわけであるな。
そこで、リーグ形式で対局させた時にその結果からレートをどうやって推定するのかという話になるのだが、これはすでにチェスの世界では解決済みの問題で、Ordoと呼ばれるソフトを使うと対局結果から何やら難しい手法を使って正確に推定してくれるようである。Ordoのマニュアルにその手法の詳しい説明があるので興味のある人はそちらを読んで欲しい。
Ordo
https://github.com/michiguel/Ordo
Ordo 1.2.6 MANUAL
https://github.com/michiguel/Ordo/releases/download/v1.2.6/MANUAL.pdf
さて、対局結果をどのようにしてOrdoに集計させるのかだが、チェスでは対局結果を書いておくファイル形式としてPGNというファイル形式が標準的に使われているようである。
PGN形式について
https://en.wikipedia.org/wiki/Portable_Game_Notation
Ordoは、以下のように、White,Blackに先手、後手の名前を入れて(チェスの先手は将棋と違いWhiteなので注意)、引き分けなら1/2-1/2、先手勝ちなら1-0、後手勝ちなら0-1とResultのところに記入し、これを 例えばresult.pgnという名前で保存する。またResult行の次行には棋譜を好きな形式で貼り付けておいて問題ない。
1 2 3 4 5 6 7 |
[White "水匠6"] [Black "水匠7"] [Result "1/2-1/2"] [White "水匠6"] [Black "水匠7"] [Result "1-0"] |
そうすると
1 |
ordo-win64.exe -p result.pgn > rating.txt |
のようにして集計結果をrating.txtというファイルに書き出せる。簡単である。書き出した例は以下のようになる。それぞれのAIの推定レーティングが以下のように出力される。
1 |
# PLAYER : RATING POINTS PLAYED (%) 1 水匠7 with suisho-book(100K-100K) : 2382.0 94.5 145 65 2 水匠7(100K-100K) : 2355.1 77.0 125 62 3 Hao(100K-100K) : 2309.4 89.0 161 55 4 水匠6 with peta-book(100K-100K) : 2272.2 328.0 720 46 5 BLOSSOM(100K-100K) : 2242.8 65.5 143 46 6 水匠6(100K-100K) : 2238.5 66.0 146 45 |
なお、PGNは Unicode対応していないようなので ShiftJISで書き出して、また、結果もShiftJISにしないと文字化けするので注意である。
余談だが、(上の出力ファイル)VS Codeの文字コード自動判別の機能が高い確率でShiftJISをISO 8859-2と誤判定するんだよなー。これバグじゃないかと思うんだけどなー。これ修正してプルリク送りたいぐらいうざいんだよなー。
おわり。
オルドといえば子づくりテント?
『蒼き狼と白き牝鹿』(コーエー)
> 余談だが、(上の出力ファイル)VS Codeの文字コード自動判別の機能が高い確率でShiftJISをISO 8859-2と誤判定するんだよなー。これバグじゃないかと思うんだけどなー。これ修正してプルリク送りたいぐらいうざいんだよなー。
私もうざく思っていたのでぜひよろしくお願いいたします。
同士よ…。