← 機械学習テキスト 一覧
🎓 レベル:発展 | 重要度:A(必須)
📎 前提:価値関数とベルマン方程式 | 関連:誤差逆伝播法 (勾配)
要点(BLUF)
方策そのもの π θ ( a ∣ s ) \pi_\theta(a\mid s) π θ ( a ∣ s ) をパラメータ化し、期待リターン J ( θ ) J(\theta) J ( θ ) を勾配上昇 で直接最大化する手法です。価値を経由しません。
核心は方策勾配定理 ∇ θ J = E [ ∇ θ log π θ ( a ∣ s ) Q π ( s , a ) ] \nabla_\theta J = \mathbb{E}\!\left[\nabla_\theta\log\pi_\theta(a\mid s)\,Q^\pi(s,a)\right] ∇ θ J = E [ ∇ θ log π θ ( a ∣ s ) Q π ( s , a ) ] 。遷移確率を知らなくても、サンプルした行動の対数確率の勾配だけで勾配が計算できます。
Q Q Q をモンテカルロのリターンで置けば REINFORCE 。高分散なのでベースライン を引き、最終的に優位関数 A = Q − V A=Q-V A = Q − V に行き着きます。
1. なぜ価値ベースでは足りないのか
Q学習とSARSA のような価値ベースの手法は「各 ( s , a ) (s,a) ( s , a ) の良さ Q ( s , a ) Q(s,a) Q ( s , a ) を学び、arg max a Q \arg\max_a Q arg max a Q を取る」という間接的な枠組みです。これには構造的な限界があります。
連続行動空間が苦手 :arg max a Q ( s , a ) \arg\max_a Q(s,a) arg max a Q ( s , a ) は a a a が連続だと毎ステップ最適化問題を解くことになり、扱いにくい。
確率的方策を表現できない :価値ベースは決定的方策(ε \varepsilon ε -greedy を除けば)に偏ります。じゃんけんのようにわざと確率的に振る舞うのが最適 な状況や、部分観測(POMDP)で最適方策が確率的になる状況を素直に表せません。
方策の微小変化に弱い :Q Q Q がわずかに動くだけで arg max \arg\max arg max がジャンプし、学習が不安定になりやすい。
そこで発想を変えます。価値を経由せず、方策そのものをパラメータ θ \theta θ を持つ関数 として置き、θ \theta θ を直接動かして良くしていく。これが方策勾配法です。
π θ ( a ∣ s ) = (パラメータ θ を持つ、状態 s で行動 a を取る確率) \pi_\theta(a\mid s) \;=\; \text{(パラメータ }\theta\text{ を持つ、状態 }s\text{ で行動 }a\text{ を取る確率)} π θ ( a ∣ s ) = (パラメータ θ を持つ、状態 s で行動 a を取る確率)
実装上は、離散行動なら NN の出力をソフトマックスに通し、連続行動ならガウス分布の平均・分散を NN で出す、という形が定番です。
graph LR
subgraph V["価値ベース"]
V1["状態 s"] --> V2["Q(s,a) を学習"]
V2 --> V3["argmax_a Q を取る(間接)"]
end
subgraph P["方策ベース(方策勾配)"]
P1["状態 s"] --> P2["π_θ(a|s) を直接出力"]
P2 --> P3["勾配上昇で θ を更新(直接)"]
end
2. 目的関数と勾配上昇
最大化したいのは、方策 π θ \pi_\theta π θ に従って生成される軌道 τ = ( s 0 , a 0 , s 1 , a 1 , … ) \tau = (s_0, a_0, s_1, a_1, \dots) τ = ( s 0 , a 0 , s 1 , a 1 , … ) の期待リターン です。
J ( θ ) = E τ ∼ π θ [ G ( τ ) ] , G ( τ ) = ∑ t = 0 T γ t r t J(\theta) \;=\; \mathbb{E}_{\tau\sim\pi_\theta}\!\big[G(\tau)\big],
\qquad G(\tau)=\sum_{t=0}^{T}\gamma^{t}\,r_t J ( θ ) = E τ ∼ π θ [ G ( τ ) ] , G ( τ ) = t = 0 ∑ T γ t r t
そして J J J を最大化したいので、損失を下げる勾配降下ではなく、J J J を上げる勾配上昇 を使います。
θ ← θ + α ∇ θ J ( θ ) \theta \;\leftarrow\; \theta + \alpha\,\nabla_\theta J(\theta) θ ← θ + α ∇ θ J ( θ )
要するに:「うまくいく軌道が出やすくなる方向」に θ \theta θ をちょっとずつ動かすだけです。問題は ∇ θ J \nabla_\theta J ∇ θ J をどう計算するか。J J J は期待値(積分)の中に θ \theta θ が入っており、しかも環境の遷移確率は未知です。これを解くのが次の方策勾配定理です。
3. 方策勾配定理の導出(省略なし)
3.1 軌道の確率を書き下す
方策 π θ \pi_\theta π θ のもとで軌道 τ \tau τ が生じる確率は、初期状態分布・方策・遷移確率の積です。
p θ ( τ ) = ρ ( s 0 ) ⏟ 初期分布 ∏ t = 0 T π θ ( a t ∣ s t ) ⏟ 方策( θ 依存) p ( s t + 1 ∣ s t , a t ) ⏟ 遷移( θ 非依存) p_\theta(\tau) \;=\; \underbrace{\rho(s_0)}_{\text{初期分布}}\;\prod_{t=0}^{T}\;\underbrace{\pi_\theta(a_t\mid s_t)}_{\text{方策(}\theta\text{依存)}}\;\underbrace{p(s_{t+1}\mid s_t,a_t)}_{\text{遷移(}\theta\text{非依存)}} p θ ( τ ) = 初期分布 ρ ( s 0 ) t = 0 ∏ T 方策( θ 依存) π θ ( a t ∣ s t ) 遷移( θ 非依存) p ( s t + 1 ∣ s t , a t )
ここが導出の要です。θ \theta θ が入っているのは方策の項だけ で、初期分布 ρ \rho ρ と遷移確率 p p p は環境が決めるもので θ \theta θ に依存しません。
3.2 log-derivative trick(スコア関数のトリック)
目的関数の勾配を素直に書くと、期待値の中身ではなく分布そのもの p θ p_\theta p θ が θ \theta θ に依存しているため、そのままでは期待値として推定できません。
∇ θ J ( θ ) = ∇ θ ∫ p θ ( τ ) G ( τ ) d τ = ∫ ∇ θ p θ ( τ ) G ( τ ) d τ \nabla_\theta J(\theta)
= \nabla_\theta \int p_\theta(\tau)\,G(\tau)\,d\tau
= \int \nabla_\theta p_\theta(\tau)\,G(\tau)\,d\tau ∇ θ J ( θ ) = ∇ θ ∫ p θ ( τ ) G ( τ ) d τ = ∫ ∇ θ p θ ( τ ) G ( τ ) d τ
ここで恒等式 ∇ θ p θ = p θ ∇ θ log p θ \nabla_\theta p_\theta = p_\theta\,\nabla_\theta\log p_\theta ∇ θ p θ = p θ ∇ θ log p θ (log-derivative trick 。∇ log f = ∇ f / f \nabla\log f = \nabla f / f ∇ log f = ∇ f / f を変形しただけ)を使うと、p θ p_\theta p θ が前に出てきて、再び期待値の形 に戻せます。
∇ θ J ( θ ) = ∫ p θ ( τ ) ∇ θ log p θ ( τ ) G ( τ ) d τ = E τ ∼ π θ [ ∇ θ log p θ ( τ ) G ( τ ) ] \nabla_\theta J(\theta)
= \int p_\theta(\tau)\,\nabla_\theta\log p_\theta(\tau)\,G(\tau)\,d\tau
= \mathbb{E}_{\tau\sim\pi_\theta}\!\big[\nabla_\theta\log p_\theta(\tau)\,G(\tau)\big] ∇ θ J ( θ ) = ∫ p θ ( τ ) ∇ θ log p θ ( τ ) G ( τ ) d τ = E τ ∼ π θ [ ∇ θ log p θ ( τ ) G ( τ ) ]
要するに:このトリックのおかげで「分布を微分する」問題が「サンプルした軌道の ∇ log p \nabla\log p ∇ log p を平均する」問題に変わりました。期待値になったので、軌道をサンプリングして推定できます。
3.3 遷移確率と初期分布が消える
次に ∇ θ log p θ ( τ ) \nabla_\theta\log p_\theta(\tau) ∇ θ log p θ ( τ ) を展開します。log \log log は積を和に変えるので、3.1 の式の対数を取って勾配を取ると:
∇ θ log p θ ( τ ) = ∇ θ log ρ ( s 0 ) ⏟ = 0 + ∑ t = 0 T [ ∇ θ log π θ ( a t ∣ s t ) + ∇ θ log p ( s t + 1 ∣ s t , a t ) ⏟ = 0 ] \nabla_\theta\log p_\theta(\tau)
= \underbrace{\nabla_\theta\log\rho(s_0)}_{=\,0}
+ \sum_{t=0}^{T}\Big[\nabla_\theta\log\pi_\theta(a_t\mid s_t)
+ \underbrace{\nabla_\theta\log p(s_{t+1}\mid s_t,a_t)}_{=\,0}\Big] ∇ θ log p θ ( τ ) = = 0 ∇ θ log ρ ( s 0 ) + t = 0 ∑ T [ ∇ θ log π θ ( a t ∣ s t ) + = 0 ∇ θ log p ( s t + 1 ∣ s t , a t ) ]
ρ \rho ρ も p p p も θ \theta θ を含まないので、その勾配はゼロ。遷移ダイナミクスが綺麗に消えます 。残るのは方策の項だけです。
∇ θ log p θ ( τ ) = ∑ t = 0 T ∇ θ log π θ ( a t ∣ s t ) \boxed{\;\nabla_\theta\log p_\theta(\tau) = \sum_{t=0}^{T}\nabla_\theta\log\pi_\theta(a_t\mid s_t)\;} ∇ θ log p θ ( τ ) = t = 0 ∑ T ∇ θ log π θ ( a t ∣ s t )
要するに:これがモデルフリーで方策勾配が計算できる理由 です。環境の遷移確率 p p p を一切知らなくても、自分が出した行動の確率の勾配さえあれば勾配が求まる。RL が「環境を知らずに学べる」核心がここにあります。
3.4 因果性を使って Q π Q^\pi Q π へ
3.2・3.3 を合わせると ∇ θ J = E [ ( ∑ t ∇ θ log π θ ( a t ∣ s t ) ) G ( τ ) ] \nabla_\theta J = \mathbb{E}\big[\big(\sum_t\nabla_\theta\log\pi_\theta(a_t\mid s_t)\big)G(\tau)\big] ∇ θ J = E [ ( ∑ t ∇ θ log π θ ( a t ∣ s t ) ) G ( τ ) ] になります。さらに因果性 (時刻 t t t の行動は、それ以前に得た報酬には影響しない)を使うと、各 t t t の項に掛かるのは「t t t 以降のリターン(reward-to-go)」だけで十分です。その reward-to-go の条件付き期待値がまさに Q π ( s t , a t ) Q^\pi(s_t,a_t) Q π ( s t , a t ) なので、定理の標準形が得られます。
∇ θ J ( θ ) = E π θ [ ∑ t = 0 T ∇ θ log π θ ( a t ∣ s t ) Q π ( s t , a t ) ] \boxed{\;\nabla_\theta J(\theta)
= \mathbb{E}_{\pi_\theta}\!\left[\sum_{t=0}^{T}\nabla_\theta\log\pi_\theta(a_t\mid s_t)\,Q^\pi(s_t,a_t)\right]\;} ∇ θ J ( θ ) = E π θ [ t = 0 ∑ T ∇ θ log π θ ( a t ∣ s t ) Q π ( s t , a t ) ]
これが方策勾配定理 です。「行動 a t a_t a t の対数確率の勾配」を、その行動の価値 Q π Q^\pi Q π で重み付けして足す、という形をしています。
4. REINFORCE:Q Q Q をリターンで近似する
方策勾配定理の Q π ( s t , a t ) Q^\pi(s_t,a_t) Q π ( s t , a t ) は真の価値で、普通は手元にありません。最も素朴な対処は、1エピソードを最後まで走らせて得た実際のリターン G t = ∑ k = t T γ k − t r k G_t=\sum_{k=t}^{T}\gamma^{k-t}r_k G t = ∑ k = t T γ k − t r k で Q π Q^\pi Q π を置き換えることです。G t G_t G t は Q π ( s t , a t ) Q^\pi(s_t,a_t) Q π ( s t , a t ) の不偏なモンテカルロ推定量だからです。
∇ θ J ( θ ) ≈ ∑ t = 0 T ∇ θ log π θ ( a t ∣ s t ) G t \nabla_\theta J(\theta)\;\approx\;\sum_{t=0}^{T}\nabla_\theta\log\pi_\theta(a_t\mid s_t)\,G_t ∇ θ J ( θ ) ≈ t = 0 ∑ T ∇ θ log π θ ( a t ∣ s t ) G t
これが REINFORCE (Williams, 1992)です。アルゴリズムは驚くほど単純です。
flowchart TD
A["現在の方策 π_θ で1エピソードを最後まで実行"] --> B["各ステップの軌道(s_t, a_t, r_t)を記録"]
B --> C["各 t のリターン G_t を後ろから計算"]
C --> D["勾配 Σ_t ∇log π_θ(a_t|s_t)・G_t を作る"]
D --> E["θ ← θ + α・勾配(勾配上昇)"]
E --> A
直観 :∇ θ log π θ ( a t ∣ s t ) \nabla_\theta\log\pi_\theta(a_t\mid s_t) ∇ θ log π θ ( a t ∣ s t ) は「行動 a t a_t a t の確率を上げる方向」です。それに G t G_t G t を掛けるので――
G t G_t G t が大きい(良い結果) :その方向に大きく進む → その行動の確率を上げる
G t G_t G t が小さい/負(悪い結果) :逆向きに進む → その行動の確率を下げる
つまり「結果が良かった行動は、次から出やすくする」という、試行錯誤そのものを勾配で表現しています。
5. 高分散問題とベースライン
REINFORCE は理屈は綺麗ですが、実用上は勾配の分散が非常に大きい という重大な弱点があります。G t G_t G t はエピソード全体の運(環境の確率性・長い軌道の積み重ね)に大きく揺らぐため、推定された勾配がステップごとに激しくぶれて学習が遅く不安定になります。
5.1 ベースラインを引いても期待値は不変
そこで、行動に依存しないベースライン b ( s t ) b(s_t) b ( s t ) (状態だけの関数)をリターンから差し引きます。
∇ θ J ( θ ) = E π θ [ ∑ t ∇ θ log π θ ( a t ∣ s t ) ( G t − b ( s t ) ) ] \nabla_\theta J(\theta)\;=\;\mathbb{E}_{\pi_\theta}\!\left[\sum_{t}\nabla_\theta\log\pi_\theta(a_t\mid s_t)\,\big(G_t - b(s_t)\big)\right] ∇ θ J ( θ ) = E π θ [ t ∑ ∇ θ log π θ ( a t ∣ s t ) ( G t − b ( s t ) ) ]
驚くべきことに、何を引いても勾配の期待値は変わりません (不偏のまま)。鍵は、引き算で増えた項 E [ ∇ θ log π θ ⋅ b ( s ) ] \mathbb{E}[\nabla_\theta\log\pi_\theta\cdot b(s)] E [ ∇ θ log π θ ⋅ b ( s )] がゼロ になることです。状態 s s s を固定して行動について期待を取ると:
E a ∼ π θ [ ∇ θ log π θ ( a ∣ s ) b ( s ) ] = b ( s ) ∑ a π θ ( a ∣ s ) ∇ θ log π θ ( a ∣ s ) \mathbb{E}_{a\sim\pi_\theta}\!\big[\nabla_\theta\log\pi_\theta(a\mid s)\,b(s)\big]
= b(s)\sum_{a}\pi_\theta(a\mid s)\,\nabla_\theta\log\pi_\theta(a\mid s) E a ∼ π θ [ ∇ θ log π θ ( a ∣ s ) b ( s ) ] = b ( s ) a ∑ π θ ( a ∣ s ) ∇ θ log π θ ( a ∣ s )
ここで log-derivative trick を逆向き に使うと π θ ∇ θ log π θ = ∇ θ π θ \pi_\theta\nabla_\theta\log\pi_\theta = \nabla_\theta\pi_\theta π θ ∇ θ log π θ = ∇ θ π θ なので、
= b ( s ) ∑ a ∇ θ π θ ( a ∣ s ) = b ( s ) ∇ θ ∑ a π θ ( a ∣ s ) ⏟ = 1 = b ( s ) ∇ θ 1 = 0 = b(s)\sum_{a}\nabla_\theta\pi_\theta(a\mid s)
= b(s)\,\nabla_\theta\underbrace{\sum_{a}\pi_\theta(a\mid s)}_{=\,1}
= b(s)\,\nabla_\theta 1
= 0 = b ( s ) a ∑ ∇ θ π θ ( a ∣ s ) = b ( s ) ∇ θ = 1 a ∑ π θ ( a ∣ s ) = b ( s ) ∇ θ 1 = 0
要するに:b ( s ) b(s) b ( s ) は行動 a a a について定数なので外に出せ、残った ∑ a ∇ π θ \sum_a\nabla\pi_\theta ∑ a ∇ π θ は「確率の総和は常に 1」を微分したもの=ゼロ。だからベースラインはバイアスを入れません 。
5.2 分散だけが下がる
期待値は不変なのに、分散は引き方しだいで下げられます 。G t G_t G t は絶対的なリターンですが、私たちが本当に知りたいのは「この行動は平均と比べて 良かったのか悪かったのか」です。b ( s ) = V π ( s ) b(s)=V^\pi(s) b ( s ) = V π ( s ) (その状態からの平均リターン)を引けば、G t − V π ( s t ) G_t-V^\pi(s_t) G t − V π ( s t ) は「平均より良ければ正、悪ければ負」というセンタリングされた量になり、ばらつきが大幅に減ります。
たとえば全リターンが + 100 +100 + 100 付近なら、ベースライン無しでは「全行動の確率を一律に上げる」だけで方向の情報が乏しい。V ≈ 100 V\approx100 V ≈ 100 を引けば「100 100 100 より良かった行動だけ確率を上げる」と差が際立ち、勾配が情報量豊かになります。
5.3 優位関数へ
b ( s ) = V π ( s ) b(s)=V^\pi(s) b ( s ) = V π ( s ) を採ると、G t − V π ( s t ) G_t-V^\pi(s_t) G t − V π ( s t ) は Q π ( s t , a t ) − V π ( s t ) Q^\pi(s_t,a_t)-V^\pi(s_t) Q π ( s t , a t ) − V π ( s t ) の推定にほかなりません。この差を**優位関数(advantage function)**と呼びます。
A π ( s , a ) = Q π ( s , a ) − V π ( s ) \boxed{\;A^\pi(s,a) \;=\; Q^\pi(s,a) - V^\pi(s)\;} A π ( s , a ) = Q π ( s , a ) − V π ( s )
これは「状態 s s s で平均的に 期待される価値 V π ( s ) V^\pi(s) V π ( s ) に比べ、特に行動 a a a を選ぶ ことがどれだけ得か」を測ります。優位関数を使った方策勾配が、現代的な定式化の標準形です。
∇ θ J ( θ ) = E π θ [ ∑ t ∇ θ log π θ ( a t ∣ s t ) A π ( s t , a t ) ] \nabla_\theta J(\theta)\;=\;\mathbb{E}_{\pi_\theta}\!\left[\sum_{t}\nabla_\theta\log\pi_\theta(a_t\mid s_t)\,A^\pi(s_t,a_t)\right] ∇ θ J ( θ ) = E π θ [ t ∑ ∇ θ log π θ ( a t ∣ s t ) A π ( s t , a t ) ]
要するに:「平均より良い行動の確率を上げ、平均より悪い行動の確率を下げる」。V V V という基準線を持ち込むことで、ノイズの多い絶対リターンを安定した相対評価に変えたわけです。
6. 確率的方策の利点と次への橋渡し
方策勾配が価値ベースに勝る場面を整理します。
確率的方策を直接学べる :最適方策が確率的になる問題(ゲーム理論的状況・POMDP)で本領を発揮します。
連続行動が自然 :ガウス方策の平均・分散を出すだけで、arg max \arg\max arg max を解かずに連続制御ができます(ロボット制御で多用)。
方策が滑らかに変化 :θ \theta θ の微小変化で方策も滑らかに動くため、arg max \arg\max arg max のジャンプが無く収束性の議論がしやすい。
一方で REINFORCE は V V V を真値で持てない (5.2 では V V V を引きたいが、それ自体を学ぶ必要がある)という宿題が残ります。そこで「方策(Actor)」と「価値 V V V や Q Q Q (Critic)」を同時に学習 し、優位関数をその場で推定する枠組みへ発展します。それが Actor-Criticと深層強化学習 です。Critic がブートストラップで A A A を低分散に見積もり、Actor がそれを使って方策を更新します。
⚠️ よくある誤解・落とし穴
「方策勾配は大域最適に収束する」→ 誤り。 勾配上昇である以上、一般に局所最適 にしか収束しません。J ( θ ) J(\theta) J ( θ ) は θ \theta θ について非凸です。良い局所最適に入るかは初期化・探索しだいで、Q学習が(条件付きで)最適 Q Q Q への収束を持つのとは性質が違います。
「ベースラインを引くとバイアスが入る」→ 誤り。 5.1 で証明した通り、b b b が状態のみの関数 なら期待値は不変で、減るのは分散だけ です。ただし b b b を行動 a a a に依存させると ∑ a ∇ π θ \sum_a\nabla\pi_\theta ∑ a ∇ π θ の議論が崩れ、バイアスが入り得ます。
「REINFORCE はサンプル効率が良い」→ 誤り。 1回の更新にエピソードを最後まで 走らせる必要があり(G t G_t G t が必要)、しかも更新後はそのデータを捨てるオンポリシー 。高分散と相まってサンプル効率は悪く、これが Actor-Critic や PPO など後続手法の主たる動機になりました。
対数の引数の取り違え: 勾配を掛けるのは ∇ θ log π θ ( a t ∣ s t ) \nabla_\theta\log\pi_\theta(a_t\mid s_t) ∇ θ log π θ ( a t ∣ s t ) であって、報酬や G t G_t G t を log \log log に入れるのではありません。log \log log に入るのは方策の確率 だけです。
勾配上昇 vs 勾配降下: J J J は最大化 対象なので符号は + α ∇ J +\alpha\nabla J + α ∇ J 。実装で損失として書くなら − ( log π θ ⋅ A ) -\,(\log\pi_\theta\cdot A) − ( log π θ ⋅ A ) を最小化します(誤差逆伝播法 の自動微分にこの「サロゲート損失」を流すのが定番)。
対応するシミュレーション
simulations/policy_gradient_bandit.py:4本腕バンディットで、方策をソフトマックスで表し REINFORCE で学習します。得た報酬に応じて ∇ log π ( a ) \nabla\log\pi(a) ∇ log π ( a ) の向きにパラメータを動かすと、最良の腕の確率が1へ近づき平均報酬が最適値へ上がること、そして「報酬−ベースライン」と引くことで不偏のまま分散を下げられること(Actor-Criticと深層強化学習 の優位関数へ)を可視化します。
関連ノート