やねうら王V4.85でテラショック定跡の生成がユーザーの皆さんでできるようになりました。やねうら王V4.85でテラショック定跡の生成がユーザーの皆さんでできるようになりました。
やねうら王 V4.85は、やねうら王のGitHubのReleasesのところからダウンロードしてください。→ V4.85詰め合わせ
テラショック定跡の生成手順
Step 1. 思考対象の棋譜をsfen形式(“startpos moves..”と書かれてる形式)で用意します
自己対局させたものでもいいですし、他のソフトと対局させたものでも良いです。将棋所などで対局させる場合、KIF形式で書き出して、それをsfen形式に変換するソフト(Blunder.Converterなど)を用いて変換して使ってください。
Step 2. 用意した棋譜に対して思考させます
用意した棋譜に対して16手目までをMultiPV 4、depth 30で思考させて結果を書き出したいならば、
MultiPV 4makebook think 2019.sfen book2019.db moves 16 depth 30
のようにします。(これは従来から存在していたコマンドで、今回追加したものではありません。)
これでbook2019.dbというファイルができます。
makebook think 2019.sfen book2019.db moves 16 depth 30 nodes 100000
のように探索するノード数で制限することができるので(depth指定と併用する)、終盤に時間がかかりすぎるときにうまく使えば効率的に思考できます。
Step 3. Step 2.で作成した定跡ファイルに対してテラショック定跡手法を用いて新しい定跡ファイルを作成します
makebook build_tree book2019.db user_book1.db
これでbook2019.dbをminimaxのようなことをしてuser_book1.dbが生成されます。このuser_book1.dbをやねうら王の実行ファイルの配置されている配下のbookフォルダにコピーして、やねうら王のエンジンオプションのBookFileオプションでuser_book1.dbを指定して使ってください。
また、この”makebook build_tree”を行うとき、先手側、後手側のcontempt(千日手を受け入れるスコア)を個別に指定できます。
makebook build_tree book2019.db user_book1.db black_contempt 50 white_contempt 150
先手の千日手スコア-50、後手の千日手スコア-150になります。
Step 4. これを繰り返します
Step 1.→ Step 2 → Step 1.→ Step 2.と繰り返して、どんどんbook2019.dbを大きくしていき、最後にStep 3.を行ってテラショック定跡を作ります。
Step 2.で指定するdepthの値が大きいとStep 2.に時間がかかりますので、ここをある程度下げて80手目ぐらいまで生成して、実際に定跡を使うのは60手目ぐらいまで(やねうら王のエンジンオプションのBookMovesで60を指定する)にするなど各自工夫してみてください。定跡が大きくなってくるとStep 3.のビルド自体にも時間がかかるようになってきますが。
Step 5. 延長する局面を書き出すコマンド
Step 1.の自己対局させる時間が惜しいと思うかも知れません。評価値が一定以上の枝(候補手)だけを辿り、その棋譜を書き出して(最後の局面から1手進んだ局面までの棋譜が書き出されるので)、それを用いてStep 2.を実行したいと思うかも知れません。
そういう機能もすでに用意しています。
makebook extend_tree read_book.db read_sfen.txt write_sfen.txt black_eval_limit -200 white_eval_limit -300
展開する枝の評価値の下限を先手/後手個別に指定できます。上の例ですと、先手なら-200以上の評価値の枝のみを延長して、後手ならば-300以上の評価値の枝のみを延長します。
read_sfen.txtにはこの延長を行う開始局面を複数指定できます。(わからなければ、”startpos”とだけ書いたテキストを用意すれば、平手の開始局面からになるのでそれで問題ないはずです。)
Step 6. 千日手スコアの局面だけを延長するコマンド
Step 3.でビルドするときに、千日手の局面の判定は、定跡で二度目に同じ局面に到達したときに千日手として扱われます。つまり、同じ局面が2度出現するところまでの定跡が入っていないと、black_contempt , white_contemptの値は利きません。定跡がそこまで到達していない場合、千日手スコア(0)がその局面の評価値として使われてしまうので、これは好ましい動作ではありません。そこで千日手スコアの局面だけを二度目に同一局面が出現するところまで、さらに掘りたいはずです。このコマンドも用意してあります。
makebook extend_tree book2019.db read_sfen.txt write_sfen.txt extend_range -1 1
extend_rangeを指定すると、その範囲のleaf node(末端の局面)の候補手だけを延長対象とします。(MultiPVで思考させ複数の指し手が登録されている場合、このextend_rangeの範囲内の候補手で進めた局面だけが延長されます。) extend_range -1 1 と指定したならば、leaf nodeでextend_treeの引き分けのスコア(-1,0,+1)の局面だけを延長します。(棋譜として書き出します)
※ やねうら王のV4.84以降だとmakebook thinkのときのContempt = 0なので引き分けのスコアは0のはずですから、extend_range 0 0と指定すれば良いです。
Step 7. 課題局面からの自動延長
勘のいい人であれば、Step 5.→ Step 2.を自動的に繰り返してくれれば課題局面から自動的に定跡が掘れて便利だと気づくかも知れません。そのコマンドもすでに用意してあります。
makebook endless_extend_tree book/db2019.db book/kadai_sfen.txt book/think_sfen.txt depth 12 startmoves 1 moves 32 loop 100 black_eval_limit -50 white_eval_limit -150 nodes 100000
makebook extend_treeとthinkを合体させたコマンド。think_sfen.txtのところは、思考対象局面を書き出す一時ファイル。このときbook/kadai_sfen.txtに “startpos” とだけ書いておけば、平手の初期局面が課題局面になるので、そこから自動的に定跡が掘られていきます。loopの回数だけ繰り返されます。
例)やねうら王の思考エンジンを起動して、
Hash 4096
Threads 8
MultiPV 4
makebook endless_extend_tree book/db2019.db book/kadai_sfen.txt book/think_sfen.txt depth 12 startmoves 1 moves 70 loop 100 black_eval_limit -50 white_eval_limit -150 nodes 100000
みたいな感じで、コマンドを叩けば、課題局面から先手評価値-50以上、後手の評価値-150以上の枝のみを延長しながら70手目までdepth 12でMultiPV 4で掘れます。(気の遠くなるような時間を要します。)
Step 8. 千日手スコアの局面だけ自動延長
Step 7.同様に千日手スコアの局面だけを自動延長して棋譜を書き出し、Step 2.を行うという動作を繰り返して欲しいと思うかも知れません。このコマンドも用意してあります。Step 7.のコマンドにentend_rangeが指定できます。
makebook endless_extend_tree book/db2019.db book/kadai_sfen.txt book/think_sfen.txt depth 12 startmoves 1 moves 32 loop 100 black_eval_limit -50 white_eval_limit -150 nodes 100000 extend_range -1 1
まとめ
テラショック定跡生成部を一般ユーザーが使えるようになりました。夜中のうちにコンピューターに課題局面の研究をさせておいたり、自分だけの振り飛車定跡を作ったりと色々と応用が利くはずです。
Step 2.のdepthを上げると思考時間を要しますが、depthをある程度妥協して、その代わりたくさんの局面を掘るだとか、深い手数まで掘るだとか、色々工夫することで自分だけの洗練された巨大定跡を生成することも夢ではありません。色々試してみてください。
何か良い条件がわかればコメント欄にお願いします。(他のユーザーの参考になると思うので)
追記[2019/06/01 11:00]
えむいーさんが手順をわかりやすく記事にされたので、参考にどうぞー。
これってたややんさんの振り飛車評価関数を使って同じように定跡生成すれば振り飛車定跡も作れるってことですかね???そうだとすると夢が膨らみますね!
もちろん、そういう使い方もできます。振り飛車用の評価関数を用いなくとも、自動でエンドレスに掘るときに開始局面自体を指定できるので振り飛車の基本形あたりを指定して、そこからMultiPVとかで掘っていくこともできます。
普通の評価関数で掘ると振り飛車側の評価値が大きくマイナスになってしまうので、たややんさんの振電で定跡掘って遊ぼうと思います!
テレショック定跡同士で合成できますか?
テラショック定跡に変換後(makebook buildtreeコマンド後)のものをマージする(makebook merge)ことはできますが、それはあまり意味がないような…。
エンドレスで定跡を掘る際にデフォルトだと一定時間?でブックの保存をやってくれますが、この間隔を伸ばすコマンド等はありますか?
ブックの容量が大きくなると保存の時間も長くなるので、出来るだけバックアップの間隔を空けたいのですが・・・。
コマンド説明の項目に記載があり、見落としてたら申し訳ないです。
保存間隔を変更することはできませんが保存中も探索自体はノンストップで進むため、計算資源のロスにはなりません。また、保存は、前回の保存終了から15分経過時点で開始なので、ファイルが大きくなり保存時間が伸びても、それによって保存されなくなるというような事態にはなりません。なので、変更できるように作ってません(´ω`)
nodesはどれぐらいが良いのですか?
あと、一度中断したのですがそのままスタートさせるとゼロから更新されてしまいます。どうすればよいですか?
どのコマンドのことでしょう?
makebook thinkコマンドは、中断した場合でも15分ごとに定跡ファイルが保存されているはずなので、そのファイルを指定して再開すれば続きからになるのではないかと…。
makebook build_treeコマンドは、再開できないですが(´ω`)
将棋所立ち上げて、色んな局面で中盤でそのdepthまで探索させてみて、どれくらいのノード数になるのか確認して、その平均 + αぐらいに設定してみるといいと思います。(終盤で詰み周りの局面でノード数が爆発するのを防止したいので)
手入力の場合に評価値を自分で付けることはできますか?
できます(`・ω・´)b やねうら王の標準定跡ファイルフォーマットを見ればわかるかと…。
テラショック定跡と普通の定跡をマージすることは可能ですか?
できます。(お勧めはしませんけど)
テラショック定跡を使って教師局面を作れば特定の定跡型に特化した評価関数の学習ができそうな気がしましたが、教師生成コマンドで定跡中の局面を書き出した場合、テラショックに搭載されている評価値と読み筋はそのまま教師に書き出されるのでしょうか。
score が0に置き換わったりするのでしょうか。
自分で試してみた(gensfen→convert_plain)ところ、そもそも定跡に登録されている局面は書き出されませんでした。これはそういう仕様なのでしょうか。また、定跡の登録局面を書き出すような改造は可能ですか?
convert_plainって私の知らないコマンドなのですけど、どんな変換なのでしょう??
コマンドは
learn convet_plain output_file_name output.txt imputX.bin …
の様に用いられ、バイナリ形式の教師局面をテキスト形式に変換します。
https://github.com/yaneurao/YaneuraOu/pull/71
先のコメントでは、定跡を用いて教師局面を生成→当コマンドでテキスト形式に変換→変換ファイルにある局面が定跡局面にあるかを検索→定跡局面が教師局面中にはない といった手順で調べていました。
書かれている意味をきちんと理解してる自信はないですけども、gensfenが、開始局面を教師局面として書き出さないの自体は仕様ですね。(改造は容易なので気に食わなければ改造していただければと…)
仕様でしたか、承知しました。
(leaner.cppあたりをゴニョゴニョすれば改造容易そうですし、自分で試してみます)
makebook thinkコマンドで、途中で終了したときどのように再開すればよいですか。15分ごとに保存された定跡ファイルに、最初に打ち込んだコマンドを打てばいいですか?
はい、それで問題なく再開されるです(`・ω・´)b
あ、そうなんですね。返信ありがとうございます。
定跡ファイルを開けるのですが、すぐ閉じられてしまいます。どうすればいいですか?
何を使って定跡ファイルを開こうとしているのでしょうか?メモ帳?
アプリケーションみたいなものだと思います。
定跡ファイルはただのテキストファイルなので(内容の確認のために)開くだけでしたらメモ帳からでも開いてくだされ…。
ただのテキストファイルに戻す方法はないのでしょうか?
定跡ファイルの拡張子は.dbですけど中身はテキストファイルですけど…。(中身を編集していない限りは)
拡張子.dbのファイルに対してダブルクリックしたときにメモ帳以外の何かのソフトが起動するのが嫌なのでしたら、「拡張子 関連付け」でググってくだされ…。
関係ないけど、ファイルのアイコンをダブルクリックすると何のソフトで開くかみたいな関連付けの設定を気にしたり、メニューの開くから小さいダイアログを使ってチマチマチマチマ目的のファイル探したりするのは面倒だから、メモ帳で開くならメモ帳のウィンドウを出しておいて、そのウィンドウにエクスプローラからファイルのアイコンをドラッグアンドドロップしてファイルを開くようにしてるw
次のやねうら王アップデートでhttp://qhapaq.hatenablog.com/entry/2019/07/23/221409
のようなリレー対局の機能、追加できますか?
できたらお願いします!!!
それは、あやねるのほうで追加するかもです。(気が向いたら)
できたら将棋所でも使えるようお願いします。
すみません。
makebook build_tree book2019.db user_book1.db
を実行したのですが、何故か正常に出力されません。
どうすれば良いですか?
(コマンドを入力するとすぐに変換が終わり、内容のない定跡ファイルが書き出されます。)
book2019.dbの局面は、平手の開始局面から数珠つなぎに辿れる必要があるのでその制限に引っかかっているのでは。
そうですか、、、
現在、テラショック化された定跡ファイルにマージしようと思っていたのですが、そこに普通の定跡を入れると何か問題は起きるのでしょうか?
マージするだけでしたら、普通にマージ用のコマンドでやればいいように思いますけども。(定跡としての効果があるのかは私にはわかりませんが)
すみません、自分の複数のkifを課題局面として定跡を掘りたいのですが、targetdirの中身を上から順にmakebook thinkへまとめては読み込ませられないのですか?
とりあえずできなかったので、kifファイル名ををnameryというツールで連番にしてエクセルからのバッチファイルで回せるようにしたので今回の件は大丈夫です。
うおー、力技ですね(^^ゞ
ちなみにファイル名、リネームせずとも、コマンドプロンプトで
dir > files.txt
とかやって、ファイル名一覧を取得して、それをテキストエディタの正規表現置換でつなげたほうが楽なような…。
すみません、定跡の総局面数ってどうすれば把握できますでしょうか?
定跡ファイル、直接テキストエディタで開いて、”sfen”と書いてある文字列の数を数えるだとか?
grepがあるなら-cオプションで該当した行数が数えられるので
> grep -c “sfen”
とか。
ありがとうございます。
最後に一つ、テラショック定跡を延長させるにはどうすれば良いでしょうか?
大会中ですが、よろしくお願いします。
私は、
> makebook extend_tree …
使って延長してました。使い方は、docs/解説.txtにあります。
①テラショック定跡をextend_treeで延長
②build_treeを適用
みたいな感じでしょうか?
はい、そういうシェルスクリプトを書いて、それをJenkinsでひたすら回しておりますです。
すみません、
それを何回か回していると、定跡を作れば作るほど、容量が下がるという謎現象にぶち当たったのですが、バグでしょうか?
私の環境ではそんなことは起きたことがないです。
どの局面かが消えているのでしょうから、その消えてる局面を探したほうがいいような?(WinMergeなどのテキスト差分比較ツールを使えばわかるはず..)
通常のやねうら王形式の定跡からテラショック定跡にした際に-28000という評価値が混入してしまいます。最新版のやねうら王をビルドして試してみても改善しませんでした。検討や対局での利用には全く問題ないのですが評価値が大きすぎる怪しい値すぎて気になる方がちょくちょくいらっしゃるようです。
700テラショック定跡にも-28000は混入しているようですので、こちらの定跡ファイル固有の問題ではなさそうかなと。
-28000って、千日手スコア(劣等局面)ではないですかね…。駒をただであげちゃう変化ですね。その変化、結局、採用しないから、問題ないような気がするのですけども。
なるほど!
無知で申し訳ないです。あっさり疑問が解決しました、ありがとうございます。
結局のところ採用しないから問題ない、というのは同感です。ただ、序盤で28000という数字にびっくりしてしまう方は、一定数いそうな気がします。(私のように劣等局面のスコアのことを知らない人だとか。知っていればなんてことないと思うのですけども)
やねうら王で作成した定跡は公開するときGPL3を引き継がなければならないのでしょうか?
ライセンス関係が良く分かりません。
gcc/clangでコンパイルしたものがGPLに感染しないのと同じ理屈で、定跡ファイルはGPLには感染しないと考えられます。(`・ω・´)b
バグ?のご報告です。
やねうら王の700テラショック定跡をextend_treeで延長し、テラショック化しようとしましたが、テラショック化の時に、ファイルが生成されません。
コマンド
YaneuraOu_NNUE_KPE9-normal-clang++-zen2.exe threads 32 , makebook build_tree user_book1.db koron.db black_contempt 50 white_contempt 150 , quit
です。
> YaneuraOu_NNUE_KPE9-normal-clang++
これが何だか知りませんけども、定跡絡みのコマンド生きているようにビルドしていないだとか?
こちら↓でも同様の現象が起きますでしょうか?
https://drive.google.com/open?id=1JQKSO0VlSWccHCl9LqWLBUJXKA1eq9dv
同じ現象が起きましたね、、、
もしかして、テラショック化されている所に普通の定跡を混ぜたのが影響したのでしょうか?
うおー、、あとで調べてみます..
お願いします!
ちょっと調べてみました。
readsfen.txtに↓これを書きました。
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h
user_book2.dbはメールで送っていただいたファイルをそのまま使いました。
bookfile no_book
makebook extend_tree book/user_book2.db book/read_sfen.txt book/write_sfen.sfen black_eval_limit -99999 white_eval_limit -99999
を実行しました。そして、出力されたwrite_sfen.txtを見ると
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 3c3d
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 5c5d 2f2e
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 5c5d 3i3h
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 5c5d 3i4h
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 8c8d 2f2e
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 8c8d 3i3h
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 8c8d 7i6h
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 9c9d
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 8b5b 2f2e
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 8b5b 9g9f
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 8b5b 7i6h
こうなっていました。なので、↓これが再現できません。
> 7g7f 3a4b 2g2f 4a3b 6i7h 9c9d
> 7g7f 3a4b 2g2f 4a3b 6i7h 3c3d
> の局面が延長されてませんでした。(手動で延長する前はもっとたくさんありました。)
readsfen.txtも貼り付けてもらえないでしょうか。10行以上あるのでしたら、メールででも。
あと、局面が末端で合流する場合は、片側の経路は出力されないです..今回の場合、それに該当するような気がします。
申し訳ありません。私の書き方が悪く、伝わりきっていなかったようです。
私の報告したバグと思われるものは、
6手目で、後手が3c3d、9c9d指した局面で、先手のそれに対する指し手が登録されておらず、この7手目の局面は思考対象になるはずが、されていない、という事です。
つまり、
やねうら王上では、write_sfenにある6手目の後手の指し手に対して、7手目の先手の応手が全て登録されていることになっています。
なので、本来、7手目まで全て登録されているなら
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 9c9d
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 3c3d
ではなく、
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 9c9d [先手の応手]
x MultiPv個
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 3c3d [先手の応手]
x MultiPv個
となるはずです。
なので、状況は再現されいると思われます。
(改めて、私の説明力不足をお詫びします。又、この文章で分からない所等があれば、お尋ね頂ければ幸いです。)
今日、このあと調べますので、しばしお待ちを…。
まず、read_sfen.txt
> startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h
この局面は、定跡DB上にある、以下のsfenが該当します。
> sfen lnsgk2nl/1r3sgb1/ppppppppp/9/9/2P4P1/PP1PPPP1P/1BG4R1/LNS1KGSNL w – 6
> 8c8d 2f2e -45 24 488
> 9c9d 9g9f -68 24 488
> 5c5d 9g9f -92 24 488
> 8b5b 2f2e -100 24 488
> 3c3d 8h2b+ -112 24 488
ここに9c9dは登録されているので、9c9dの指し手は延長されますが、その応手である9g9fまで延長されていないということですよね?であれば、これは仕様です。: ①
一応、確認ですが、送っていただいた、この定跡DB上に、
startpos moves 7g7f 3a4b 2g2f 4a3b 6i7h 9c9d
で進めた局面である、
> sfen lnsgk2nl/1r3sgb1/1pppppppp/p8/9/2P4P1/PP1PPPP1P/1BG4R1/LNS1KGSNL b – 7
は登録されていないので、この局面での指し手は存在しないことになります。なので、この局面からは延長できないです。
それで①の仕様となっている合理的な理由なのですが、どうせ延長したあと、この局面に対して思考させるはずで、それときに次の局面への指し手が得られますし、そのときに得られるPVはいまより1手先での思考なので1手深くまで読んでいることに相当し、そちらのほうが質が高い(実戦で実現可能性の高い)指し手のはずで、現時点で得られている応手(9g9f)とは異なる可能性があって、9g9fを指した局面にまで現時点で延長してしまうと、この9g9fを指した局面でこのあと思考させても、無駄になる可能性があります。
つまり、いますぐにそこまで延長させることで、得られるメリットがほとんどないのに、デメリットだけが存在する感じなので延長していない仕様となっています。
やね師匠、よくみたら、korokoroさんへの返信となっていますが、内容からして私への返信と捉えましたが、私への返信という理解でよろしいでしょうか…..?
変なところにレスしてました。しゅみません(´ω`)
私のほうで同じ条件で試してみたのですが、普通に書き出せているようです。
user_book1.dbをbook/に格納しているのでしたら、user_book1.dbと指定しているところ、book/user_book1.dbと書かないといけませんけども、それが原因ではなく?
あとは、batファイルか何かでそのコマンドを実行するとエラーが表示されていてもわからなくなるので、普通にまず実行ファイルをダブルクリックで実行したあとにコマンドを入力してみて、それで何のエラーが出ているかを確認していただけますでしょうか。
>sfen lnsgk2nl/1r3sgb1/1pppppppp/p8/9/2P4P1/PP1PPPP1P/1BG4R1/LNS1KGSNL b – 7は登録されていないので、この局面での指し手は存在しないことになります。なので、この局面からは延長できないです。
これが登録されていない、というのがおかしいと思われます。何故なら、
> 8c8d 2f2e -45 24 488
> 9c9d 9g9f -68 24 488
> 5c5d 9g9f -92 24 488
> 8b5b 2f2e -100 24 488
> 3c3d 8h2b+ -112 24 488
この定跡を延長して7手目の指し手を思考させれば、
8c8d,9c9d,5c5d,8b5b,3c3dに対する応手全てが登録(思考対象と)されるはずです。であるのに、9c9d,3c3dは登録されないのに、5c5d,8b5b,3c3dは登録されています。
これはおかしい気がします。
テラショック化すると定跡容量が減るのは何故でしょうか?
初期局面から辿れない局面が枝刈りされる&別手順で同一局面に突っ込む場合、一つにまとまる
からではないかなと。
テラショック化された定跡には、
とある局面で、とある指し手が其の局面の候補手に無くても、とある指し手を指した局面が定跡に登録されていればその候補手はテラショック化された際に書き出されますよね?
又、とある局面で、其の局面の候補手を指した局面が定跡に登録されていなければ其の候補手は深さが0として登録されますでしょうか?