1.2くらいから考える将棋ブログ

わかった気になるも、よくわからないことを考えていく?

やねうら王の定跡オプションについての覚え書き

防備録も兼ねて

一部のオプションってしばらく使わないと忘れるし、日本語化しても微妙に意味が分かりづらいものあるよねってことで、局面例などと共にメモ書きとして残す(予定)

主な定跡関係のオプションは以下となる

やねうら王定跡絡みオプション
USIオプション(原文)  将棋所での日本語訳   私の理解とか補足 
NarrowBook 出現確率の低い定跡を採用しない NarrowBookだけだと、UseNarrowBook(出現確率の低い定跡を採用する)とも読み取れるので、AvoidNarrowBookとかに改名してほしい。False時、採用するのかしないのかでしばしば混乱する。
BookMoves 定跡を用いる手数(0=未使用) 128が最大?
BookIgnoreRate   一定の確率で定跡を無視して自力で思考させる。QhapaqさんのPR
BookFile 読み込む定跡ファイル  
BookDir   定跡ファイルがあるディレクト
BookEvalDiff 定跡の第一候補手との評価値の差、定跡の幅(0=無,30=狭,100=広)

値を広くするほど手は広くなる。

BookEvalBlackLimit 定跡の先手の評価値下限、定跡で採用する評価値下限(先手)

振り飛車とかを指させたいときはマイナスにする。(先手不利になる指し手も指させる)

BookEvalWhiteLimit 定跡の後手の評価値下限、定跡で採用する評価値下限(後手) 採用手を広げる場合、より低い値にする。(後手不利な手も許容する)0に近づければ指し手は狭まる。
BookDepthLimit 定跡のdepth下限(0=下限なし) ※テラショック形式とそれ以外で動作が異なる)
BookOnTheFly 定跡をメモリに丸読みしない  
ConsiderBookMoveCount 定跡の指し手を採択率に比例させる NarrowBookとの組み合わせが分かりづらい
BookPvMoves   定跡にヒットしたときに読み筋を何手先まで表示するか。
IgnoreBookPly   定跡DB上の手数を無視する。角換わりとかで重要らしい。将棋の定跡でgameply(初期局面からの手数)って要ります?
BookOnlyThinkingMove 定跡では思考した指し手のみ用いる このオプションあったっけ?

 

以下の局面を例としてオプションによる挙動をみていく。

基本局面

sfen lnsgkgsnl/1r5b1/p1ppppppp/1p7/9/2P6/PP1PPPPPP/1B5R1/LNSGKGSNL b - 3

いわゆる76歩に84歩とした局面である。

使用する定跡

A. やねうら標準定跡:出現頻度の情報付き、評価値の情報なしの定跡 (standard_book.db)

B. 極やねうら定跡:depth34で作った評価値付きの小さな定跡、出現頻度情報なし (yaneura_book4.db) (※極やねうら定跡は将棋神やねうら王に収録されている。)

C. 100テラショック定跡(WCSC29時点 , 700T):depth36相当以上で作った評価値付きの大きな定跡、出現頻度情報なし(user_book2.db)

 

A. 標準定跡形式での関連オプションと挙動

やねうら標準定跡で基本局面の指し手は以下のようになっている。

sfen lnsgkgsnl/1r5b1/p1ppppppp/1p7/9/2P6/PP1PPPPPP/1B5R1/LNSGKGSNL b - 3
7i6h 3c3d 0 32 3174
2g2f 3c3d 0 32 1598
5g5f 3c3d 0 32 650
6i7h 4a3b 0 32 518
7i7h 3c3d 0 32 277
2h6h 3c3d 0 32 155
1g1f 3c3d 0 32 143
6g6f 3c3d 0 32 106
8h7g 3c3d 0 32 78
2h7h 8d8e 0 32 70
4i5h 3c3d 0 32 5
3i4h 3c3d 0 32 1

標準定跡形式では、評価値は0であるため、指し手は頻度をもとに決定される。

 そこで重要となるオプションがNarrowBookConsiderBookMoveCountである。

そこでこの局面に対して、それぞれのオプションのON/OFFで指し手がどう変化したかを示す。それぞれのオプションで100回指し手を確認した。

1. NarrowBook: TrueConsiderBookMoveCount: True

7i6h: 68回
2g2f: 32回

2. NarrowBook: TrueConsiderBookMoveCount: False

7i6h: 50回
2g2f: 50回

3. NarrowBook: FalseConsiderBookMoveCount: True

7i6h: 47回
2g2f: 24回
5g5f: 11回
6i7h:  8回
7i7h:  5回
2h6h:  3回
8h7g:  1回
2h7h:  1回

4. NarrowBook: FalseConsiderBookMoveCount: False

7i6h: 11回
2g2f: 13回
5g5f: 11回
6i7h:  7回
7i7h:  7回
2h6h:  9回
1g1f:  8回
6g6f: 10回
8h7g:  1回
2h7h:  8回
4i5h:  8回
3i4h:  7回

以上の結果となった。

これをふまえ、それぞれのオプションの挙動を整理する。

NarrowBook

Trueの時→採用される指し手が減る

Falseの時→特になにも起きない

実際に、NarrowBook Trueの時のログを確認する。

position startpos moves 7g7f 8c8d
<1:info pv 3i4h 3c3d 6g6f 8d8e 8h7g 5c5d (0.01%) score cp 0 depth 32 multipv 12
<1:info pv 4i5h 3c3d 6g6f 8d8e 8h7g 7a6b (0.07%) score cp 0 depth 32 multipv 11
<1:info pv 2h7h 8d8e 8h7g 3c3d 6g6f 5a4b (1.03%) score cp 0 depth 32 multipv 10
<1:info pv 8h7g 3c3d 7i8h 4a3b 3i4h 6c6d (1.15%) score cp 0 depth 32 multipv 9
<1:info pv 6g6f 3c3d 2h6h 7a6b 1g1f 5a4b (1.56%) score cp 0 depth 32 multipv 8
<1:info pv 1g1f 3c3d 6g6f 7a6b 7i7h 5a4b (2.11%) score cp 0 depth 32 multipv 7
<1:info pv 2h6h 3c3d 6g6f 7a6b 3i3h 5a4b (2.29%) score cp 0 depth 32 multipv 6
<1:info pv 7i7h 3c3d 6g6f 7a6b 2h6h 5a4b (4.09%) score cp 0 depth 32 multipv 5
<1:info pv 6i7h 8d8e 8h7g 3c3d 7i6h 4a3b (7.65%) score cp 0 depth 32 multipv 4
<1:info pv 5g5f 7a6b 7i6h 7c7d 6h5g 8d8e (9.59%) score cp 0 depth 32 multipv 3
<1:info pv 2g2f 3c3d 2f2e 8d8e 6i7h 4a3b (23.59%) score cp 0 depth 32 multipv 2
<1:info pv 7i6h 3c3d 6g6f 7a6b 5g5f 5c5d (46.85%) score cp 0 depth 32 multipv 1
<1:info string NarrowBook : 12 moves to 2 moves.

 もともとこの局面では12個の指し手が登録されていたが、NarrowBookオプションにより、10%以下の指し手を取り除かれ、指し手が2個まで減らされている。

そのため、幅広い指し手の局面など、10%以下の候補手が多く存在するような局面では、指し手が偏ってしまう。 (第1候補手が13%、第2~第5候補手が9~8%などの場合、第1しか選ばれない?)

 

ConsiderBookMoveCount

Trueの時→採択率に応じた指し手が選ばれる→メジャーな手が出やすい

Falseの時→やや珍しい応手が現れやすい(ように感じる)

 1と2、3と4を比較してみるとわかるが、ConsiderBookMoveCountがFalseの際、採択率下位の指し手が選ばれやすくなっていることがわかる。

 

まとめ

ここまでの結果を踏まえるとNarrowBook, ConsiderBookMoveCountとの付き合い方は次のような感じになる。(※個人の感想です。)

① 珍しい応手も見たい(ソフトvs人など?)→NarrowBook, ConsiderBookMoveCount共にFalse

② マイナーな変化に突っ込んで自爆するのを見たくない(ソフトvsソフトなど?)→

NarrowBook, ConsiderBookMoveCount共にTrue

③ 同じような変化ばっかりで飽きるが②は避けたい→NarrowBook True, ConsiderBookMoveCount False

④ ③にしたがマイナーな変化が多いと感じる→NarrowBook False, ConsiderBookMoveCount True, もしくは①の設定

 

参考:やねうら王のbook.cpp

参考:定跡データベースの採択率に比例して指し手を選択するオプション by nodchip · Pull Request #24 · yaneurao/YaneuraOu · GitHub

 

B. 極やねうら定跡での関連オプションと挙動

極やねうら定跡で、基本局面での指し手は以下のようになる。

sfen lnsgkgsnl/1r5b1/p1ppppppp/1p7/9/2P6/PP1PPPPPP/1B5R1/LNSGKGSNL b - 3
2g2f 3c3d 81 34 479
8h7g 4a3b 48 34 479
6i7h 8d8e 43 34 479
1g1f 3c3d 42 34 479
7i6h 3c3d 40 34 479
7i7h 3c3d 36 34 479
5i5h 3c3d 25 34 479
3i3h 3c3d 15 34 479
6g6f 3a3b 14 34 479
3i4h 3c3d -19 34 479

評価値付きの定跡形式では、出現頻度項は同じ値になっている(この場合479)ことが想定されているので、 ConsiderBookMoveCountは意味を持たない(True/Falseで変化がない)。一方でNarrowBookはFalseにしておいた方が良さそうである。定跡形式の仕様上全ての指し手は当確率で存在しているので、ある局面において登録されている指し手が10個以上ある場合(実在するかは知らないが)、NarrowBookがTrueであると指し手が一個も選ばれなくなってしまうからである。

参考画像

f:id:jotcutJshakki:20190616220815p:plain

評価値付きの定跡形式においては、BookEvalDiff, BookEvalBlackLimit, BookEvalWhiteLimit が指し手の絞り込みに使われる。

この中で定跡手を一切指さなくなる可能性のあるオプションはBookDepthLimitであり、この値より低い(浅い)深さの指し手は採用されない。

BookDepthLimitによって採用されない例

f:id:jotcutJshakki:20190616225528p:plain

残りのBookEvalDiff, BookEvalBlackLimit, BookEvalWhiteLimit については、例えば指させたい手が第一候補手がからどの程度離れているかを数局面で確認し、自分なりの閾値を決めるといいと思う。

例えば以下の局面、人間的には中飛車・向飛車志向の局面であるが、極定跡での登録応手は以下のようになっている。

sfen lnsgkgsnl/1r5b1/p1pppp1pp/1p4p2/9/2P1P4/PP1P1PPPP/1B5R1/LNSGKGSNL b - 5

sfen lnsgkgsnl/1r5b1/p1pppp1pp/1p4p2/9/2P1P4/PP1P1PPPP/1B5R1/LNSGKGSNL b - 5
6g6f 8d8e -10 34 479    (6六歩)
3i4h 8d8e -63 34 479    (4八銀)
8h7g 2b7g+ -80 34 479   (7七角)
6i7h 8d8e -92 34 479    (7八金)
2g2f 8d8e -93 34 479    (2六歩)
2h5h 5a4b -94 34 479    (5八飛)
5f5e 7a6b -103 34 479   (5五歩)
1g1f 8d8e -103 34 479   (1六歩)
3g3f 8d8e -111 34 479   (3六歩)
8h2b+ 3a2b -126 34 479  (2二角成)
お分かりいただけるだろうか…振り飛車の評価の低さに…

ともかく、この局面で振り飛車を指させたい場合、2h5h(-94), 5f5e(-103), 8h2b+(-126), と定跡最善手6g6f(-10)を比較して、最善手よりも84~116評価を下げつつ、先手番でマイナスな手も許容するということで、BookEvalDiffを84以上、 BookEvalBlackLimitを-126以下にしなければこれらの手は採用されない。

同様に、後手番で飛車を振りそうな局面で考えてみる。

sfen lnsgkgsnl/1r5b1/ppppp2pp/5pp2/9/2P4P1/PP1PPPP1P/1B3S1R1/LNSGKG1NL w - 6

sfen lnsgkgsnl/1r5b1/ppppp2pp/5pp2/9/2P4P1/PP1PPPP1P/1B3S1R1/LNSGKG1NL w - 6
3a4b 2f2e -99 34 479
3a3b 2f2e -102 34 479
9c9d 2f2e -107 34 479
4a3b 2f2e -121 34 479
8c8d 2f2e -125 34 479
2b3c 5i6h -144 34 479
7a6b 2f2e -149 34 479
8b4b 9g9f -150 34 479
6a5b 2f2e -155 34 479
5c5d 2f2e -155 34 479

この局面で第一候補手が4二銀(-99)、飛車を振る手が4二飛(-150)なので、BookEvalDiffを61以上、 BookEvalWhiteLimitを-150以下にしなければこれらの手は採用されない。

 

C. テラショック定跡での関連オプションと挙動

テラショック定跡(700T)で、基本局面での指し手は以下のようになる。

sfen lnsgkgsnl/1r5b1/p1ppppppp/1p7/9/2P6/PP1PPPPPP/1B5R1/LNSGKGSNL b - 3
2g2f 8d8e 51 23 1
6i7h 4a3b 45 14 1
7i6h 3c3d 44 12 1
7i7h 3c3d 44 12 1
8h7g 3c3d 36 10 1
5i6h 8d8e 14 0 1
6g6f 7a7b 7 1 1
5i5h 3c3d 6 0 1
3g3f 3c3d 3 0 1
1g1f 3c3d 1 5 1
3i4h 3c3d -1 6 1
4i5h 3c3d -1 3 1
3i3h 3c3d -15 0 1
5g5f 3c3d -17 5 1
8h6f 4a3b -17 0 1
9g9f 3c3d -33 23 1
6i6h 3c3d -46 0 1
5i4h 3c3d -58 0 1
4i4h 3c3d -65 0 1
4g4f 8d8e -99 0 1
2h7h 7a7b -155 1 1
2h5h 1c1d -166 1 1
2h6h 8d8e -169 7 1
7f7e 5c5d -176 1 1

Bのやねうら極定跡項でも述べたが、極定跡よりも1局面あたりの登録応手が多いため、ますますNarrowBookはFalseにしておかなければならない。参考:100テラショック定跡、公開しました | やねうら王 公式サイト

あとは大体やねうら極定跡の時と同様に、BookEvalDiff, BookEvalBlackLimit, BookEvalWhiteLimit の閾値で指し手の範囲が決定される。

注意点として、定跡の深さ項の意味が変わり、最小値が0となっているので、BookDepthLimitは0としなければならない。

 

まとめ

・どの定跡形式でも指し手の絞り込みに使われるオプション

BookDepthLimit:※定跡手が採用されるか否かに効くので実質絞り込みには不向き

・標準定跡(評価値なし、出現頻度付き)で指し手の絞り込みに使われるオプション

NarrowBook:
10%以下の指し手を絶対見たくないときはTrue、ConsiderBookMoveCountをTrueにした時はTrueもFalseもほぼ変わらない
ConsiderBookMoveCount:
定跡登録手を頻度に応じて指して欲しい時はTrue, 均等に指して欲しい時はFalse

 ・極定跡、テラショック定跡(評価値あり、出現頻度なし)で指し手の絞り込みに使われるオプション

BookEvalDiff, BookEvalBlackLimit, BookEvalWhiteLimit:値を広げることで多少不利でも幅広い変化を指すようになる。

 

参考:

定跡ファイルに関する設定:思考エンジンのオプションについて - Androidスマホの最強アプリ ShogiDroid(将棋ドロイド) Wiki*