年末なので、2020年の将棋ソフト界隈のことを自分目線でまとめておきたい。自分目線なので全然まとめになってないとは思うけども、その点は御容赦願いたい。
今年は、コロナ禍のために毎年5月のゴールデンウィークに開催されていたWCSC(世界コンピュータ将棋選手権)が開催されなかった。
WCSCは、その代わりに「世界コンピュータ将棋オンライン大会」となり、オンラインで開催され、たややんさんの『水匠』が優勝した。
私(やねうら王チーム)は、このオンライン大会には参加しなかった。賞金もでないことだし(この時点でやる気9割ぐらいダウン)、単純に面倒くさかったからである。
将棋ソフトは何のために作っているのか?とよく尋ねられるのだけど、私の場合、それ自体が楽しいからであって、盆栽いじりにも似たものがあると思う。これは、Aperyの平岡さんも全く同じことを言っている。
だから、自分の盆栽を品評会に出すとか、盆栽同士勝負させようとか、そんなことはあまり興味の対象ではないのであるな。
4,5年前には「将棋ソフトがプロ棋士を追い越したら、将棋ソフト開発者は目標を失ってしまう」などと言っている人がよくいたが、私からしてみれば、「プロ棋士を追い越すために開発していた開発者なんてどこにおるん?」ぐらいの感じではある。
コンピュータ将棋の、そのプログラミング行為自体がとても楽しいと言うのに、この楽しさがわからない人の目には、開発者が何か特別な目標を持って取り組んでいると映るのであろう。「開発者は特別な目標を持って取り組んでいる」と、そういう物語を信じたいのであろう。何度でも言うが、私はやってて楽しいからやっているだけである。
話が少し逸れたが、この「世界コンピュータ将棋オンライン大会」で優勝したソフト『水匠』の探索部はやねうら王なので、まあ、実質的に、やねうら王の優勝みたいなものである。ちなみに、藤井聡太二冠も、水匠をお使いだそうで、すなわち、ダウンロードのためにこのブログもご覧になっているわけである。ここらで少しぐらいドヤっておいても、バチは当たるまい。
そうこうしているうちにカツ丼将棋さんが電竜戦という新しい将棋ソフトの大会を11月に開催されることになった。なんでも賞金が出るらしいのである。賞金が出るなら、やねうら王チームも参加せねばなるまい。ちなみに、参加するために私は仕事をしばらくお休みするので、それによる収入ダウンの額が賞金総額よりもはるかに大きいのだが、まあ、やってて楽しいんだから、そのへんはあえて考えないことにする。
電竜戦の結果は、GCTチーム(エンジン部dlshogi)の優勝であった。dlshogiは、Deep Learningを用いた新しいタイプの将棋ソフトであり、まだ実用にはほど遠いと言われ続けていたDeep Learningの将棋ソフトに追い抜かれた瞬間でもあった。
GCTの優勝が決まった日の翌日、私は気になってdlshogiのソースコードをちらっと見たが、良く言うなら「伸びしろや成長性を感じさせる」、悪く言うなら「改善の余地がある荒削りな」ソースコードであった。いずれにせよ、dlshogiはまだまだ強くなると理解した私は、次のWCSC、dlshogiチルドレンしか決勝日に残らないと確信した。
そこでdlshogiのやねうら王への移植を開始した。移植と言ってもコピペで済むはずもなく、とても困難な道のりであったが、新しいパラダイムのプログラムを見て興奮状態にあったのか、私の脳内でエンドルフィンが放出されまくっていたため、まあ2,3週間ほどで一通り動くようにはなった。
その移植の過程でわかったのだが、まあ、色々バグというか、おかしなところはある。私が気づいた点は、わりとこまめにdlshogiの作者の山岡さんに報告している。山岡さんのブログで記事で言うと、12月に投稿された記事4本は、すべて私の提案が絡んでいる。
かなり注意深くやねうら王に移植したので、やねうら王に移植されたdlshogi(ふかうら王)は、実のところ、本家dlshogiより優れている部分がたくさんある。
例えば、MultiPV(複数の候補手を表示させるモード)での読み筋がきちんと表示される。これはdlshogiには無い機能である。
定跡についても、ふかうら王は、やねうら王の定跡がそのまま使えるし、評価関数ファイルの配置フォルダを変更できたり、64スレッド超えのスレッドにも完全対応している。
しかしまあ、移植したとは言え、かなりの部分を新しく書き起こしたプログラムなのでどのようなバグが潜んでいるかは油断ならない。
旧来、将棋ソフトというのは、そういうバグの温床であったのだ。合法手を指すだけでも打ち歩詰めや千日手の処理が必要なのでわりと難しい。いまどき、大会に出てくるソフトで合法手をきちんと指せないソフトはきふわらべぐらいのものなので、みんな合法手は指せて当たり前ぐらいに思っているかも知れないが、一からフルスクラッチで書くとわりといろんなバグを仕込んでしまう。両王手の処理だとか、開き王手の処理だとか。入玉宣言だって単純ではないし、定跡を使う部分だってそうだ。みんな、やねうら王というライブラリを使うから、そういうことは起きない、起きようはずがないと思い込んでいるだけだ。
2015年の将棋電王戦FINALの時にSeleneが永瀬拓矢六段相手に王手放置の反則負けをしたのは記憶に新しい。Seleneは相手が歩などの不成の指し手を指してくることを想定していなかったわけだ。これはよくやってしまうバグだ。何故なら、将棋ソフトでは、歩などの不成を読まないほうが強いので、探索中の不成をあえて生成しないプログラムを書いている人が多い。
将棋ソフトの対局のためにサーバーとやりとりしているプロトコルはUSIプロトコルというものだが、これは、対局開始局面(平手の初期局面)から、現在の局面までの手順を毎回送ってくる。手順はすなわち指し手を意味する文字列、76歩なら、「7g7f」という文字列だ。思考エンジン側は、これを解釈して、現在の局面まで局面を進めなければならない。そのときに、この送られてきた「7g7f」が合法手であるかどうかを判定しなければならない。やねうら王はこのUSIプロトコルでの指し手表現文字列が合法手であるかを判定するコードを特別に書いてあるが、これをエレガントに実装する方法がある。
そう。その局面の全合法手を生成して、それをすべてUSIの指し手文字列に変換したものの集合を考える。この集合のなかにこの指し手文字列が含まれるかを判定するという方法である。全合法手を生成する関数は探索において必要なので当然ながら実装されているだろうし、USIプロトコルで指し手を返す以上、USIの指し手文字列に変換するコードも書いてあるであろう。その生成された集合のなかに特定の指し手が含まれるかは、Containsみたいな名前の関数で一発で判定できる。つまり、この方法ならば、2行ぐらいで書けるわけだ。
// この方法ならば、USIプロトコルの指し手文字列を思考エンジンが内部で使用している形式に変換するコードを書かずに済む。
とてもエレガントな実装で、やねうら王も最初、そう書いていた。ところが、これには落とし穴があって、先程も書いたように探索中では(歩の)不成をあえて生成しないので、この全合法手のなかから、不成の指し手が漏れてしまうのである。
そうすると、生成された全合法手(をUSIプロトコルの指し手文字列に変換した集合)のなかに、「この手が含まれますか?」のように判定したところで、不成の指し手はそこに含まれておらず、非合法手だとみなされ、そこでそれ以上局面を進められなくなってしまうのである。局面を途中までしか進めていないのにその局面について思考してbestmoveを返せという命令(goコマンド)が来ると、本来の局面とは違う局面について考えているのだから、当然おかしな指し手を返してしまう。
これがSeleneが王手放置を返してしまったからくりであるし、将棋ソフト開発者の誰もがやりがちなミスである。
やねうら王のような、十分に熟れたフレームワークを用いるから、みんな、こういうコードを誰しもが書いてしまうのだということを忘れているだけで、現実的には、プログラミングを40年以上やっている私ですら知らなければこれと同じミスをやってしまうだろう。
このように将棋ソフトには様々な地雷がある。それらは、やねうら王のようなライブラリを使うことでここ数年は、多くの将棋ソフト開発者から隠匿されてきたのである。
多くの将棋ソフト開発者は、「巨人の肩に乗る」などと言って、Aperyや、やねうら王を用いてそれらをベースに開発してきた。
しかしdlshogiが世界最強の将棋ソフトとなった(?)現在、dlshogiソフトは、その肩に乗れるような巨人なのであろうか。
というのも、12月に開催された電竜戦TSECでほっしーさん(人間)が不成の指し手を指すとdlshogiはバグって対局が終了した。まさにSeleneの再来であった。
この時のdlshogiは、山岡さんが改良中のもので、一般公開はしていないバージョンだそうだが、探索部が十分枯れたソフトではないので、改良しているうちにこういう風に壊してしまうことはあるだろうし、「将棋ソフトなんだから合法手指せるのは当たり前!」という時代から、Seleneの時代に逆戻りしてしまった感はある。
決して、ふかうら王ならそんなことないよ、大丈夫だよと言いたいわけではない。ふかうら王もおそらく改良しているとこういうことは今後、普通に起こりうると思う。もはや、Stockfishから探索部の改良だけを取り込んで将棋ソフトが強くなる時代は終わっていて、開発者が手探りで暗闇を歩かなければならない時代に突入したのであるから。
今後、巨人だと思ってその肩に乗ったら、巨人がすっ転んで大怪我をすることも普通に起こりうるのである。開発者の皆さん、巨人の肩に乗るときは、くれぐれも気をつけていただきたい。
きふわらべ愛されてるなあ…
きふわらべの作者の来年の抱負は、合法手がちゃんと指せるソフトを作ることだそうです。
次期製品は「将棋神ふかうら王!」ではなくて、
深浦康市とふたりで将棋
になるんですね。わかります。
VRで深浦先生と対局するゲームだと、手が震えて伸び伸び指せない気がします…。
あけしまておめとでうござまいす
どうぶつしょうぎみたいに、
どうぶつしょうぎがやられたようだな。やつは将棋のルールの中でも最弱ウンタラカンタラ〜
となっていくところまではやるんですよね?少なくともw
「どうぶつしょうぎの合法手が指せるきふわらべが誕生したようだな」
「どうぶつしょうぎは合法手生成のなかでも(難易度が)最弱…」
みたいなことではないかと…。
いやいや、目標としてどうぶつしょうぎの後手必勝みたいなものが見つかっちゃうまでやるんでしょ?という。
Seleneのバグとか懐かしいですね。
やねうら王は大規模なリファクタリングや改良を行った際、自己対局では分からないバクが混入してないか、どのように確認されてますか?
やねうら王の場合、ある程度ユーザーがいるので誰かが見つけるのではないかと…。(人海戦術)
「システムテスト」の観点でいくと、
打ち歩詰め、千日手、両王手、開き王手、入玉宣言を狙うソフトを作って対戦させてテストするのは面白そうですね。(誰が作るんだろ)
テストを完全に自動化するならそういうのもありかなと。