コンピューター将棋の定跡をデザインする


電王戦に向けていまやねうら王に定跡を搭載するための作業をしている。


本電王戦はソフトを事前貸出をしてソフトの穴を探すためにプロ棋士側が研究するという、非生産的な行為にプロ棋士の多くの時間が消費される。電王戦は全くの茶番劇である。


このようなプロ棋士側の非生産的な行為をなんとか生産的な行為に変換できないものかと考えて誕生したのが、やねうらおもてなし定跡である。「やねうらお」を「もてなし」する定跡ではなく、「やねうら」「おもてなし」定跡であり、「田村ゆかり、さんじゅうななさい」ではなく「田村ゆかりさん、じゅうななさい」なのである。(なんのこっちゃ)


早い話、多少不利になるような変化であれ、プロの実戦に出てくるような形をたくさん入れて、せめて事前研究のときに将棋を少しでも楽しんでもらおうと思ったわけですよ。ところが、これがとてつもなく面倒なんすよ。


まず定跡をどうやって自動で生成しますか?


1) プロの棋譜から32手目ぐらいまでを定跡として登録する手法


これは去年の電王トーナメントでAperyがやって、富岡流の必敗局面に自ら突っ込んだ。


2) 1)の手法+出現頻度をカウントして出現頻度の低い定跡は採用しない


これはBonanza6がやっている。narrow book(狭い定跡?)にしたときは、出現頻度の低い定跡は使われない。ただ、それでも必敗と結論付けられているような不利な変化に自ら飛び込むことは避けられない。事前貸出がなければこれでも現実的には十分だが、事前貸出ありの状況ではこれが避けられない。


3) 1)の手法 + 出現頻度に比例した確率でランダムに指し手を選ぶ


Stockfishはこうなっている。悪くないアイデアではあるが、低確率で不利な定跡に突っ込むことには違いないし、序盤でわざと定跡を外して、そのあとに不利な変化に行くような定跡に合流されると困る。


また、「おもてなし」の心でありたいので、narrow bookにしたくないというのもある。広い定跡を搭載したい。しかしそうすると3手目で角をタダ取りされるように変化も(プロ棋士の実戦にあるので)、やってしまいかねない。一つ一つの定跡を目でチェックすればいいのだが、「おもてなし」なので1万通りぐらいの定跡を搭載したいわけで、その全部を目視でチェックすることは棋力の問題もあって私には不可能だ。


4) 1)の手法 + 探索して評価値を見る


そこで習甦の方法。定跡の指し手で進めた局面をdepth=12で探索させてみて、マイナスが大きな指し手ならばbook(定跡DB)に登録しない。一見、うまくいきそうではあるが、やねうら王でやったとき、先手76歩に対して後手の初手は次の通りであった。


・42玉(棒銀の餌食にならないか?)
・72銀(鈴木英春さんか?)
・94歩(また挑発だと言われるぞ?)
・74歩(いつぞやのツツカナか?)
・32金(振り飛車にされて作戦負け模様)
・54歩、32飛、42飛、52飛(悪くはないんだろうけど…)
・34歩(普通)
・84歩(普通)


と、34歩・84歩以外の手が糞すぎて困る。当確率に定跡DBの指し手を選ぶとしたら、後手の初手で糞みたいな手を引く確率が高すぎる。後手の初手なので、一番いい指し手で -70 程度。一番悪い指し手で -150程度。そんなわけで、-200 以下の指し手は定跡DBに登録しないという仕様で定跡を生成していたのだが、上記の指し手がごっそり定跡DBに登録されてしまっていた。


後手の初手ぐらい、人間の目で見て排除すれば良いのだが、しかし初手でこのような問題が発生する以上、手法自体に欠陥があるのではないかと私は考えた。


5) 4)の手法 + 最善手との評価値の差が一定以内である


そこで、せっかく探索しているので最善手の評価値との差(evaldiff)が一定以内であるという条件を追加した。


定跡DBのbestの指し手のみを選びたいときはこれを0にする。
narrow bookにしたいときはこれを30ぐらいにする。
幅広い定跡を選択したいときはこれを50ぐらいにする。


これだけだと徐々に悪くなっていく定跡を選んでしまいかねないが、評価値が -200 以下の指し手は採用しないというルールを加えることにした。


しかし、これだと
・narrow bookにしても先手76歩に対する後手の初手32金、62銀や42玉が選ばれることがある。
・後手パックマン戦法を選んでしまう。(44歩と突いて、歩をタダ取りされる戦法) 44同角のあと後手、定跡DBから外れて乱戦にせずに62玉。プロ相手にこれでは勝てませんわ…。
のような指し手が選ばれてしまう。


6) 5)の手法 + もっと探索!(depth = 18)


結局、探索深さが足りないという結論に至った。そこでdepth = 18で32手目まで探索させてみた。あまりにも時間がかかるので並列化した。正確には、探索するときにどのdepthで探索したかをDBに記録しておき、定跡DBをマージ(合併)するコマンドを追加した。マージは、このdepthを比較して、その指し手でより深いdepthで探索した評価値が記録されていれば、その情報を優先するようにした。


これでも後手の初手の問題は改善しなかった。また、「評価値-200以下の指し手は記録しない」というルールにしていると、


a) 62玉 depth = 12で探索 評価値 -100なので記録
b) 42玉 depth = 12で探索 評価値 -180なので記録
c) 62玉 depth = 18で探索 評価値 -1000 なので記録しない
d) 42玉 depth = 18で探索 評価値 -180なので記録


のようにc)の指し手が記録されない。c)の指し手は、a)の指し手と同じだが、深くまで読むと悪くなるということがわかったわけであるが、このc)が記録されない。b)よりはd)が探索深さが深いのでb)がd)で上書きされ、結果、a)とd)だけがDB上に残る。そうするとa) = c)は悪手なのに、この定跡DB上ではa)とd)が残っているから評価値の -100 と -180と比較してa)のほうが大きい(narrow bookで許容する評価値の差は30以内!)のでa)が採用される。これは間違った定跡である。


このように考えると「評価値-200以下の指し手は記録しない」というルールは間違っていることがわかる。DB上に記録自体はよほどのことがない限りはしておくべきなのだ。


7) 6)の手法 + もっともっと探索!(depth = 24)


depth = 24で1スレッドだと1手の思考に数秒要する。これをプロ棋士棋譜4万数千局に対して32手目までやるとなると…えーっと..


いま、ドワンゴに貸してもらってるガレリアPC(今回の電王戦出場ソフトの開発者は全員申し出をすれば1ヶ月ほど借りらる)と自分のPC 4台とでこれをぶん回しているんだけど、大丈夫かな…。(俺の家の電気代が)



しかし、残念なことにこれでも後手初手62銀は選ばれてしまう。おい、どんだけ62銀好きなんだよ!ちなみに、そのあと先手の飛車先が伸びてくると後手は32金〜41玉とするので完全に守勢に立たされる。こんなので勝てるの鈴木英春さんだけだよ…。


8) 7)の手法 + もっともっともっと探索!(depth = 30 , moves = 2)


あまりに頭に来たので、2手目までだけ探索深度をかなり深くしてみた。depth = 30である。やねうら王の場合、1スレッドだと1手に15分〜30分ぐらいかかる。まあいい。そんなに組み合わせはないはずだから…。


その結果、ご覧の有様だよ!!



evaldiff = 30(最善手の評価値と30の差まで許容する)とした場合、後手の初手として32飛・84歩・54歩・62銀・34歩・42飛が選ばれる。


うーん。そうなのか…。ここまでしても後手の初手62銀は消えないのか…。


ならば、やねうら王には後手の初手62銀をやって、公式戦において最後に負けたコンピューター将棋として将棋界の歴史に名を残してもらうことにしましょう…。


※ 手番が決まるのは11月26日の記者会見です。まだ先後決まっていません。


ちなみに、やねうら王の先手の場合は、こんな感じになっております。



76歩・26歩・68玉・48銀のいずれかになるかと思います。68銀と48銀は正直、やめて欲しい…。でもこれも、やねうらおもてなし定跡だから仕方ない…のか…な…。ここは変に手心を加えず、やねうら王が自ら判断したありのままの定跡で臨みたいと思います!


みんなも「やねうらおもてなし定跡」をハラハラしながら見守ってくれ!!


・追記


9) 8)の手法 + 自ら思考させその指し手を定跡DBに保存


いま、生成された定跡を確認してたら68玉34歩38銀84歩76歩85歩78玉86歩同歩同飛22角成という先手の糞定跡が見つかった。誰が指したのかは知らんが(プロの棋譜以外も混じっているので)*1、38銀は趣向だと思うけど、せめて48銀にしてくれよ。そして22角成もどう見ても悪手。85歩に78金とでも我慢しとけば少し作戦負けながらもまだまだやれるのに…。こんな出だしじゃ絶対勝てないわ。


そんなわけで、8手目あたりまではdepth = 26ぐらいで思考させた指し手も定跡DBに登録しておこうかと思います。うちの電気代大丈夫かな…。


10) 負けたほうの指し手は定跡登録しない


富岡流のような定跡もあるので、長い手数まで定跡化するのであればワンサイドで負けたほうの指し手は定跡登録しないということでそういう定跡を回避できる可能性があります。昨年のやねうら王が搭載していた、やね裏定跡がそれです。今回は採用しませんが。


・追記


ねとらぼで取り上げられました!


将棋電王戦出場のやねうら王 プロ棋士の研究を無駄にしない「やねうらおもてなし定跡」を搭載
「公式戦において最後に負けたコンピューター将棋」になるかもとのこと。
http://nlab.itmedia.co.jp/nl/articles/1411/14/news106.html


・追記 先手の初手の最善手は?


depth = 32で調べてみました。数時間かけてやねうら王に思考させたところ、58金右。この手はそんなに悪くない気はしますが(もしかすると本当に最善手の可能性がなくもなく…)、プロの実戦例にはないようで、今回の手法だとそのあとの展開が定跡化できないため、3手目から定跡を外れます。これだと今回の趣旨である“おもてなし”に反するのでこの手は指さないように何か対策します。

*1:コメント欄でKCC将棋の棋譜だと教えてもらいました