Quantumleap
2853 words
14 minutes
相横歩取りギガショック定跡
2021-11-01

ギガショック定跡とは#

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

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

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

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

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

テラショック定跡とは#

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

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

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

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

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

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

::: tip テラショック定跡の評価値

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

:::

定跡の目的#

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

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

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

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

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

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

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

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

::: warning Bonanza を用いる理由 この試みは最強の定跡をつくるという本来のテラショック定跡の役割にはそぐわないものになりますが、アマチュア同士の対局という観点から見れば十分な成果があると思われます。 Bonanza は確かにもはや強豪とは言えない将棋ソフトですが、それでも奨励会有段者クラスの強さはあるので一介のアマチュアからすれば十分な強さと言えます。 :::

作成方法#

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

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

解析したい棋譜の用意#

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

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

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

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

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

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

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

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

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

Sfen 化#

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

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

Blunder.Converter が便利なのでこれを使って 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 を深く設定しているとなかなか探索が進まないのでそのパソコンで一分くらいで読めるノード数くらいに設定しておくのが無難です。

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

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

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

解析開始#

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

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

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

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

八時間後…

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

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

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

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

makebook build_tree book2019.db user_book.db

テラショック定跡出力

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

定跡作成代行#

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

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 時間弱で終わるはず、興味がある方は([email protected])ご連絡ください。

相横歩取りギガショック定跡
https://fuwari.vercel.app/posts/2021/11/gigashock/
Author
tkgling
Published at
2021-11-01