ノード:局面 ( [盤面, 手番] ) を,探索木の分枝点と見る
a (手)
s (局面) ─→ s' (局面)
- Policy に,局面 ( [盤面, 指し手] ) を入力
Policy は,手番の有望手の順位を返す
全手:a_1, a_2, ‥‥, a_K
- 有望度の高い手から優先的に読む
有望な手 → 深く読む
望み薄の手 → ほとんど読まない
- 新訪問のノード (局面) で,
Value に,局面 ( [盤面, 指し手] ) を入力
Value は,手番が勝つ可能性 ( 区間 [-1,1] の実数) を返す
可能性が高い → 局面を進める
可能性 が低い → 局面を止める
- 探索結果を統合
a_1, a_2, ‥‥, a_K の「訪問回数」を集計し,
最も訪問された手を選ぶ : a_k
- その手を,手番の有望手として出力
○「新訪問のノード (局面) で」の詳細
- 新訪問のノード s に到達
新訪問 = 未展開(unexpanded, その先に枝がない)
- Policy に,局面 s を入力 ( [盤面, 手番] )
Policy は,手番の有望手を,確率分布の形で出力
全手:a_s1 , ‥‥, a_sK
ノードに次の情報を保存:
P(s,b) = p_b:局面 s での手 b の確率 ( b = a_s1, ‥‥, a_sK )
N(s,b) = 0:訪問回数
W(s,b) = 0:累積価値
Q(s,b) = 0 :平均価値 ( N ≠ 0 では W/N )
- Value に,局面 ( [盤面, 手番] ) s を入力
Value は,手番が勝つ可能性を,[-1, 1] の実数 v_s で出力
- 逆伝播
探索木を逆方向に伝播して
各手 a の評価を更新:
訪問回数 : N(s,a) ← N(s,a) +1
累積価値 : W(s,a) ← W(s,a) + v
- 手に順位をつける
順位をつける式 PUCT(Predictor + UCT) :
U(s,a) = c⋅P(s,a)⋅√( ∑_b N(s,b) ) / ( 1 + N(s,a) )
そして
選択する手 a_t = argmaxa( Q(s,a) + U(s,a) )
- 順位の高いものから探索
P(s,a) が大きい手 a は
→ 最初から優先的に読まれる
N(s,a) が増えると U が減る
→ 読みすぎを防ぐ
Q(s,a) が良い手は
→ 深く読まれる
○ 流れ図
|
1. 現在の局面 ([盤面, 手番]) s を,AlphaZero に入力
|
│
↓
2. NN(Policy/Value ネット)に s を入力
・Policy : P(s, a) = 各手の確率ベクトル
・Value : v(s) = 勝率(-1〜+1)
|
│
↓
3. MCTS のノード(s)を展開(expand)
・P(s, a) をノードに保存
・N(s, a) = 0(訪問回数)
・W(s, a) = 0(累積価値)
・Q(s, a) = 0(平均価値)
|
│
↓
4. MCTS の「選択」フェーズ
・PUCT 式で手 a を選ぶ
Q(s,a) + U(s,a)
・P(s, a) が高い手 a は優先される
|
│
↓
5. 次の局面 s' に進む
a (手)
s (局面) ─→ s' (局面)
・s' が未展開なら NN に s' を入力(再帰)
・展開済みなら Q と N を使って続行
|
│
↓
6. v(s) を「バックアップ」
・探索経路の各 (s, a) に対して:
N(s,a) ← N(s,a) + 1
W(s,a) ← W(s,a) + v(s)
Q(s,a) ← W(s,a) / N(s,a)
|
│
↓
7. これを数千回繰り返す(内部ループ)
・Policy が探索を導く
・Value が探索を評価する
・MCTS が探索を最適化する
|
│
↓
○ 要約
NN (Policy/Value) が「判断」を返す
MCTS がその判断を使って探索する
Value が探索結果を逆流して評価を更新する
更新された Q が次の選択に影響する
これが何千回も回る
|