話題の記事

最強CPU将棋ソフト『水匠』VS最強GPU将棋ソフト『dlshogi』長時間マッチ観戦記 第一譜『水匠』杉村達也の挑戦

長時間マッチ第1局で現れたやねうら王のバグについて

 ……ところで、やねうら王のバグについてである。
 これはいったい何が原因で発生したことなのか?
 イベント当日から開発者たちはその原因を特定し、野田久順の尽力により翌日にはほぼ修正を完了するまでになっていた。
 野田はNNUEを初めて実装した将棋ソフト『tanuki-』シリーズ開発チームの主要メンバーである。第5回電王トーナメントで優勝した、たぬきの着ぐるみを着ていた人……と言ったほうが伝わるかもしれない。

 やねうら王開発者の磯崎は、このバグが長時間マッチで発生したことを知った時、こう発言している。

『dlshogiが先手番で強いのは、やねうら王系のソフトの後手番で出現するこのバグを学習したからでは?』

 その推測が正しければ、将棋ソフトの発展にこのバグが無視し得ないほどの影響を与えているということになる。

 果たしてバグの原因は何だったのか?
 その影響はどこまで及んでいるのか?
 磯崎本人の口から聞くことで、第一譜の締め括りとしたい。


──このバグのことは、事前に知っていたんですか?

磯崎:
 読み筋に非合法手が入るという報告は、3~4件ほど聞いてはいました。しかし同じ条件でやっても再現しないし……読み筋だから、ま、いっか! くらいの気持ちでいました(笑)。

 詳しい原因自体はやねうら王のブログに書いたんですが……あれは将棋ソフトの開発者向けに書いたものですし、とにかく今回のバグは原因が複雑で……。

──技術的な部分についてはそちらのブログを読んでいただくということで、ここではバグが発生した背景について書いていきたいと……あの、もうバグは修正されてるんですよね?

磯崎:
 そうですね。結果的には修正しても強さに変わりはなかったし、dlshogiも特にこのバグを突くように成長したわけではなかったみたいです。再現性も低いから、プロ棋士の研究に影響を与えたということもないでしょう。

 『合法手のチェックが甘かったんじゃないか?』という指摘があるかと思うんですが……ただ、今回のバグを修正した方法って、合法手のチェックを強化したわけじゃないんです。

──そもそもなぜ後手の飛車が自陣で『竜』に成ってしまったのでしょうか?

磯崎:
 現象としては『先手の指し手と後手の指し手を間違えてしまった』というバグでございましてね。やねうら王の置換表には……。

──『置換表』というのは、ソフトが調べた局面情報を記憶しておく表のことですね。対するディープラーニング系のソフトは局面情報を全て記憶しておく必要があるからメモリの使用量が莫大になると。

磯崎:
 そうです。置換表は固定サイズのメモリが割り当ててあるので、古いエントリーを上書きしないと、足りなくなってくるんですわ。

 たとえば100局面分しか憶えられないのに、1000局面分記録しなさいと言われたら、900局面分はどっかに溢れちゃう。だから、要らないとおぼしきところから上書きしていくような感じなんですが……。

──なるほど。

磯崎:
 で、今回のバグは、長時間思考させたことでこの置換表が溢れてしまった時にのみ起きるバグだったんです。だからポンと局面だけを与えられて『ここでバグが出るからやってみ?』と言われても、再現することはできなかったんです。

──置換表が溢れた状態で検証する必要があったんですね。

磯崎:
 はい。それと、やねうら王の置換表には、先手の局面用のエントリーと、後手の局面用のエントリーとで、記録するところが分けてありまして。だから先手の指し手が後手の指し手に混入することは、本来、無いわけなんです。

──あ! 先後を最初から分けているから、指し手の情報にいちいち先手か後手かなんて記憶する必要がないわけなんですね!?

磯崎:
 そうですそうです! 想定していないんです!

──なるほど……いや、ちょっと待ってください。そもそもどうしてやねうら王の置換表は、先後をわけて記憶するようにしてるんですか? わけずに記憶してるソフトもあるんですよね?

磯崎:
 分けずに記録すると余分にチェックが必要になるからです。非常に細かい話なので多くの人がここを読み飛ばすと思いますが(笑)、順を追ってご説明しますね。

──よろしくお願いします。ちょっと怖くなってきました(笑)。

磯崎:
 まず、置換表上、指し手がどう表現されているかというと、駒を移動させる指し手の場合ですと『移動元の升(の番号)』、『移動先の升』、『成りかどうか』です。

──人間の棋譜だと、駒の種類と、移動先の升と、成りかどうかですね。やねうら王はちょっと違うと。

磯崎:
 例えば、先手が23歩成とする場合、この指し手は、【移動元が24+移動先が23+成り】という情報で構成されています。この指し手が先手の指し手であるとわかっている場合、この成りが合法かどうかのチェックを端折れるんです。なぜなら、23の升は先手にとっての敵陣ですから。

──あっ! そうか……。

磯崎:
 先手の駒であれば(そこに実際に移動できるかどうかは別として)成れることには間違いないです。これが後手の指し手である可能性が残されている場合、このチェックを端折れないんです。後手ですと24の升にある駒を23に移動させても成れないですしね。

 だから、局面を保存する領域を先手の局面用と後手の局面用とに分けてやることで、このチェックを端折れる、そういう狙いがあるんです。

──なるほど! いや、すごい工夫じゃないですか!

磯崎:
 しかし『Stockfish』が1年前に改良した部分をやねうら王に取り込んだことで、針に糸を通すような細い経路を通って、後手の局面を保存する領域に先手の局面の指し手が紛れ込んできまして、それで今回、先手用の指し手を、後手が指してしまっているんです。

──……ようやくバグの原因が理解できました。『今回のバグの原因は合法手のチェック(駒が成れるかどうか)が甘いことだろう』という大方の予想に反して、そのチェックは最初から意図的にやっていないというのが実際のところだったんですね……。

磯崎:
 そうです。『なんでそんな基本的なチェックすらやってないんだ、プログラミング素人かよ!』って思っている方も大勢いらっしゃるかと思いますが、こっち(私)はプログラミング45年もやってるわけでしてね(笑)。

──その今回のバグの遠因となったStockfishって、チェスのソフトですよね? チェスって取った駒を使えないし、駒が成ることもそんなにないじゃないですか。

磯崎:
 そうですね。プロモーション(成り)は、一番奥まで行ったポーンしかできませんし。

──でも将棋は持ち駒を自陣に打つこともできて、さらに駒が成ることも多い。だからStockfishでは潜在的に見過ごされていた現象が、将棋になったときにそれなりの頻度で発生するようになった……ということはありませんかね?

磯崎:
 そういう側面もあるでしょうね。まあ、Stockfishは非常に複雑で、しかもバージョンアップしたときに『ここは変わってへんやろ』とこっちが思ってる前提条件が変わってたりすることもあります。

──どうして今もStockfishがバージョンアップするたびに、やねうら王に取り込み続けているんです? そうしなかったら今回のバグは起こらなかったわけですよね?

磯崎:
 Stockfishの開発者の人たちは本物の天才集団で、Stockfishにはこの手のボードゲーム(将棋やチェス)全般でうまく動くような汎用性の高い探索部のコードが書いてあります。

──そんなに凄いソフトなんですか……。

磯崎:
 そのためチェスAIのプログラムであるStockfishの探索部を将棋AIのプログラムにコピペしてくるだけでかなり強くなるんです。ここ近年でもStockfishの最新版にキャッチアップするだけで1年でR50~100ぐらい強くなっています。

――よく選手権のアピール文章に『Stockfishの最新版を~』って書いてありますけど、あれはつまり『強くなってるぞ!』とアピールしてるわけですね。

磯崎:
 やねうら王では実際は、そこから将棋に向けてチューニングも行っているので何も考えずにコピペしているわけではありませんが(笑)。

 最近では9月下旬に、やねうら王V6.50というのをリリースしました。これは半年前のやねうら王からR50ぐらい強くなっています。水匠4の探索部よりも強く、現状NNUE系では最強です。これも全部Stockfishのおかげです

──Stockfishチートすぎる……。あの、Stockfishをベースにしていない将棋ソフトってあるんですか?

磯崎:
 最近はDeep Learning系の将棋ソフト(dlshogi、PALなど)が出てきて、これらはStockfishの探索部は参考にしていませんが、Deep Learningを用いないソフト(NNUE系など)は、上位のソフトすべてStockfishの影響を何らか受けていますね。

 2013年~2016年ごろには結構独自の探索部で大会に参加する開発者の方もおられたのですが、Stockfish系の探索部が優秀すぎて、独自に書いている開発者は軒並み予選落ちしてしまうんですよね。これではなかなかモチベーションが続かないというのもあるのでしょう。

──それはツラい……。頑張ってオリジナリティを出した小説よりも、あまり何も考えずに売れてる作品をコピーしたラノベのほうが売れるみたいな現象が起こっていたと……。

磯崎:
 時系列順に言うと……『Apery』の平岡さんが(2015年の電王戦FINALの後に)『Aperyをオープンソースにします』と宣言し、ソースコードを公開されたあと、やねうら王を含めて、ほとんどのソフトが評価関数についてはAperyと同等のものを使用しました。

 将棋ソフトは、探索部と評価関数という二つが車輪の両輪で、評価関数が同じということは、車輪の一つが同じパーツということです(笑)。あとは探索の差でしかない。

 しかし、その探索部は、Stockfishの探索部がすこぶる優秀だったので、結局、誰が一番早くStockfishの新しいバージョンを取り込んで自分のGitHubに公開するかという競争になりました。

 で、その競争が落ち着くと、その次は、いかに将棋に適した形に改良してNPS(探索速度)を上げるかの競争になったんです。評価関数はAperyのまま、探索部はStockfishのまま。そうなると探索速度で差をつけるしかありません。NPSが1番速ければ、たくさんの開発者がクローンを作ってくれて、改良していってくれるかと思って。

──オープンにする代わりに、みんなに使ってもらって強くしてもらうという戦略なわけですね。

磯崎:
 そうですね。やねうら王は、オープンソースの将棋ソフトの中で、デファクト・スタンダード(事実上の標準)になりたかったわけです。

 NPSが5%違うだけでレーティングは10~15くらい変わってくる。同じ評価関数を使ってもレーティングが上がるなら、みんなやねうら王を使うわけじゃないですか。

──確かに。ちょっとバグはあるけど強いソフトか、バグは無いけど弱いソフトかだったら、ほとんどの人は強いソフトを使いたがると思います。実際、プロ棋士もバグがあることを知りつつ、使い続けていたわけですから。

磯崎:
 そうですよね。だから昔から将棋ソフトというのは、安全面に対して危険方向に極限まで振り切って作ってるようなところがあって。これが勘定系のシステムだったらいまごろ大炎上していますよ(笑)。

──銀行で起きたしまったシステム障害のニュースを見ていると、よくわかります(笑)。どこまでチェックするかは、用途に合わせて変わってくるものなんですね。

磯崎:
 例えば、500円玉の代わりに韓国の500ウォン硬貨を加工した偽500円玉を自動販売機に使うという事件が1982年に多発しましたが、加工してなければまあ500ウォンが500円玉の代わりに使えることはないですよね。それくらいのチェックはしている。

 でも将棋ソフトでは、そういうチェックをするコスト(計算時間)が惜しいんです。NPSが低下しますからね。すなわち、500ウォンなんか入ってけーへんやろ、と思ってプログラムを書いているところがある。500ウォン入ってきたとしたら、そんなん入れる奴が悪いわ、と思ってプログラムを書いている節がある。NPSを追い求めるために。

──そうして、世の中の求めるものを作り続けていった結果、バグが出やすいものが残ったと。

磯崎:
 でも、このデファクト戦争というのは、2、3年くらい前に終わっちゃったんです。

──大会の決勝に残るソフトがみんな、やねうら王のクローンになるような状況が出現したと。

磯崎:
 はい。本来は独自に探索部のコードを書いて、新しい地平を切り拓ける人こそが残っていくべきだと私は思うのですが、そういう人たちが大会で予選落ちするのでどんどん将棋ソフト開発から離れていきました。

 最近のDeep Learningのブームまで残っていてくれたなら、もっと多様な将棋ソフトがある世界線もあったかと思うのですが……。


 様々な偶然が重なったことで、顕在化したバグ。
 杉村はイベント後にバグの検証を行った。

「あのバグを修正したあと、短時間の対局ではありますが、dlshogiと水匠を対局させて勝率を検証しました。結果は、ほぼ修正前と後で勝率は変わらなかったんです」

「だからdlshogiがバグを突く形で成長したというのは、おそらく……ないと思います」

 結果論ではあるが、長時間マッチを行ったことでバグの修正が行われ、水匠はさらに使いやすいソフトとなった。
 また、バグという衝撃の結末によって、『将棋ソフトに関心を持たない人々へのプロモーション』という長時間マッチ開催の目的にも資することになった。一歩引いた目で評価すれば、バグによる結末はプラスの面が大きいと言えるだろう。
 しかしこの結果に納得できない人物がいた

 第1局に勝利したdlshogiの開発者――山岡忠夫である

(第二譜につづく)

第一譜『水匠』杉村達也の挑戦
第二譜『dlshogi』山岡忠夫の信念
第三譜『GCT』加納邦彦の自信
第四譜『プロ棋士』阿部健治郎の未来予測

「将棋」の最新記事

新着ニュース一覧

アクセスランキング