竜王戦第四局 妙手△6六飛

竜王戦第四局

竜王戦第四局は挑戦者である羽生善治棋聖が勝って三勝一敗とし、竜王戦七番勝負に王手をかけた。

中盤で渡辺明竜王の疑問手からリードを広げ、押し切った格好だがソフトを使った検討の結果とても興味深い点があったので紹介する。

局面は先手が7七歩と打って飛車当たりをかけた手に対して飛車をどこに逃げるかという場面。

後ろに引いていては馬に飛車がイジメられてはっきりとダメなので横に逃げる一手なのだが、有力な選択肢としては、

  1. 6五飛 飛車成が約束された手で、大盤解説でも第一感として推奨されていた手。
  2. 3六飛 角を狙う銀と飛車成を同時に狙った手。第二候補として挙げられていた手。
後手の持駒:金二 歩
  9 8 7 6 5 4 3 2 1
+---------------------------+
| ・ 馬 ・ ・ ・v玉 ・v桂v香|一
| ・ ・ ・v銀v金 ・v金 ・ ・|二
|v歩 ・ ・ ・ ・ ・v銀v歩v歩|三
| ・ ・ ・ ・v歩 ・v角 ・ ・|四
| ・v歩 ・ 桂 歩v歩 銀 ・ ・|五
| ・ ・ ・v飛 ・ ・ ・ ・ ・|六
| 歩 歩 歩 ・ ・ 歩 ・ ・ 歩|七
| ・ ・ 玉 ・ ・ ・ ・ 飛 ・|八
| 香 ・ ・ ・ ・ ・ ・ 桂 香|九
+---------------------------+
先手の持駒:銀 桂 香 歩五
手数=76 ▲6六飛 まで

どちらにしてもこの場面は、解説の深浦九段も木村九段も「さっきまではもっと後手が明快に良かったはずだが、この場面はさっきより先手が良くなったのでは?」という見解だった。

というのも、後手には候補が上述の二手くらいしか指す手がないからだ。

先手には角をとって2三銀成から2筋突破して8筋との馬との挟撃を狙う手もあるし、3四銀に対して同銀とした場合に4四香打や4四桂打といった楽しみがある。

後手は持ち駒が金と歩しかなく有効な攻めがなさそうなので正確に攻めきるのは難しいのではないかと予想されていた。

ソフトが見逃した△6六飛

それはソフトも同様の見解を示しており、7七歩までは-1300以上もあった評価値が6六飛で一気に300以上も下落して-943となった。

この解析は30億ノード読ませても変わらなかったので、ソフト的にはかなり洗練された分析結果だったはずだ。

以後はソフトの支持する最善手通り(10億ノード以上読ませている)進み、▲6七銀打(-907) △8八金打(-764) ▲6八玉(-762) △6五飛(-547) ▲3四銀(-671)となる。

着手のかっこ内は先手からみた評価値。

△8八金打は一見すると見えにくい手で、これには解説の深浦九段も唸ったがソフト的にはこれが最善手のようだ。

本記事では8八金打が如何にすごい手かということは考えていない(もちろんこれもすごい手である)。

8八金打はソフトがちゃんと検討に入れている手であり、検討に入れた(局面を読んだ)上で後手評価値943という数字を導き出したということだ。

ところがソフトは▲3四銀に対して△同銀を予想していたが、羽生棋聖が指した手は銀当たりを無視した△6六歩打!!

ここで突然評価値が-2934まで跳ね上がる。

これはおかしなことで、もしも△6六歩がそんなに良い手であれば、▲3四銀と角をとっている暇はないはずで(むしろこの角は質駒な(いつでもとれる)ので、わざわざこの場面で取らなくても良い)、△6六歩を受ける手を推奨しなければいけなかったはずだ。

そしてもし仮に△6六歩が受けられない手であれば、3四銀と指した局面で評価値はもっと後手に振れていなければならない。

つまり、これは一手先の△6六歩打からの攻めが読み抜けていたということに他ならない。

何故△6六歩打を見逃したか?

単純に考えられるのは検討の深さやノード数が足りなかった場合である。

棋譜解析では1手10億ノードで読ませていたが、この順で読みぬけの可能性があったためノード数を30億ノードにまで増やして再度この場面を検討させてみた。

その結果、解析結果に▲3四銀からの手抜きの△6六歩打を初めてでてきたのは11億ノード読ませた段階だった。

それまでは△同銀に対して▲6六歩打とする手しか考えていなかったようだ。

* 時間 06:31.3 深さ 26/50 ノード数 1197683340 評価値 -915↓
読み筋 ▲3四銀(35) △6六歩打 ▲5六銀(67) △3六桂打 ▲3八飛(28) △3四銀(33) ▲4四香打 △4三銀(34) ▲6五銀(56) △4八銀打 ▲同 飛(38) △同 桂成(36) ▲4三香(44) △同 金(32) ▲5七玉(68) △6八飛打 ▲6一飛打 △5一金(52) ▲7四角打 △5二香打 ▲5三桂打 △同 金(43)
この段階でも△6六歩打は読んではいるものの評価値-915程度に留まると考えており、-2934という後手必勝の形になるとまでは読めていない。
* 時間 16:27.0 深さ 27/57 ノード数 3000034226 評価値 -1002
読み筋 ▲9二馬(81) △6四歩打 ▲3四銀(35) △5六桂打 ▲5七玉(68) △3四銀(33) ▲6六銀(67) △6八銀打 ▲6七玉(57)
最終的に16分半思考させて30億ノード読ませた結果は▲9二馬が最善であるということだった。これは棋譜中継でも言われていた候補手である。

ソフトは▲9二馬という手を推奨した。30億ノードで▲3四銀は敗着だと見抜けたか?

ソフトが最終的に▲9二馬を選択したのには以下のどちらかの理由が考えられる。

条件:17億ノード読ませたあたりで▲3四銀には-1100くらいの評価を下していた

  1. 読み続けた結果▲3四銀が評価値-3000となる悪手ということがわかったため、この手を放棄した。
  2. 単純に▲3四銀よりも▲9二馬の方が先手からみた評価値が高かった。

これを確かめるにはソフト上で実際に▲3四銀を指してみて、深く読ませれば良い。

* 時間 16:41.5 深さ 29/52 ノード数 3000040840 評価値 -803
読み筋 △同 銀(33) ▲6六歩打 △3六桂打 ▲3八飛(28) △3七歩打 ▲同 桂(29) △4八銀打 ▲6九桂打 △6四飛(65)
実際に読ませてみたが、やはり△が同銀と取る手が最善だと見なしており、手抜いて△6六歩打とする手を見逃している。
結論としても30億ノード読ませてもソフトは△6六歩打を見抜けず、見抜けなかったからこそ△6六飛を疑問手扱いしたということになる。
ちなみに△6六歩打は30億ノード読ませても評価が変わらなかった。
* 時間 15:52.5 深さ 24/51 ノード数 3000057755 評価値 -2575
読み筋 ▲5六銀(67) △3六桂打 ▲3八飛(28)

何故このような突然の評価値の変動が起こったか?

これは単純に現在の局面評価をするコンピュータのアルゴリズムの問題にある、ということになる。

ここで、仮にソフトが30手先まで読めるとし、現在の局面をN手目とする。

するとN手目の現局面で手番であるソフトAはN+30手目までにどのような変化があるかを解析し始める。

将棋には(王手がかかっていなければ)おおよそ1つの局面あたりで80手ほどの合法手があるので、30手先を読むとなると80^30のノード数が必要となる。

これは1.237*10^57通りにも達するのでとても全ての手を読むことはできない。

アルゴリズム(コンピュータハードウェアとして)の限界

もちろんこの中には意味のない駒を捨てる手などの無意味な手が多いので、明らかにおかしいと思われる手に対しては早々に探索を打ち切るようなプログラム(アルゴリズム)が使われている。これをアルファ・ベータ法という。

全ての手を読めば読み抜けは起こらないのだが、それは世界中のコンピュータを一斉に動かしてもとても解析できる複雑さではないので、現実的ではない。

結局のところ、全ての手を読もうとしてしまうと全く深いところ(先の局面)まで読めなくなるので、(その局面までの)評価は正しいが、その先までは読めていなので信頼ができない評価値ということになってしまう。

実際にソフトのコードを読んだわけではないので、確実なことは言えないのだが△6六歩打を軽視した理由の1つとしてアルゴリズム的な限界は考えられる。

評価関数の限界

現在のコンピュータ将棋は盤上の三つの駒の関係性から局面の評価値を求めている。

これは玉の位置(King)とその他の自軍の駒(Piece)x2から求めているのだが、それらの先頭の文字をとってKPP評価関数と呼ばれている。

実際にはこれに手番も含めたKPPTという評価関数が主流のようで、以後更に駒を増やした四駒関係KPPPやKPPPTに以降するものと思われる。

ただ、駒を1つ増やすと複雑さが一気に膨れ上がるので、これはこれですぐに評価関数のスタンダードが変わるということはないかもしれない。

どうしてKPPPがすぐに現れそうにないかは別記事で書くことにする。

それに比べればKKPPは相手の玉の位置を追加するだけなので、最大でもKKPの80倍くらいあれば済む。

もちろんそれでもだいぶ負荷がかかるけれど…

実際にKKPPの4駒関係の評価関数は作れないことがないけれども、局面を計算するのに時間がかかるようになってしまい、KKPP評価関数にKPP評価関数以上の評価精度がないと逆に弱くなってしまう可能性がある。
話を戻すと、30手先まで読めるソフトAが自分の手番の局面でN+30手目を読んだ局面の評価と、Aと全く同じソフトBが相手の手番であるN手目から30手先を読んだN+30手目の局面の評価にならないことが原因と思われる。これは評価関数に手番が組み込まれていることからそうなっている気がするのだが、間違っていたらご指摘ください(コンピュータ将棋に精通している方お願いします)。

結論

以上の理由(他にはもっとあるのだが)から、コンピュータの読み抜けを防ぐことはできない。


限りなくその可能性を少なくするならば評価関数をより洗練するか、アルゴリズムをより良くするしかない。実は一時期コンピュータ将棋のAIを作ろうとしたの

だが、挫折した経験がある。

暇ならまたやりたいのだが(笑)

以上。