2021年2月、ついに最強羽生将棋RTAで20分切りを達成しました。
最強羽生将棋のSpeedrunをはじめてから10年、20分切りを掲げてから8年目のことです。
8年前、当時まだ自己ベストが70分14秒だった私にとって、20分切りができるという確証があったわけではありません。正直にいってしまうと、根拠すらありませんでした。
内心では30分切りが関の山ではないかと思っていた時期もありました。
しかし、いざ20分を切ってみると、ここが限界だとはとてもじゃないですが思えません。
現時点で解決しなければならない技術的な課題はたくさんあります。
この記事では、最強羽生将棋RTAで現状使われている手法や技術と、その課題について説明します。
目次を見てご興味があるところだけかいつまんで読んでも大丈夫なように書いているつもりなので、ガンガン飛ばしていただいて大丈夫です。
手動チャート構築
これまでの最強羽生将棋RTAにおいて、私の作業時間の殆どは実際のプレイや操作練習よりもチャート構築に費やされました。
チャート構築は、手動でのチャート構築とツールを用いた自動チャート構築の両方が使われています。
ここでは、手動チャート構築の現状と今後について説明します。
現状
最強羽生将棋のチャート構築を行う上で、現時点での手法や考え方を説明します。
手順の事前構築
最強羽生将棋のRTAでは、リアルタイムに指し手を考えることは原則なく、各対局相手について事前に練り上げた手順をぶつけます。
最強羽生将棋にも乱数は存在します。原因は特定できていませんが、電源投入から完全に無操作を貫いたとしても乱数は固定できません。よって、乱数調整は不可能です。
とはいえ、乱数による指し手の分岐は近代の多くの将棋ゲームと比べれば少なく、分岐を全て網羅して覚えることも現実的に可能です。
更にいうと、RTA in Japan 3に参加した際のチャートでは、指し手が乱数で分岐する局面が一切含まれていませんでした。*1そんなチャートを組み上げられることがあるほど、このRTAでは乱数要素は少ないのです。
こうした事情から、最強羽生将棋RTAでは事前のチャート構築が重要になってくるのです。
手数と消費時間
チャート構築では、手数を縮めればいいというものではありません。
最強羽生将棋では、局面ごとに思考時間が大きく異なります。普通に対局する場合でも、最初の方の対局相手の思考時間はほとんど無視できますが、最後の方の対局相手は平均で1局あたり20分〜30分程度思考します。
一方、読み上げをオフにすれば、相手の思考時間がゼロであれば2手*2あたり2〜5秒程度です。
よって、コンピュータの思考時間を削ることが重要になります。
コンピュータの思考時間を正確に予想する手段は今の所ありません。
また、終盤でこちらの勝ちがほぼ確定した局面でも、コンピュータは負けが読みきれず長考を始めることがあります。
短時間で序盤を抜けられたとしても終盤の長考で台無しということは多く、実際に最後まで対局を進めてみないことには速いかどうかはわかりません。
とはいえ、全く指針がないというわけではありません。
例えば、終盤の長考については、複雑な局面だとコンピュータが判断しているからこそ思考時間が長くなっています。
一見有効な手をちらつかせることで、「わかりやすい局面」だと思わせて思考をすぐに打ち切らせてしまうという戦略が考えられます。
例えば、RTAの金沢戦のチャートでは、露骨に銀の打ち場所を作ることで相手の思考時間を短縮しています。
この手はニコニコ動画にアップロードした動画に頂いたコメントから着想を得ました。
また、短い必至よりもやや長い即詰みに打ち取るほうがいいことがあります。
コンピュータ将棋は人間のような「自玉が必至だから相手を詰まさなければ負け」というような条件付けをした思考が苦手です。
そうなると、負けを読み切るためには、必至だと王手や関係のない駒の移動などの様々いろんなパターンを虱潰しに探索しないといけなくなります。
それよりは、長かったり人間にとっては多少複雑な詰みのほうが、受け方が読む指し手が王手に対する対応だけになるという点で、コンピュータにとっては簡単なことがあります。
序盤については、定跡範囲であれば思考時間はゼロですし、定跡を抜けたとしてもある程度定跡形に近ければ思考時間が少ない傾向にあります。
初期の最強羽生将棋RTAではこの特徴を利用するために、ガチガチの相矢倉を採用していました。
その他、コンピュータの細かい癖を攻略の取っ掛かりにすることもあります。玉の位置として2二、8二、2八、8八を好む、相居飛車なら6二、4八銀を早めに決めるなどの特徴がわかっていれば、速攻を仕掛けやすくなります。
こういったコンピュータの癖の研究にあたっては、実際にさして見るほかにも、書籍や論文等を読み漁りました。「コンピュータ将棋の進歩3」に掲載されている最強羽生将棋の思考エンジン開発者である金沢氏ご本人による記事が大いに参考になりました。
今後
手動でのチャート構築について、まずは自分の将棋とAIへの理解を深めていくことが重要だと考えています。
少なくとも、現時点では永沢戦のチャートの出典は攻略本であるため、私のチャート構築能力はまだまだなのだと思います。指導棋士の小田切秀人先生がかなりの検証を重ねて書かれた本なので、私に超えられるのかはわかりませんが。
また、最強羽生将棋RTAでは、才能あふれる新規プレイヤーの方々が参戦を表明してくださっています。
うち一人にはとりあえず将棋の入門書とかをやたら送っておいたので、おそらく彼が最強羽生将棋の新たな地平を切り開いてくださると思います。
すでに新規プレイヤーのうち一人が検証にご協力くださった結果、最強羽生将棋のAIの挙動に新たな発見がありました。なんと、一部の門下生についてはBGMのオン・オフによってコンピュータの指し手が変わるのです。
これについても検証が必要です。ただし、現時点ではBGMをオンにすると思考時間が伸びがちなこと、必要な対局のみBGMをオンにするというアプローチではBGMのオン・オフの切り替え時間が無視できないことなどから更新に寄与する可能性は低いと考えています。
自動チャート構築
最強羽生将棋TAS/RTAでの手順構築は人力のみではなく、自作のツールによる100万局以上の試行によって精度を高めています。
現状
現状のツールの大まかな仕組みついて説明します。
ツールの構成
最強羽生将棋TAS/RTAチャート自動生成ツールを構成するモジュールは、主に最強羽生将棋の代替思考部と最短手数を割り出すソルバーがあります。
ソルバーは最強羽生将棋の代替思考部との対局を何度も行い、最短のパターンを割り出します。
最強羽生将棋の代替思考部とはなにか
最強羽生将棋の最短のパターンを割り出すには、当然最強羽生将棋を相手に試行する必要があります。
NINTENDO64実機で動作する最強羽生将棋をコンピュータから直接操作することは難しいですし、できたとしても時間がかかりすぎます。
そこで私が考えたのが、最強羽生将棋と指し手がよく似た思考部を入手し、それを最強羽生将棋の思考部の代替とする手法です。
具体的には、最強羽生将棋と近い思考エンジンを持つ金沢将棋'96と、それを操作したり最強羽生将棋との指し手の差を埋めたりするラッパーによってこれを実現しています。
これを実現するまでに、最強羽生将棋の思考エンジン開発者である金沢伸一郎氏が開発に関わっている将棋ソフトを20作品以上買いました。普通にいい作品がいっぱいあるのでみなさんも買ってください。おすすめは金沢将棋レベル300(Android/iOS/Windows/Switch/PS4)やみんなの将棋教室シリーズ(iOS/Android/Windows)です。*3
チャート自動生成のアルゴリズム
チャートの自動生成アルゴリズムは、かなりシンプルなものになっています。
総当りで解けるほどパターンは少なくないので、乱択アルゴリズムを採用しています。
大まかな処理の流れは以下のとおりです。
1.初期局面もしくは指定局面から代替思考部を相手に対局を繰り返し、有望な指し手を洗い出す
2.1で洗い出した有望な指し手を対局に使う定跡として登録し、1に戻る
1でのポイントは、主に以下の二点です。
1.対局時の指し手をどのように選択するか
2.有望な指し手をどのように定義するか
1の対局時の指し手ですが、様々なパターンを試さなければならないため、大きなランダム性がほしいところです。
とはいえ、あまりにデタラメな手ばかり指していては、実用的なチャートが見つかるまでにかかる時間が非現実的なものになってしまいます。
そこで、本将棋においてあまりに的外れな指し手は、最強羽生将棋RTAにおいてもあまり有効ではないと仮定します。*4
ここで本将棋におけるあまりに的外れな指し手を除外するため、一般的な本将棋用AIをUSIプロトコル*5で操作して使用しています。*6
具体的には、MultiPV*7を多く設定し、最善手からの評価値が一定以内の指し手を候補としています。*8
また、たまに評価関数や探索を入れ替えることでもランダム性を持たせています。
不思議なのは、最新の強力なエンジンや評価関数よりも、大樹の枝(2015)や技巧2(2017)のほうが多くの優秀な手順を排出していることです。まだ統計的に有意とはいえないので偶然かもしれませんが。
以前は短時間での終盤力の強化のために独自に枝刈り等を調整したり、自前実装の詰将棋ルーチンを研究したりしていましたが、あまり効果がなさそうだったので現在では一般的な探索部と評価関数を使わせていただいています。
2の有望な指し手については、その指し手の先で確認されている変化の最短時間あるいは手数が閾値以下のものを採用しています。*9
あくまで最短の時間あるいは手数のみを見ており、短めの手順が多く含まれているということはみていません。
今後
お察しの通りこのツールには課題だらけです。今後は課題解決に向けて尽力する必要があります。
指し手の再現性の向上
代替思考部は別バージョンの思考エンジンをベースにしていますが、当然オリジナルの最強羽生将棋とは指し手に差異があります。
特に駒落ち、早指しでは最強羽生将棋との指し手の乖離が顕著で、これらの条件での対局では一切実用化できていません。
また、通常の平手対局においても、この代替思考部を使っている限りは出力データを十分に信用することができません。
この代替思考部にかなりの時間をかけたのでお別れしたくはないのですが、流石に限界がきています。
代替案として、TAS制作やコンシューマゲーム用のAIの経験が豊富な方なら、エミュレータを使うという発想が浮かぶと思います。
実際、一番現実的なのはこの案です。
この10年間でN64のエミュレータの性能は非常に向上し、正確なグラフィックやサイクルタイミングの再現が不要であるならば、極めて高速に動作するようになっています。
また、10年前と比べればPC自体も性能が上がり、私がチャート生成に使っているPCもツールの運用開始当初と比べれば2.5倍近い速度で棋譜を生成できるようになっています。
更に、最強羽生将棋はAIを高速化するために、対局中はAIの思考以外の処理を極力なくしています。AIによる思考中のフレームレートはなんと常識はずれの1fps(!)なので、フレーム単位の同期が処理速度に与える影響すらもほとんどありません。
これらの条件が重なり、現代であればエミュレータでも十分なパフォーマンスが得られると考えられます。
しかし、エミュレータも完璧ではありません。
実は現時点でN64のエミュレータに最強羽生将棋の指し手を完全に再現できるものは存在していません。
というのも、最強羽生将棋は先ほど説明したとおり、AIの思考中は思考にフルパワーを割くことを徹底しています。
そのため、同期は最小限に抑えられているようで、わずかでもサイクルタイミングがずれれば指し手は変化してしまうのです。
最強羽生将棋ではBGMのオン・オフで指し手が変わることがありますが、それもこれが原因と考えられています。
また、もしも今後最強羽生将棋の指し手を完全に再現できるエミュレータが誕生したとしても、実行速度の問題が生じます。
64実機のサイクルタイミングを正確に再現しようとすると、高度な同期が必要となり、パフォーマンスがガタ落ちしてしまうのです。
とはいえ、現行の代替思考部よりはエミュレータのほうが指し手の再現度はなんぼかマシ(特に駒落ちは顕著に改善する)なので、エミュレータへの移行は有効です。
他にもいくつかのアプローチは考えているのですが、どこまで話していいものかがよくわからない(主に開発側への迷惑を避ける意味で)ので、とりあえずこれだけにしておきます。
アルゴリズムの効率化
最強羽生将棋TAS/RTAチャート自動生成ツールのアルゴリズムは先に説明したとおり非常にシンプルですが、このシンプルなアルゴリズムを採用するのに十分な検証がなされたわけではありません。(もちろん多少は検証しているのですが。)
というのも、まず代替思考部の再現度が十分に高くなければ、いくらアルゴリズムが高性能でも宝の持ち腐れだからです。
そこで、先述の代替思考部の精度向上に伴い、より本格的にアルゴリズムを改善していく必要がでてくると考えています。
ただし、現行のアルゴリズムでもまともに使えるレベルのチャートは数万局に一局程度しか出力されません。
まずはアルゴリズムの性能評価の方法を考えるところからはじめなければなりません。
操作
当たり前ですが、RTAにおいていいタイムを出すには操作が重要になります。
特に最強羽生将棋では相手の指し手をかなりの精度で固定化できますので、カーソル移動などの操作精度が特に重要になります。
最強羽生将棋RTAの操作、といってもプレイヤーによってだいぶプレイスタイルに差がありますので、ここでは20分切りを達成した私の現状と今後の課題を説明します。
現状
正直に言って私はチャート構築に力を注いできたため、操作精度は完成には程遠いものです。
そんな中でも一応意識していることなどを説明します。
カーソル移動の基本戦略
カーソル移動のポイントは、短距離移動と長距離移動で異なると思っています。
短距離の場合は、入力可能になってからいかに早く操作を始められるか。
長距離の場合は、カーソルをいかに制御するかです。
まず短距離の場合です。
入力可能になるタイミングは、相手の駒の移動アニメーションの終了時です。このアニメーションの時間は駒の移動距離によって異なるので、開始ではなく終了のタイミングを目安にする必要があります。私は駒音を基準にタイミングをはかっています。
次に長距離の場合です。
最強羽生将棋のカーソルは、スティックや十字キーを入力しっぱなしにしていると、入力してすぐに1マス動いたあと、少し間をおいてからその方向に最速で移動をはじめます。
相手の思考時間中にずっと特定の方向に入力しておくと、操作可能になったらすぐにカーソルが最速で移動するようになります。
つまり、こちらが操作可能になってから駒のところまでカーソルを移動させたい場合、入力しっぱなしが最速です。
この最速移動状態は上下左右それぞれの方向に対して発生するので、下に最速移動しながら左を一回だけ入力して真下より1マス左に移動ということも可能です。
一方、駒を掴む際にカーソルを方向転換する必要がある場合には話は複雑です。
方向転換の際にカーソルを一度止めなければならない以上、次に移動する方向を指定してからカーソルが動き出すまでに若干のタイムラグが生じます。
他にも、カーソルの最速移動中に駒を掴むには、正確なタイミングで目押しをする必要があり、かなりシビアです。
私は現状このあたりをかなり妥協しています。
コントローラーの持ち方
NINTENDO 64のコントローラには、大きく3種類の持ち方があります。
・左手でスティック、右手でボタンを操作するライトポジション
・左手で十字キー、右手でボタンを操作するファミコンポジション
・左手で十字キー、右手でスティックを操作するレフトポジション
私はライトポジション主体で局所的にファミコンポジションを使うスタイルですが、最速と言われるのはレフトポジションです。
このゲームのカーソル移動はスティック、十字キーの両方で行うことができ、同時入力は2回入力として処理されます。
そのため、目的地までのカーソルの最速移動は、どちらか片方だけで行うよりもかなり容易になります。
また、レフトポジションでは、Aボタンの代わりはZトリガーボタンが担います。
Zトリガーボタンを連打するのは難しいですが、成るなどのダイアログを最速で閉じられるくらいの速度での連打は実現不可能ではありません。
とはいえ、スティックと十字キーの同時操作は容易ではありません。特に、スティックを左手ではなく右手で操作することになるので、これだけでも通常の操作とは大きく異なります。
今後
今まで妥協していた部分を捨てて、徹底的に攻めれば速くなると思います。
とはいえ、それに着手するのは、まだもうしばらくチャートの研究をしてからかなとも思っています。
おわりに
最強羽生将棋RTAには
・将棋の知識
・プログラミングの知識
・正確なカーソル操作
という3つの要素があります。
この記事を読んでどれか一つにでもご興味を持っていただけたなら、最強羽生将棋Discordサーバーに参加していただけると嬉しいです。
もちろん、Discordをやっていない方もご連絡いただければ喜んで情報連携いたしますので、お気軽にお申し付けください。
*1:安定を狙ったわけではなく、偶然イベントの時に最速だったチャートに乱数が影響しなかったのです。
*2:こちらの指し手が1手、コンピュータの指し手が1手の1セットとしての2手
*3:もっと上を目指す人のための将棋やみんなの詰将棋などもおすすめです。できれば新品で買える現行作品を買ってほしいところですが、旧作だと金沢将棋'98なんかも独特な棋風で指していて楽しいですよ。
*4:数理的な裏付け等は一切ありません。勘と経験則です。
*5:将棋の思考エンジンとGUIがやり取りするための一般的なプロトコル
*6:以前はAperyにがっつりに依存していましたが、探索の計算コストと比べるとUSIでのやりとりのコストはほとんど無視できるため、現在では一般的なUSIによるやり取りに変更しています。
*7:候補手の数
*8:具体的にはMultiPV=16,最善手からの評価値の差の最大値=1200くらいで運用しています。
*9:対象とする思考エンジンのレベルが高ければ時間、低ければ手数を見ています。