将棋ソフトは間違えないと思われている風潮

     以前の記事で、3三将棋アプリをより深く読むようにしたことで最善手が変わった例を紹介しました。今回もその続きで他の例を紹介しようと思います。
     今まで3三将棋アプリの初期配置パターンリストに載せる問題を選ぶときは、なるべくアプリで正解(と思われる手)を指せる問題を優先的に採用していました。アプリが間違えるとユーザーを失望させると思ったからです。世間的には「3三将棋程度なら将棋ソフトで正解を出すのは簡単だろう」と思われているでしょうから:pensive:。今回紹介するのはそういう採用を見送っていた(ボツにした)配置です1

    No.141

    (画像はクリックで拡大)

    No.141_1

     上の初期配置は3三将棋アプリのNo.141のものです。これを以前のバージョン(1.0.7.0未満)の長考モード同士で対戦させると以下のように後手が勝ってしまいます。先手が千日手を打開しようとして負けている感じです(24手)。

    No.141_2

     以前のバージョン(1.0.7.0未満)の瞑想モードだと以下の手順で千日手になります(25手)。正解はおそらく千日手なのですが、上のように長考モードで間違えているのでボツにしました。

    No.141_3

     深く読めるように改良したバージョン(1.0.7.0以降)だと、長考モードでも瞑想モードでも千日手になります。
     面白いのは3通りの千日手になる手順が全て異なっていることです。最新バージョン(1.0.8.0)の瞑想モードだと数手一組の手順が手番を変えて以下のように循環します(48手)。

    No.141_4

     3三将棋(9マス将棋)では2一と2三の地点にお互い金がある以下のような形はほぼ千日手になるようですが、

    No.141_5

    駒の種類によっては変化があるみたいで、本当に千日手を打開することが出来ない(打開すると負ける)のかは分かりません。

    No.144

     下の配置の先手の最善手は何でしょうか?後手の玉は自分の駒(歩)が頭を押さえつけていて狭いので人間にとっては結構分かりやすい問題に思えるのですが、以前のバージョン(1.0.7.0未満)では正解出来ませんでした、初手に1二銀と指してしまいます。

    No.144_1

     以下のように先手が負けるのでボツにしました。

    No.144_2

     初手の最善手は(おそらく)3二角と打つ手です。バージョン1.0.7.0以降だと以下の手順で先手が勝てます(13手)。

    No.144_3

     初手3二角、同銀、同玉、2三角と進んだ以下の局面で、2三同玉と角を取ってしまうと(逃げれば大丈夫)1三歩成、同玉、1二銀で先手玉は詰んでしまいます。

    No.144_4

     上の局面まで誘導してあげれば以前のバージョン(1.0.7.0未満)でも先手が勝つのですが、初手に角を打つ手は指せませんでした。読みが深くなった新バージョン(1.0.7.0以降)だと長考モード(9手読み)でも瞑想モード(10手読み)でも初手3二角が打てます。
     新バージョンでは初期配置から3二角、同銀、同玉、1三歩成、2一歩成、1二玉、2二とと7手で詰む(9手読みが必要)手順が見えているからこそ初手に角を取らせる手を指せるのですが、旧バージョンでは読む深さが足りずにその手順が見えていないため、初手で角を損する手は選べずに銀で歩を取ってしまいます。

     以前ボツにしたけど深く読むように改良してから正解が出せるようになった(と思っている)配置は他にもあるので、順次アプリに追加していこうと思います。但し今でも正解が分からないものやAIが示す手が正解と思えない初期配置もあります。AIが最善手を指せる初期配置を開発者が選別している時点で、現在の3三将棋アプリはまだまだ人間を超えていないと言えそうです。

    駒得しか考慮していない評価関数の限界

     旧バージョンでは深く読めないために初手を間違えたわけですが、深く読めなくても評価関数の出来が良ければ最善手を指せる可能性はあると思います2。No.144の初期配置を見た時に、ある程度の棋力がある人なら後手玉が動けない状態だから銀で歩を取るのは相手玉を逃してしまうことになって損だと判断出来ると思います。しかし、現状の駒得しか考えていない評価関数だとそういう考え方が出来ません。「角を捨てるわけにはいかない」「銀がただで取られる前に歩を取ろう」となってしまいます。機械学習の手法を使ってAIに学習させれば人間のように経験値を高めて「玉が狭い」なんていう概念をあたかも理解しているかのように振舞わせることが出来るかもしれません。
     最新の将棋ソフトを3三将棋(9マス将棋)に対応させたら全問最善手を指せるのでしょうか?作業量の割にメリットがないので誰もやらないと思いますが、もしやってみても学習型のAIだと初期配置が違うパターン全てに対応させるのは大変だと思います。またアプリを強くするためには評価関数の出来は悪くても、データ構造を変えたりコンパイラ言語を使ったりしてより深く広く読むようにするアプローチもあると思います。そちらの方が現実的かもしれませんが、androidアプリにするには開発環境も制限されますし、どちらの方法が効果的かは難しいところです3
     自分は、5五将棋アプリのスタンダード配置に的を絞って学習型のAIを試してみたいと思っていて、三目並べで試していたモンテカルロ法4ではなくTD学習を使ったAIが良さそうだと思ってるのですが、それに関してはまた別の記事に書いてみたいと思います5


    1. Version1.0.8.0で追加した初期配置パターンNo.141〜No.145です。 

    2. でも本将棋ほどの精度は必要ないと思っています。いろんなケースを試してきて、やはり3三将棋(9マス将棋)は評価関数の出来より読みの深さだと思います。 

    3. 現状の思考ルーチンのCoffeeScriptのソースをKotlinに移植するのは容易なのですが、Kotlin(Java)は再帰関数の扱いに制限があってこのアプローチは止めました。C++でライブラリ書いてandroidアプリから呼び出せば可能? 

    4. 「三目並べと同じ方法でオセロや将棋を作れるか」「三目並べでニューラルネットワーク(正)」参照 

    5. 三目並べと違って教師データを作成する良い方法がわからないので、他のやり方も模索中です。