第三回電王戦 こぼれ話


■ これ、あかんヤツや!


新ヒーロー登場 やねうら王さん「これ、あかんヤツや!」
D


私の喋った部分だけの動画がアップされていました。私がこの動画中で「これ、あかんヤツや!」と言っているのですが、これがいまニコニコ動画の将棋ファンの間で流行語になってるみたいです。


動画では私は寝不足と極度の疲労状態のため、ちょっと拙いしゃべり方になっていますが、話している内容はなかなか面白いですね。これなら、まあ合格点。普段はもう少し明晰なしゃべり方なんですよ?


ちなみに私は電王戦終わって布団に横になったら24時間ぐらい爆睡してしまいました。よっぽど疲れが蓄積していたんでしょうね…。


■ やねうら王、強いてゆうといて!


YSSとやねうら王の3位決定戦のあとのインタビューで、YSSの山下さんに私が「やねうら王、強いてゆうといて」と言うシーンがあります。


あれは、かつてプロ棋士の神吉先生と加藤一二三先生の対局で神吉先生が勝って、局後に神吉先生が「(いつもは負けているけど)ほら、私、強かったでしょ?強いってゆうといて」みたいな台詞があったと思うのですが、それを踏襲してのことです。


将棋ファンならわかるかと思ったのですが、いまひとつでした…。



■ 将棋における先手の利はどれほどか


トップソフトのコンピューター将棋同士の対戦において後手番の振り飛車の勝率が統計上極めて低いらしい。


本戦でponanzaはシードだったので、動作テストを兼ね、初期局面で長い時間思考させて放置していたらiterationが31か32まで回って(簡単に言うと32手先+αまで読めたという意味)、評価値が70になった。


評価値において歩の価値が100点(1歩損の場合、こちらの歩が無くなった損失 + 相手が歩を得た利得とで200点の差)であるから、歩の価値の7割ぐらいが初期局面における「先手の利」である、とponanzaは熟考の結果、主張するのだ。


せっかくなので遠山先生に「これプロ棋士的に見てどう思いますか?」とお尋ねしてみたところ、「プロ棋士の感覚に照らし合わせても、初期局面の先手の利が歩の価値の7割ぐらいというのは、感覚的なものと合致するし、大変興味深い」とのコメントを頂戴した。


将棋の弱いもの同士が対局しても先手の勝率がとりわけいいということはありえないが、コンピューター将棋は、もしかするとこの先手の利を拡大し、勝率に結びつけるところまで到達しようとしているのだろうか…。


関連記事)
将棋電王トーナメント終わる(遠山雄亮のファニースペース)
http://chama258.seesaa.net/article/379443260.html


音ゲーマーの集い@電王戦


本戦ではponanzaチームとやねうら王チームは隣同士だったのですが、ponanzaの山本君はDDR(音ゲー)のガチプレイヤーで、私はBM98の作者、BMSの考案者でもあるので音ゲーの話で盛り上がってました。


私「DDR、面白い?私3rdぐらいまでは全曲背面DP(ダブルプレー)でやってたけど、5thあたりからどんどんダンスから乖離して、踏みゲーになってしまったんでやってないんだけど。」
山本君「そうですね。ダンスではないですね。また、DDRはハイスコアを狙うなら基礎体力をつけるところからなのでそういうトレーニングをしてます。」
私「譜面とかズレてないの?ポップンとか昔、1曲が3つのパートにわかれて入力されてたので、曲の途中から1/60秒だけ音とズレる譜面とかあって苦労したんだけど。」
山本君「ああ、DDRではそういうのはないですね。3連符が1/60に合わせるため(注:クオンタイズのことを言ってるのだと思う)、ズレているところはありますが。」


そこに、観戦に来ていた山本君の友人がまた音ゲーマー(ポップン全国100位ぐらいの人)で、私はその人とポップンの話で盛り上がる。


私「ポップンは私、7ぐらいで、レベル42ぐらいの曲まではクリアできてたんですけど、もうそれ以上は私は譜面覚えないと無理っぽいのでこの譜面覚えるぐらいピアノで譜面覚えて弾くほうが楽しいやと思ってやってないんです。」
その人「そうですね。譜面を覚えるのはないですね。スコアを伸ばすためにどうせ最後はシャッフル入れますし。(注:オブジェが落ちてくるラインがランダムで入れ替わる)」
私「ああ、押しやすいところにオブジェが来る、ランダム運に賭けるわけですね。」
その人「全国大会でも、最後の曲などではスコアで負けている人は、一発逆転のチャンスに賭けるため、シャッフル入れます。」
私「ああ、なるほど。」
その人「でも以前の大会では、全一(全国一位の意味)の人も、何故かシャッフル入れて、それで優勝しちゃったんですけど。」
私「作戦的には損ですけど、全一の人特有の余裕ってものではないでしょうか。」


なんて話をしていたわけであるが、このとき、私は「あ、実力で負けているほうが一発逆転のために勝率を最大化するにはどうすればいいのか?」と考えるに至り、最終日のやねうら王の三倍頑張る作戦を敢行したのである。


■ 秒読み切れ負けのトラブル、後日談


何故、やねうら王で秒読み切れ負けが起きたのか、もう少し詳しいことを書いておきたい。
(技術的な内容を多数含むので、技術者以外は読み飛ばしてください。)


本大会では、やねうら王以外にも秒読みに入った途端、切れ負けになるソフトがあった。


秒は、CSAルールでは切り捨てで計測である。だから、10.99秒なら、切り捨てて10秒と計測される。
しかし秒読みルールというのが別途存在する。秒読み10秒なら10秒になればその時点でTIME UPとサーバーから返ってくる。すなわち、秒読み10秒という条件において、10.1秒まで思考してはならない。9.7秒ぐらいで返さないといけない。


「どうせやねうらおは、ルールをきちんと読んでなくて、10.9秒まで思考してそれでTIME UPになったんだろう」と某掲示板で言われているが、それは真実ではないし、そんな単純な話ではない。私はテスト対局時の設定は9.7秒で指し手を返すようにしてある。それでTIME UPになった。



だから、第一局目は9.0秒で返すように変更した。しかしそれでもタイムアップになった。(この秒未満のどのタイミングで返すかという設定項目に対する動作テストはほとんどしていないので、本当は9.0秒で返せていなかったのかも知れない)


「ちゃんと事前テストしとけよ」と言われるかも知れないが、ドワンゴ側で事前に用意されていたテストサーバーに常駐されていた思考エンジンは非常に棋力が弱く、秒読みに入る前にやねうら王が詰ませてしまうので、その部分の動作テストはどうやってもできない状態であった。いまにして思えば、やねうら王をわざと弱い設定にして(たとえば思考の深さを1にするだとか)、秒読みのテストをするという方法はあったし、そうすべきであった。


ともかく、そういう事情で事前テストは出来ていなかった。予選でのテスト対局で秒読みのところで切れ負けし、9.0秒で指すように変更したがそれでも予選の1局目では同様に切れ負けになった。


予選の2局目では、その設定をそれ以上短く変更することは不可能だったので、仕方なくソースコードを修正してコンパイルしなおし、サーバー側からUSIプロトコルにより受け取った秒読み時間から2000引くという風に突貫工事で対処した。すなわち、7.7秒で応答するようにした。こうやったところ秒読みに間に合うようになった。


YSSの山下さんは秒読み10秒の場合、9秒設定だと怖いので8秒目で返す設定にしていると言っていた。
ponanzaチームの下山さんに聞いたら、ponanzaは9.7秒(9.8だったかな…)で返していて、それで間に合っていると言っていた。下山さんいわく、「サーバーとのping応答は1ms未満だったのでネットワーク的な遅延ではないでしょう」とのこと。


その後、原因が判明したので他の開発者の参考になるかと思い、ここに書いておく。


やねうら王では時間をギリギリまで使うためにタイマー監視用のスレッドが時間を確認し、最善手を出力しているわけであるが、今回、ponder(相手の手番で相手の思考中にこちらが思考する)をONにしている。


ponanzaはUSIプロトコルのponderを使う設計になっているようで、これは、「相手の指し手はこれだろう」とbestmoveを返すときに表明しておくことにより、改めて相手がその指し手を指したときの局面が将棋所のほうから送られてくるというものである。つまり、ponanzaがbestmove応答し思考はいったん停止。→サーバーへ返答→将棋所からponder用の局面が送られてきてgo ponder→ponanzaが思考を再開という流れになっている。サーバーへ返答しているときは思考用スレッドは一時停止している。


ところが、USIプロトコルのponderの設計はあまりよろしくなく*1、また、相手の指し手を1手と予想してその1手に対してしか思考できず、あまりいい仕様ではないのでponder機能を使わずに勝手に先読みすべきという考え方がある。(主流かどうかはそれぞれの開発者に意見を聞いたことがないので私は知らないが…)


そこで、ponderを使わずにbestmoveを返したあともそのまま思考は継続する設計にしていたわけだが、そうしたときに、思考スレッドが継続して思考しており、CPU負荷が100%になっているので、bestmove報告用のスレッドおよび将棋所の通信用スレッドがCPU負荷により身動き取れない状態で、出力が遅延するという状況になるようだ。


このへん、私はWindows Server 2012で開発テストしていたが、大会用マシンのOSがWindows 7だったので、もしかしたらこのあたりのスレッドスケジューリングが違うという問題も関係しているのかも知れない。


いずれにしても、独自に先読みする場合、将棋所がサーバー側にbestmoveを返しきるまで(0.3秒ぐらいの間)、思考エンジン用のスレッドを一旦停止させておく必要がある。(セコい話しをすれば、停止させるのは1スレッドだけでいいように思う。1コアでも余っていれば問題はないと思われる。ゆえに、局面を他のサブスレッドにも思考させるためにsplitするときに、最後の1スレッドには割り当てないというような実装はアリだろう。)


将棋所がどのタイミングでサーバー側に応答を返したのかが思考エンジン側からわからないので、そこでponderの仕様を使い、bestmoveを返すときにponder用の指し手も返し、将棋所からgo ponderをしてもらう。このgo ponderが来たタイミングならば将棋所はサーバーにbestmoveを通知済みのはずであるから、このタイミングをもって、(送られてきたponder用の局面図は無視して)思考を再開させるというような実装はアリなのかも知れない。


いずれにしても、コンピューター将棋の大会で秒読み設定があるのは初めてであるが、このような問題があるので、USIプロトコルのponder機能を使わないという選択肢は結構リスキーである。腕に自信のある開発者以外、やるべきではないのかも知れない。


また同時に、電王戦に限らず、コンピューター将棋の大会すべての主催者側への要望であるが、秒読みがあるとこのような無用のトラブルを招くソフトがあるということで、もし可能であれば次回からは秒読みは無しルールにしたほうが良いのではないかと思う。(このへん、よくわからない。他の開発者にもアンケートをとってもらった上で決めて欲しい。)