アルゴリズム解説 基本構造 ゲームルールを次のように考えます。
S k = { S 0 k = 0 F ( S k − 1 , A k ) k > 0 S_k=\begin{cases}
S_0 & k=0 \\
F(S_{k-1}, A_k) & k>0
\end{cases}
S k = { S 0 F ( S k − 1 , A k ) k = 0 k > 0
つまり、ゲームルールは「初期状態 S 0 S_0 S 0 」と「前の状態 S k − 1 S_{k-1} S k − 1 と行動 A k A_k A k が与えられると次の状態 S k S_k S k を返す関数 F F F 」の2つから構成されます。
AlphaZero は、ある状態 s s s にあるとき最適な行動 a a a は何かを評価する汎用アルゴリズムです。手順最適化ソルバーとでも呼べば良さそうです。予め s s s や a a a がどのような意味を持っているかを与える必要はありません。強化学習の中で、自分で見つけます。
例えば囲碁であれば、自分の石で囲めば得点になる等の情報は必要ありません。
AlphaZero は相互に影響し合う 2 種類の評価戦略を持っています。
新しい体験に基づく評価 (先読みによる最適手探索) 過去の体験に基づく評価 (value/policy netowrks) どの手を優先して先読みするか? (policy network) 先読みした結果の価値は? (value network) 強化学習によるフィードバック 新しい体験に基づく評価 ... 現在の状態 S m S_m S m から手順の先読みを行い、先読みした状態 S f S_f S f の評価を元に、S m S_m S m での各行動 A n A_n A n の価値を決定します。過去の体験に基づく評価 ... 過去の体験を元に、任意の状態 s s s の価値と、s s s における各行動 a a a の価値を決定します。すべての手順を先読みすることは現実的ではないため、過去の体験に基づいて先読みする手順の優先順位を決め、先読みした結果を評価します。
そして、先読みした結果の評価を元に現在の状態における各行動の価値を決定します。
最終的に勝敗がつくと、その勝敗と手順を元に過去の体験 (ニューラル ネットワーク) を更新します。
エレガントな構造ですね。
モンテカルロ木探索 先読みに関する記憶を保持・更新するために木構造 (厳密には有向非循環グラフ ) を利用します。各ノードは状態 s s s を、各エッジは行動 a a a を表します。
先読み評価は次の手順で行います。
木構造の根は常に現在の状態 S m S_m S m です。 適当な葉 S l e a f S_{leaf} S l e a f (末端のノード) を選択します。
「評価が高いエッジを選び、次の状態 S k S_k S k へ移動」を葉まで繰り返します。 エッジの評価は、先読み評価値と policy network の評価値を組み合わせた値を使います。以下の U Q ( s , a ) UQ(s,a) U Q ( s , a ) です。P ( s , a ) = 状態 s における行動 a の policy network 評価値 N ( s , a ) = 状態 s における行動 a の先読み評価回数 W ( s , a ) = 状態 s における行動 a の先読み評価値の合計値 Q ( s , a ) = W ( s , a ) N ( s , a ) U Q ( s , a ) = C p u c t P ( s , a ) ∑ b N ( s , b ) 1 + N ( s , a ) + Q ( s , a ) \begin{aligned}
P(s,a) &= \text{状態 s における行動 a の policy network 評価値} \\
N(s,a) &= \text{状態 s における行動 a の先読み評価回数} \\
W(s,a) &= \text{状態 s における行動 a の先読み評価値の合計値} \\
Q(s,a) &= \frac{W(s,a)}{N(s,a)} \\
UQ(s,a) &= C_{puct} P(s,a) \frac{\sqrt{\sum_b N(s,b)}}{1+N(s,a)} + Q(s,a)
\end{aligned}
P ( s , a ) N ( s , a ) W ( s , a ) Q ( s , a ) U Q ( s , a ) = 状態 s における行動 a の policy network 評価値 = 状態 s における行動 a の先読み評価回数 = 状態 s における行動 a の先読み評価値の合計値 = N ( s , a ) W ( s , a ) = C p u c t P ( s , a ) 1 + N ( s , a ) ∑ b N ( s , b ) + Q ( s , a )
どうやら先読み評価していないエッジの policy network 評価が徐々に上昇していく式になっているようです。これにより、先読みの漏れを防止します。 葉の状態を Value network と Policy network で評価します。 葉で実施可能な全行動について f ( S l e a f , a ) f(S_{leaf}, a) f ( S l e a f , a ) を計算して、葉にエッジとノードを追加します。
このとき各エッジに Policy network による評価値を P ( s , a ) P(s,a) P ( s , a ) として保存しておきます。 根から葉に至る経路の全エッジに、葉の Value network の評価値を反映 (backfill) させます。N ( s , a ) = N ( s , a ) + 1 W ( s , a ) = N ( s , a ) + v Q ( s , a ) = W ( s , a ) N ( s , a ) \begin{aligned}
N(s,a) &= N(s,a) + 1 \\
W(s,a) &= N(s,a) + v \\
Q(s,a) &= \frac{W(s,a)}{N(s,a)} \\
\end{aligned}
N ( s , a ) W ( s , a ) Q ( s , a ) = N ( s , a ) + 1 = N ( s , a ) + v = N ( s , a ) W ( s , a )
最適行動の選択は次の手順で行います。
木構造の根は常に現在の状態 S m S_m S m です。 先読み評価の N ( s , a ) N(s,a) N ( s , a ) が最も大きいエッジを選択します。 木構造の根を「選択したエッジが繋がる次のノード」に変更します。 評価値ではなく、評価回数を使うのが意外なところ。
評価が高いと先読み経路に選択される回数が増えるという理屈らしいです。
Value/Policy ネットワーク TBD.
ゲームルールの与え方 TBD.