Dirichlet noise

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

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

基本形

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

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 では、方策 prior P(s, a) が探索ボーナスに入る。したがって、ルートの P(s, a) に Dirichlet noise を混ぜると、初期の探索配分が変わる。

これは、最終的に指す手をランダムにすることとは少し違う。Dirichlet noise は MCTS の探索前に prior を揺らす。一方、温度パラメータ は 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 noisedlshogi の root_noise を区別しておくとよい。

関連項目

参考にしたホームページ