自己対戦による定跡DBの自動作成について(案)

例によって妄想レベルの話で恐縮ですが、SSDであればランダムアクセスがすこぶる速いのでbook_probe(定跡DBに現在の局面が登録されているかを調べること)するのに1回0.1ms以下で出来ます。(たぶん)

と言うことは、現在の局面から3手先まで調べるとして、その3手先の局面が1万局面あったとしてもbook_probeする時間は1秒以内で出来るということになります。(たぶん)

私の定跡DBにはスコア(評価値)を記録しておくつもりで、そのスコアをつけたときの探索深さ(そのノードからの残り探索深さ)を同時に記録しておくつもりです。そうすればbook_probeして見つかった局面の情報を置換表に書きこんでいくことが可能になります。

置換表の値を見ながらαβ探索がなされますから、定跡DBにhitしたからと言ってそれを盲信するのではなく、よりよい手があるならそれを探しますし、定跡DBに登録されている評価値をつけたときの探索深さが浅いなら、そのときにもっと深くまで探索しますし、また複数の手がある場合は、αβ的に見て最大になる指し手を選ぶことが出来ます。

また定跡DBにはひとつ前の局面に戻るための指し手も登録できるようにするので、新しいノードを登録するときに、その前の局面に対して評価値を(min-max的に見て)更新するのかを調べて、評価値を更新することによって定跡木上でmin-maxのようなことが出来ます。

あと試合が終了したときにBonanza相当の評価関数で、初手から順番に探索して評価させて、それぞれのノードでの評価値とiteration深さを何も考えずに置換表に書きこんでいく(書きこむときに定跡DB上でmin-max的な処理は行なう)だけで、良いです。

自分のソフトの評価精度がBonanza以上になっていれば、試合中に(1手ごとに)探索結果を定跡DBに書き戻して行っても良いでしょう。

定跡DBにすでに指し手があるエントリーに関しては少し考慮時間を長めにして(限度がありますが、まあ5分ぐらい考慮させて)定跡DBに書き戻しておけば、負けた変化にはほぼ飛び込まなくなります。

こう考えたとき、何も急いでプロの棋譜から定跡を学習させずともこの自動学習機能を実装して、floodgateや将棋倶楽部24に投入しておけば自然とfloodgateでいろんな定跡を学習したり自ら作ったりするのではないかと思うのです。

棋力が乏しいソフトとの対戦ですと大半の定跡はもう二度と出現しない棋譜(≒ノイズ)になってしまうかも知れませんが、それならば自分が負けた棋譜に関してのみ登録しておけばいいかなと思います。

定跡DBの1エントリーが64バイトで考えていまして、1万棋譜でファイルサイズ的には1GB程度かと思っています。(ファイル自体はかなりスカスカですが) ファイル自体はもう少しきつきつに詰めることは可能ですが、その場合book_probeに要する時間が伸びるので、こんなものでいいかと思っています。

1日100局するとして100日で1GB、1年で4GB程度。1日1000局なら1年で40GB。

まあ数年後にはSSDも大容量のものが安価になっているでしょうから、開発用ならばこれぐらい消費してもいいかなと思います。一般用に配布する定跡ファイルは不要な変化を削っておけば(圧縮ファイルサイズは)100MB程度に収まるでしょうし…。