自己対戦棋譜からの学習

皆様、明けましておめでとうございます。皆様、いかにお過ごしでしょうか。


私のほうは、いまとあるベンチャー企業のスタートアップに関わっていて、忙殺されております。
このベンチャーが数年後に株式上場でもしてくれれば、笑いが止まらなくなるのでしょうけど、もうしばらくは乾いた笑いしか出てきそうにありません。


さて、最近、自己対戦棋譜から棋譜からの学習が可能なのかが話題になっているようなので、少し思うところを書いておきます。


従来、棋譜からの学習にはプロ棋士の対局棋譜を使ってきました。これは、プロ棋士の対局棋譜に最善手が多く含まれていると仮定できるからです。つまり、最善手をたくさん含んでいる棋譜から学習させたほうがより強くなるということですね。


近年、floodgateの棋譜からのみ学習させるという研究が発表されました。*1 floodgateの棋譜将棋倶楽部24棋譜とでは前者から学習させたほうが良いというのが結論のようです。floodgateの棋譜とプロ棋士棋譜とではどちらがいいのかはその記事からはよくわかりません。


いまや終盤ではコンピューター将棋のほうが人間を上回っていることは間違いないので、コンピューター将棋が即詰みや必死を読みきれる局面であれば、それはその局面の最善手であり、人間の棋譜の指し手よりは優れているわけです。


ゆえに、そういう局面で人間の棋譜の指し手から学習させるよりは、コンピューターの指し手から学習させるほうが精度が良いことは自明です。


プロ棋士の対局における明らかな悪手を排除し、終盤の読み切りが出来る局面以降はコンピューターの示す最善手から学習させることは意味があることです。ある対局で勝ったほうの指し手からのみ学習させると有意に強くなるのは、負けたほうには何らかの悪手が含まれていて、それが学習する上で有害だからです。


では、コンピューターが読みきれる局面の指し手のみを与えて学習させた場合はどうなるでしょうか。


この場合、終盤の玉頭付近へ駒を移動させるような指し手を正しく評価出来るようになることは十分予想できますが、序盤の銀を繰り出すような指し手や玉を囲うような指し手までは評価できるようにはならないでしょう。


ここで、自己対戦棋譜からの学習にどうしてもこだわるのであれば、序盤の玉を囲うような指し手をどうやれば評価できるのかという話になります。


一つの方法として、序盤のある局面でいくつかの指し手をランダムに指してみて、そのなかでそのあと(普通に対局を進めて)勝率が一番良かった指し手を最善手とみなして棋譜からの学習を行なうことです。


これは遺伝的アルゴリズムを適用するときにある程度個体にばらつきを持たせてそれらの個体のなかで一番優れたものを採用するのにも似ています。


このようにすれば、序盤もそこそこ学習できそうに思えますが、そう簡単ではないです。


例えば、ランダムに指し手を選択するときに48銀と銀を繰り出す指し手だけ指しても、このあとこの銀を57に運んだりしないと単なる壁銀になってしまい、勝率としてはむしろ下がるかも知れないからです。こう考えるとランダムに指し手を1手だけ選択するという手法だと自己対戦棋譜から学習できそうにありません。せめて、ランダムに数手セットで指させて、そのなかで勝率の高かったものを選ぶ必要がありそうです。


例えば、囲いに関してはどうでしょうか。囲いは、例えば、金銀が離れ駒になっている状態でそのあと普通に対戦させれば、離れ駒になっているほうが勝率は下がるはずであり、離れ駒がなく、うまく囲いに入っているほうが勝率は高くなるはずです。ゆえに、囲いはおそらくこの方法で自己対戦棋譜から学習出来ても不思議ではないと思います。しかし、もしかしたら、ランダムに指し手を選択して銀冠にしたあと、その銀冠よりは普通の美濃囲いのほうが評価値が高いので銀冠→美濃囲いに戻してしまい、単に手損して形勢を損ねるだけで、いつまで経っても銀冠の良さが評価できないということは起こりえます。


そこでこのランダムに選択して動かした駒をしばらくは元の位置には戻さないというような抑制が必要かも知れません。


さて、攻めの手は自己対戦棋譜から学習できるでしょうか?


コンピューター将棋に棒銀が出来るようにしようと考えますと、まず攻めの銀と守りの銀を交換したことがプラス評価されていなければなりません。これは終盤の指し手から十分学習可能だと思うで、これは学習できているとしまして、次に、攻めの銀と守りの銀が交換できるというところまで探索できなければなりません。これは、20手ぐらい先まで調べなければなりませんが、銀を前進させることによって評価値が上がりませんと、早い段階で枝刈りされてしまいます。ゆえに、枝刈りされずに20手ぐらい先まで読めなくてはなりませんが、それはつまり、あまりいい手に見えなくても枝刈りせずに先まで読もうという話であって、そんなことをしますと、いまのコンピューターの計算能力では10手ぐらいまでしか先を読めません。


つまり、この方法ですと自己対戦棋譜からは棒銀の成功体験を学習することは出来ないことがわかります。


それでは、ランダムに指し手を何手か進めるというときに、もう少し恣意性を持たせて、例えば攻めの駒であれば、その駒だけを数手ランダムに前進させてみてはどうでしょうか。


例えば、銀を3手前進させますと、棒銀が成功するまでの手数が20手 - 3×2手 = 14手に短縮されますので、枝刈りされずに14手先まで読むことが出来れば、棒銀が成功します。(枝刈りされずに14手先まで読むというのが計算量的に大変だというのはありますが、さきほどよりはうまくいきそう、というのはわかっていただけるかと思います。) ゆえに、このとき、棒銀の成功棋譜が出来上がり、そこから攻めの銀は前進しているほうが価値が高いであろうことが学習できます。


よって、このアイデアを元に改良していけばそこそこうまく行く可能性があるとは思います。


しかし、1つの棋譜を生成するのに、ランダムに数手選択→そのあと普通に対局させるというような手順を行なう必要があるので、棋譜を1つ生成するのにすごく時間を使います。また、対局を1手1秒のように対局時間を絞ってしまいますと、棒銀の成功までが読めずに、攻めの手が学習できないであろうことはわかります。ゆえに、対局時間をあまり絞ることは出来ません。


私が思うに1つの棋譜の生成に数時間を要するはずで、1年かけても1000棋譜用意できればいいほうでしょう。この生成された棋譜で学習→新しくなった評価関数でまた1年かけて1000棋譜を生成→その棋譜で学習 というような反復をしていけば次第に強くなる(かも知れない)のですが、非常に長い歳月を要することがわかります。また、これで本当に強くなっていくとは限らないので、そんな長い歳月を費やして実験して、「やっぱり途中から強くなってませんでした」というような事態は避けるべきです。


ゆえに、自己対戦棋譜からのみの学習というのは、なかなかハードルが高いとは思います。


ただ、私は自己対戦棋譜からのみの学習自体は工夫次第では可能だと思っていて、何かここに書いたアイデアを改良し、誰かが実現してくださることを期待します。