相横歩取りギガショック定跡と定跡代行

ギガショック定跡とは

やねうら王氏の100テラショック(100兆局面)定跡に倣って作成されました。

全部で739局面しか調べていないのですが、MultiPV 4の深さ24探索なので一局面あたり四億ノード(一手あたり一億ノード)くらいは調べているみたいです。

ということは3000億ノードは読んでいるはずなので300ギガショック定跡ということになるわけです。

こういう定義でいいんでしたっけ?

やねうら王さんの記事でテラショック定跡生成コマンドが載っていたのでそれを元に作成しました。

テラショック定跡とは

評価値付き定跡テラショック定跡
評価値その局面から深さNで探索したときの評価値その局面から探索した末端局面を深さNで探索したときの評価値で最大のものの最小
利用ShogiGUIなどやねうら王系のみ

やねうら王をShogiGUIに登録すれば使えるのでその点はご注意ください。

例えばある局面が通常の評価値付き定跡で先手+300がついていたとします。

これは、その局面から深さNで探索したときに後手が最善手を指しても先手が+300になる先手の応手があることを意味します。

つまり、N手先で少なくとも先手は+300であることが保証されます。

通常の定跡

この場合、通常の定跡は自分が一番左のノードを選べば最悪でも評価値30の局面に辿り着けるのでこの局面を評価値30と返します。

それに対してテラショック定跡は、その局面から変化した局面がテラショック定跡データベースにあるなら終端局面をN手先まで読んだときに最低でも評価値Xを保証してくれる定跡になります。

つまり、末端から更に読んでいるわけです。

テラショック定跡

簡単に言えば(テラショック定跡が十分大きければ)ある局面が評価値Xと判断された場合「そこから妥当と思われる(データベース内にある指し手)をどう指しても最低でも(深さNで探索したときに)評価値Xが得られた局面に到達できる」ということですね。

定跡の目的

今回は相横歩取りの定跡をつくることにしたため、まず相横歩取りの基本状態までの棋譜をつくりました。

22手目 ☖7四同歩まで

ここから先にどのような変化があるかを調べるだけなら、ソフト同士対局させてその棋譜を一つにまとめてしまえばおしまいです。

定跡化とはそれらの手がどのくらい有効なのかを評価値としてソフトに熟考させて結論をだすということです。

結論をだすのですから、深く読まなければいけません。浅い探索だと好手を見逃す可能性があるからです。

今回はこの局面からソフト同士で50手目まで対局させ、50手目までにどのような変化が考えられるかを検討します。

この相横歩取り定跡は後手が相横歩取りで勝つための手順(つまり、先手の緩手を咎める定跡の作成)が目的なので先手が最善手を指すことを想定していません。

つまり、あんまり強いソフト同士で対局させたくないわけです。

そこで先手にBonanza、後手にorqhaとすることで先手が最善手を指しすぎないようにしました。

この試みは最強の定跡をつくるという本来のテラショック定跡の役割にはそぐわないものになりますが、アマチュア同士の対局という観点から見れば十分な成果があると思われます。

Bonanzaは確かにもはや強豪とは言えない将棋ソフトですが、それでも奨励会有段者クラスの強さはあるので一介のアマチュアからすれば十分な強さと言えます。

作成方法

大前提として、以下のものが必要になります。

  • そこそこ高性能なパソコン
    • 最低でも8スレッドあるCPUが望ましい
    • ハードルは高いがAWSがオススメ
  • 定跡を作成したい棋譜
    • ある戦型の棋譜を50ほど
    • あればあるだけいいが時間がかかる
  • 棋譜をSfenに変換するツール
    • Blunder.Converterが便利

解析したい棋譜の用意

今回はアマチュア強豪クラスのBonanzaの指し手を後手の名人を遥かに凌ぐ棋力をもつorqhaがどうやって咎めるかを定跡かにするわけです。

初手から指すと相横歩取り以外の局面に誘導してしまうので、相横歩取りが確定した局面から対局させます。

開始局面を現在の局面にし、連続対局を好きな回数に設定します。

棋譜を一つにまとめるのチェックは外しておいたほうが良いでしょう。

また、棋譜自動保存にチェックを入れることも忘れないようにします。

秒読みは何秒でもいいと思いますが、あんまり短いとソフトの検討が不十分で悪手を指してしまう可能性があるので10秒程度持たせるのが良いかもしれません。

相横歩取りのように激しい変化になりやすい戦型ではResign Valueを設定することで形勢が大きく離れた場合に投了することで時間の節約ができます。

指定手数で引き分けにするにチェックを入れておかないとどちらかが投了するまで対局が続いてしまうのでこれは必ず設定しましょう。

今回は22手目の相横歩取り確定局面から50手目までの定跡をつくりたかったので指定手数は50に設定しました。

Sfen化

対局が完了するとこのような感じで対局データが集まります。

これはそのままでは読み込めないのでSfen形式のデータに変換する必要があります。

Blunder.Converterが便利なのでこれを使ってSfen化しましょう。

Sfen化したbook2019.sfen

出力ファイル名は何でも良いですが、今回はbook2019.sfenとしました。

あとはこの対局データをやねうら王で解析して定跡化するだけです。

実行環境の構築

やねうら王さんのGitHubから実行ファイル詰め合わせV4.85をダウンロードします。

とりあえず適当なところに定跡作成用のフォルダをつくることにします。

今回はデスクトップ直下にTerabookというフォルダをつくりました。

たくさん実行ファイルはありますが、今回はNNUE型評価関数を使って検討したいのでYaneuraOu2018NNUE_learn_avx2.exeを使用します。

AVX2に対応していないCPUの場合はSSE42を選択してください。

学習用の実行ファイルをTerabookフォルダにコピーします。

現状、このような構成になっているはずであればOKです。

ただ、このままでは評価関数がないのでそれをダウンロードしてきます。

今回は解析にorqha2018を使用しました。

evalというフォルダをつくり、中にnn.binをコピーしてください。

ここまでできれば全ての準備は完了です。

評価開始

やねうら王をダブルクリックして起動すると真っ黒な画面がでるので、コマンドを打ち込んでパラメータを設定します。

hash 8192
threads 8
bookfile no_book
multipv 4

ハッシュとスレッドは設定しておかないとデフォルトだと16MBしかハッシュを使ってくれなかった気がします。

multipvは一局面あたりに何手候補手を探すかということになります。

数を増やせば線形に解析時間は長くなります(MultiPV 4にすると4倍時間がかかる)

定跡は外しておいた方がいいと思います、多分。

makebook think book2019.sfen book2019.db startmoves 23 moves 50 depth 24 nodes 100000000
パラメータ意味
startmoves解析開始手数
moves解析終了手数
depth深さ(何手先の局面まで読むか)
nodesノード数(局面の数)

終盤はdepthを深く設定しているとなかなか探索が進まないのでそのパソコンで一分くらいで読めるノード数くらいに設定しておくのが無難です。

こうしておくことで、深さかノード数のどちらかを満たしたときに解析を終了させることができます。

うちのパソコンは4000kNPSなので2億4000万ノードくらいを指定しておけば良いことになります。

ただし、MultiPV 4を指定しているので実際にはその1/4の6000万ノードくらいが妥当でしょうか。

解析開始

死ぬほど時間がかかります

今回は全部で59局の棋譜データから1076局面見つかったのでそれぞれに対して評価値を求めていきます。

最初にもお断りしましたが、死ぬほど時間がかかりますので覚悟してください。

途中でパソコンがハングアップすることに備えてやねうら王には15分ごとに自動でバックアップをとってくれる機能があります、助かります。

八時間後…

最終的に185KBのbook2019.dbが完成しました。

このままだとただの評価値付き定跡なので、これをテラショック定跡化します。

テラショック定跡は通常の定跡ファイルと違い、終端ノードの評価値のminimaxしているという点で異なります。

完成した定跡をテラショック形式に変換するには以下のコマンドを入力します。

makebook build_tree book2019.db user_book.db
テラショック定跡出力

完成したテラショック定跡はやねうら王系で扱えるので是非どうぞ。

定跡作成代行

やねうら王さんが定跡採掘代行を始めていたのでそれに倣って(ry

やねうら王さんえむいー
対象プロ, コンピュータ将棋開発者アマチュア
候補手44
深さ3624
定跡指定局面+5手
最大1024局面
指定局面+5手
最大1024局面
千日手考慮なし
料金1万円(AWSの半額!)要相談
信頼度極めて高い未知数

代行頼むのもめんどくせえ!って方は以下のコマンドで指定局面から五手分の定跡が作れるはずです(むしろこっちがメイン)

makebook endless_extend_tree book2019.db book2019.sfen think2019.sfen depth 24 startmoves N moves N+5 loop L
  • book2019db
    • 作成される定跡ファイル(ファイル名は適当で)
  • book2019.sfen
    • Sfen形式の局面データ
  • think.2019.sfen
    • 思考中のファイルを保存する一時データ

深さ24で約800局面読むのにi7 6700Kで8時間くらいかかったので1024局面であれば10時間くらいかかる見込みです。

AWSのインスタンスを使えば約4倍の計算力があるので3時間弱で終わるはず、興味がある方は(nasawake.am@gmail.com)ご連絡ください。