# PolicyBook

PolicyBook は、定跡データベースの手の分布を[方策・価値ネットワーク](/shogi/shogiwiki/evaluation-function/policy-value-network/)の policy prior と組み合わせて使う考え方である。

[AlphaZero](/shogi/shogiwiki/alphazero/) 型の[モンテカルロ木探索(MCTS)](/shogi/shogiwiki/search/monte-carlo-tree-search/)では、ニューラルネットワークが各合法手の事前確率を出し、[PUCT](/shogi/shogiwiki/search/puct/) がその prior を使って探索を進める。純粋な AlphaZero では、人間の定跡データベースを明示的に使わず、自己対局から opening knowledge も学習する。

一方、実用的な将棋エンジンでは、既存棋譜や自己対局・探索結果から作った定跡データを、序盤の安定化や定跡作成、学習データ生成に使うことがある。PolicyBook は、この定跡データを単に「即指しする手」として使うだけでなく、MCTS の prior として混ぜる点が特徴である。

## 通常の定跡との違い

通常の定跡利用では、現在局面が定跡データベースにあれば、その中から一手を選んで指す。探索に入る前に定跡手を返すため、定跡の範囲内では探索やニューラルネットワーク評価を省略できる。

PolicyBook 的な利用では、定跡を即指しに使うだけではなく、探索中の候補手分布に反映する。

- 定跡の出現回数や遷移回数から手の分布を作る。
- policy network の prior と定跡分布を加重平均する。
- 場合によっては value も定跡側の評価値と混ぜる。
- MCTS は混ぜた prior/value を使って探索を続ける。

このため、PolicyBook は「定跡で探索を止める」仕組みというより、「定跡を探索の事前知識として使う」仕組みである。

## dlshogiでの例

DeepLearningShogi には `BOOK_POLICY` 条件付きの実装があり、`selfplay/self_play.cpp` と `usi/UctSearch.cpp` に同様の処理がある。

`selfplay/self_play.cpp` では、`use_book_policy` が有効な場合、`book_file` から `BookEntry` を読み込み、局面キーごとに `bookMap` へ保存する。探索で leaf node をニューラルネットワーク評価したあと、合法手ごとの network policy を softmax で正規化し、その後に定跡分布を混ぜる。

実装上は、定跡エントリの `count` から手ごとの `bookrate` を作り、次のように policy prior を混ぜている。

```cpp
uct_child[j].nnrate = (1.0f - alpha) * uct_child[j].nnrate + alpha * bookrate;
```

ここで `alpha` は `0.5f` であり、network policy と book policy を半分ずつ混ぜる形になっている。また、value についても定跡エントリの score から作った値と value network の出力を同じ `alpha` で混ぜている。

```cpp
value_win = (1.0f - alpha) * value + alpha * score_to_value(entries[0].score);
```

USI エンジン側でも `Use_Book_Policy` が有効な場合、`Book_File` を読み込み、`UctSearch.cpp` の `EvalNode` で同様に policy/value へ定跡情報を混ぜる。

## 定跡データの作成

PolicyBook の効果は、定跡データの作り方に強く依存する。

DeepLearningShogi には、定跡を扱う補助スクリプトや USI コマンドが複数ある。

- `dlshogi/utils/csa_to_book.py`
CSA 棋譜から局面キーと指し手出現回数を集計し、binary book または やねうら王形式の定跡を作る。
- `dlshogi/utils/merge_book.py`
複数の book を比率付きでマージする。
- `dlshogi/utils/yanebook_to_book.py`
やねうら王形式の定跡を DeepLearningShogi の `BookEntry` 形式へ変換する。
- `usi/main.cpp` の `make_book`
MCTS の探索結果から、訪問回数や勝率しきい値を使って定跡エントリを作る。

`make_book` では、探索後の子ノードを訪問回数順に見て、訪問回数比率や勝率差に基づいて採用手を選び、`BookEntry` の `count` と `score` を作る。つまり、自己対局棋譜だけでなく、探索結果からも定跡分布を作れる。

## MCTSで使う意味

MCTS で policy prior を使う場合、序盤の広い合法手集合の中でどの手を先に探索するかが重要になる。PolicyBook を使うと、定跡データが多く支持する手へ探索を寄せやすくなる。

期待できる効果は次の通りである。

- 序盤で明らかに悪い手へ探索を使いすぎることを減らす。
- 既存棋譜や探索済み定跡の知識を MCTS に反映できる。
- 自己対局や教師データ生成の序盤分布を制御しやすくなる。
- 定跡作成と MCTS 探索を接続しやすくなる。

ただし、定跡データを混ぜると、network が本来出している policy 分布からは離れる。古い定跡、偏った棋譜、評価の低い定跡を強く混ぜすぎると、探索や学習データを悪い方向に誘導することがある。

## AlphaZeroとの関係

AlphaZero 論文の文脈では、policy は自己対局で学習されたニューラルネットワークの出力であり、人間の定跡データベースを直接参照するものではない。研究としての「ゼロからの学習」を強調する場合、PolicyBook は AlphaZero そのものとは別の実用的な拡張である。

一方で、実戦用エンジンや学習データ生成では、純粋性よりも安定性、再現性、序盤品質、計算資源の節約が重要になる。その場合、PolicyBook は policy network、MCTS、定跡データベースをつなぐ実用的な部品として位置づけられる。

## 注意点

PolicyBook を使うときは、次の点に注意する必要がある。

- 定跡データの由来、棋力、時期、重複を確認する。
- book の `count` が確率分布として妥当かを確認する。
- value として使う score が、network value と同じ意味・スケールになっているかを確認する。
- `alpha` を大きくしすぎると、network policy より book が支配的になる。
- 自己対局の多様性を狭めすぎないようにする。
- 対局用の定跡即指しと、MCTS prior としての book policy を混同しない。

## 関連項目

- [dlshogi](/shogi/shogiwiki/softs/dlshogi/)
- [方策・価値ネットワーク](/shogi/shogiwiki/evaluation-function/policy-value-network/)
- [モンテカルロ木探索(MCTS)](/shogi/shogiwiki/search/monte-carlo-tree-search/)
- [PUCT](/shogi/shogiwiki/search/puct/)
- [定跡自動生成](/shogi/shogiwiki/search/joseki-automatic-generation/)
- [自己対局](/shogi/shogiwiki/self-play/)

## 参考にしたホームページ

- DeepLearningShogi `selfplay/self_play.cpp`  
  [https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/selfplay/self_play.cpp](https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/selfplay/self_play.cpp)
- DeepLearningShogi `usi/UctSearch.cpp`  
  [https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/usi/UctSearch.cpp](https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/usi/UctSearch.cpp)
- DeepLearningShogi `usi/main.cpp`  
  [https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/usi/main.cpp](https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/usi/main.cpp)
- DeepLearningShogi `dlshogi/utils/csa_to_book.py`  
  [https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/dlshogi/utils/csa_to_book.py](https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/dlshogi/utils/csa_to_book.py)
- OpenSpiel AlphaZero documentation  
  [https://openspiel.readthedocs.io/en/stable/alpha_zero.html](https://openspiel.readthedocs.io/en/stable/alpha_zero.html)
- Lc0 AlphaZero primer  
  [https://draft.lczero.org/dev/lc0/search/alphazero/](https://draft.lczero.org/dev/lc0/search/alphazero/)