# Dirichlet noise

Dirichlet noise は、[AlphaZero](/shogi/shogiwiki/alphazero/) 型の [モンテカルロ木探索(MCTS)](/shogi/shogiwiki/search/monte-carlo-tree-search/)で、ルート局面の方策 prior に加える探索用ノイズである。自己対局で同じ手ばかり選ばれることを避け、学習データの多様性を確保するために使われる。

日本語では `ディリクレノイズ` と表記されることもある。MCTS のすべてのノードに加えるのではなく、通常は各着手を選ぶ前のルートノードにだけ加える。

## 基本形

AlphaZero 論文では、ルートノードの方策 prior に次のようにノイズを混ぜる。

```text
P(s, a) = (1 - epsilon) * p_a + epsilon * eta_a
eta ~ Dir(alpha)
```

ここで `p_a` はニューラルネットワークが出した元の方策、`eta` は Dirichlet 分布からサンプリングした確率ベクトルである。`epsilon` は元の方策とノイズを混ぜる割合を表す。

AlphaZero 論文では `epsilon = 0.25` とされ、`alpha` は典型的な合法手数に反比例するように、チェスで 0.3、将棋で 0.15、囲碁で 0.03 とされている。

## なぜ必要か

自己対局では、現在のネットワーク自身が次の学習データを作る。もし方策ネットワークが序盤から特定の手だけを高く評価すると、MCTS もその周辺ばかりを読み、似た棋譜が大量に生成されやすい。

Dirichlet noise を加えると、ルートの方策 prior が少し揺らぎ、普段なら低く見積もられる手も探索される機会を得る。探索の結果、本当に悪い手なら訪問回数は伸びにくく、良い手なら発見される可能性がある。つまり、ノイズは弱い手を無理に指すためではなく、探索の入口を広げるために使われる。

## PUCT との関係

[PUCT](/shogi/shogiwiki/search/puct/) では、方策 prior `P(s, a)` が探索ボーナスに入る。したがって、ルートの `P(s, a)` に Dirichlet noise を混ぜると、初期の探索配分が変わる。

これは、最終的に指す手をランダムにすることとは少し違う。Dirichlet noise は MCTS の探索前に prior を揺らす。一方、[温度パラメータ](/shogi/shogiwiki/search/temperature/) は MCTS 後の訪問回数分布から実際の着手をどう選ぶかに関係する。どちらも自己対局の多様化に関わるが、作用する場所が異なる。

## 将棋での注意点

将棋は持ち駒の打ち手があるため、局面によって合法手数が大きく変わる。AlphaZero 論文では、将棋用の Dirichlet noise の `alpha` として 0.15 が使われている。これは、チェスより合法手数が多く、囲碁よりは少ないという典型的な分岐数を反映した値である。

`alpha` が小さいほど、サンプルされたノイズは少数の手に偏りやすくなる。`epsilon` が大きいほど、元の方策よりノイズの影響が強くなる。どちらも強くしすぎると探索が散りすぎ、弱くしすぎると自己対局の多様性が不足しやすい。

## dlshogi での位置づけ

DeepLearningShogi の `selfplay/self_play.cpp` には、ルートノードで方策 prior にノイズを加えるための `root_noise` オプションがある。実装上は `ROOT_NOISE` に応じて、ルートで選択された手の prior をランダムに強め、ノイズにより選ばれた回数を `noise_count` として記録する処理がある。

これは AlphaZero 論文の Dirichlet noise と同じ目的、つまり自己対局で探索の入口を広げるためのルートノイズである。ただし、実装式やパラメータ名が論文そのものと同一とは限らないため、記事やコードを読むときは `Dirichlet noise` と `dlshogi の root_noise` を区別しておくとよい。

## 関連項目

- [AlphaZero](/shogi/shogiwiki/alphazero/)
- [自己対局](/shogi/shogiwiki/self-play/)
- [モンテカルロ木探索(MCTS)](/shogi/shogiwiki/search/monte-carlo-tree-search/)
- [PUCT](/shogi/shogiwiki/search/puct/)
- [温度パラメータ](/shogi/shogiwiki/search/temperature/)
- [方策・価値ネットワーク](/shogi/shogiwiki/evaluation-function/policy-value-network/)
- [dlshogi](/shogi/shogiwiki/softs/dlshogi/)
- [探索パラメータの確率的最適化](/shogi/shogiwiki/search/search-parameter-optimization/)

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

- [David Silver, et al. "Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm"](https://arxiv.org/abs/1712.01815)
- [arXiv PDF: Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm](https://arxiv.org/pdf/1712.01815)
- [Nature: Mastering the game of Go without human knowledge](https://www.nature.com/articles/nature24270)
- [TadaoYamaoka/DeepLearningShogi](https://github.com/TadaoYamaoka/DeepLearningShogi)