← 機械学習テキスト 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:価値関数とベルマン方程式 | 関連:誤差逆伝播法(勾配)

要点(BLUF)


1. なぜ価値ベースでは足りないのか

Q学習とSARSA のような価値ベースの手法は「各 (s,a)(s,a) の良さ Q(s,a)Q(s,a) を学び、argmaxaQ\arg\max_a Q を取る」という間接的な枠組みです。これには構造的な限界があります。

そこで発想を変えます。価値を経由せず、方策そのものをパラメータ θ\theta を持つ関数として置き、θ\theta を直接動かして良くしていく。これが方策勾配法です。

πθ(as)  =  (パラメータ θ を持つ、状態 s で行動 a を取る確率)\pi_\theta(a\mid s) \;=\; \text{(パラメータ }\theta\text{ を持つ、状態 }s\text{ で行動 }a\text{ を取る確率)}

実装上は、離散行動なら 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 に従って生成される軌道 τ=(s0,a0,s1,a1,)\tau = (s_0, a_0, s_1, a_1, \dots)期待リターンです。

J(θ)  =  Eτπθ ⁣[G(τ)],G(τ)=t=0TγtrtJ(\theta) \;=\; \mathbb{E}_{\tau\sim\pi_\theta}\!\big[G(\tau)\big], \qquad G(\tau)=\sum_{t=0}^{T}\gamma^{t}\,r_t

そして JJ を最大化したいので、損失を下げる勾配降下ではなく、JJ を上げる勾配上昇を使います。

θ    θ+αθJ(θ)\theta \;\leftarrow\; \theta + \alpha\,\nabla_\theta J(\theta)

要するに:「うまくいく軌道が出やすくなる方向」に θ\theta をちょっとずつ動かすだけです。問題は θJ\nabla_\theta J をどう計算するか。JJ は期待値(積分)の中に θ\theta が入っており、しかも環境の遷移確率は未知です。これを解くのが次の方策勾配定理です。


3. 方策勾配定理の導出(省略なし)

3.1 軌道の確率を書き下す

方策 πθ\pi_\theta のもとで軌道 τ\tau が生じる確率は、初期状態分布・方策・遷移確率の積です。

pθ(τ)  =  ρ(s0)初期分布  t=0T  πθ(atst)方策(θ依存)  p(st+1st,at)遷移(θ非依存)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{非依存)}}

ここが導出の要です。θ\theta が入っているのは方策の項だけで、初期分布 ρ\rho と遷移確率 pp は環境が決めるもので θ\theta に依存しません。

3.2 log-derivative trick(スコア関数のトリック)

目的関数の勾配を素直に書くと、期待値の中身ではなく分布そのもの pθp_\thetaθ\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

ここで恒等式 θpθ=pθθlogpθ\nabla_\theta p_\theta = p_\theta\,\nabla_\theta\log p_\thetalog-derivative tricklogf=f/f\nabla\log f = \nabla f / f を変形しただけ)を使うと、pθp_\theta が前に出てきて、再び期待値の形に戻せます。

θJ(θ)=pθ(τ)θlogpθ(τ)G(τ)dτ=Eτπθ ⁣[θlogpθ(τ)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]

要するに:このトリックのおかげで「分布を微分する」問題が「サンプルした軌道の logp\nabla\log p を平均する」問題に変わりました。期待値になったので、軌道をサンプリングして推定できます。

3.3 遷移確率と初期分布が消える

次に θlogpθ(τ)\nabla_\theta\log p_\theta(\tau) を展開します。log\log は積を和に変えるので、3.1 の式の対数を取って勾配を取ると:

θlogpθ(τ)=θlogρ(s0)=0+t=0T[θlogπθ(atst)+θlogp(st+1st,at)=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]

ρ\rhoppθ\theta を含まないので、その勾配はゼロ。遷移ダイナミクスが綺麗に消えます。残るのは方策の項だけです。

  θlogpθ(τ)=t=0Tθlogπθ(atst)  \boxed{\;\nabla_\theta\log p_\theta(\tau) = \sum_{t=0}^{T}\nabla_\theta\log\pi_\theta(a_t\mid s_t)\;}

要するに:これがモデルフリーで方策勾配が計算できる理由です。環境の遷移確率 pp を一切知らなくても、自分が出した行動の確率の勾配さえあれば勾配が求まる。RL が「環境を知らずに学べる」核心がここにあります。

3.4 因果性を使って QπQ^\pi

3.2・3.3 を合わせると θJ=E[(tθlogπθ(atst))G(τ)]\nabla_\theta J = \mathbb{E}\big[\big(\sum_t\nabla_\theta\log\pi_\theta(a_t\mid s_t)\big)G(\tau)\big] になります。さらに因果性(時刻 tt の行動は、それ以前に得た報酬には影響しない)を使うと、各 tt の項に掛かるのは「tt 以降のリターン(reward-to-go)」だけで十分です。その reward-to-go の条件付き期待値がまさに Qπ(st,at)Q^\pi(s_t,a_t) なので、定理の標準形が得られます。

  θJ(θ)=Eπθ ⁣[t=0Tθlogπθ(atst)Qπ(st,at)]  \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]\;}

これが方策勾配定理です。「行動 ata_t の対数確率の勾配」を、その行動の価値 QπQ^\pi で重み付けして足す、という形をしています。


4. REINFORCE:QQ をリターンで近似する

方策勾配定理の Qπ(st,at)Q^\pi(s_t,a_t) は真の価値で、普通は手元にありません。最も素朴な対処は、1エピソードを最後まで走らせて得た実際のリターン Gt=k=tTγktrkG_t=\sum_{k=t}^{T}\gamma^{k-t}r_kQπQ^\pi を置き換えることです。GtG_tQπ(st,at)Q^\pi(s_t,a_t) の不偏なモンテカルロ推定量だからです。

θJ(θ)    t=0Tθlogπθ(atst)Gt\nabla_\theta J(\theta)\;\approx\;\sum_{t=0}^{T}\nabla_\theta\log\pi_\theta(a_t\mid 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πθ(atst)\nabla_\theta\log\pi_\theta(a_t\mid s_t) は「行動 ata_t の確率を上げる方向」です。それに GtG_t を掛けるので――

つまり「結果が良かった行動は、次から出やすくする」という、試行錯誤そのものを勾配で表現しています。


5. 高分散問題とベースライン

REINFORCE は理屈は綺麗ですが、実用上は勾配の分散が非常に大きいという重大な弱点があります。GtG_t はエピソード全体の運(環境の確率性・長い軌道の積み重ね)に大きく揺らぐため、推定された勾配がステップごとに激しくぶれて学習が遅く不安定になります。

5.1 ベースラインを引いても期待値は不変

そこで、行動に依存しないベースライン b(st)b(s_t)(状態だけの関数)をリターンから差し引きます。

θJ(θ)  =  Eπθ ⁣[tθlogπθ(atst)(Gtb(st))]\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]

驚くべきことに、何を引いても勾配の期待値は変わりません(不偏のまま)。鍵は、引き算で増えた項 E[θlogπθb(s)]\mathbb{E}[\nabla_\theta\log\pi_\theta\cdot b(s)]ゼロになることです。状態 ss を固定して行動について期待を取ると:

Eaπθ ⁣[θlogπθ(as)b(s)]=b(s)aπθ(as)θlogπθ(as)\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)

ここで log-derivative trick を逆向きに使うと πθθlogπθ=θπθ\pi_\theta\nabla_\theta\log\pi_\theta = \nabla_\theta\pi_\theta なので、

=b(s)aθπθ(as)=b(s)θaπθ(as)=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)b(s) は行動 aa について定数なので外に出せ、残った aπθ\sum_a\nabla\pi_\theta は「確率の総和は常に 1」を微分したもの=ゼロ。だからベースラインはバイアスを入れません

5.2 分散だけが下がる

期待値は不変なのに、分散は引き方しだいで下げられますGtG_t は絶対的なリターンですが、私たちが本当に知りたいのは「この行動は平均と比べて良かったのか悪かったのか」です。b(s)=Vπ(s)b(s)=V^\pi(s)(その状態からの平均リターン)を引けば、GtVπ(st)G_t-V^\pi(s_t) は「平均より良ければ正、悪ければ負」というセンタリングされた量になり、ばらつきが大幅に減ります。

たとえば全リターンが +100+100 付近なら、ベースライン無しでは「全行動の確率を一律に上げる」だけで方向の情報が乏しい。V100V\approx100 を引けば「100100 より良かった行動だけ確率を上げる」と差が際立ち、勾配が情報量豊かになります。

5.3 優位関数へ

b(s)=Vπ(s)b(s)=V^\pi(s) を採ると、GtVπ(st)G_t-V^\pi(s_t)Qπ(st,at)Vπ(st)Q^\pi(s_t,a_t)-V^\pi(s_t) の推定にほかなりません。この差を**優位関数(advantage function)**と呼びます。

  Aπ(s,a)  =  Qπ(s,a)Vπ(s)  \boxed{\;A^\pi(s,a) \;=\; Q^\pi(s,a) - V^\pi(s)\;}

これは「状態 ss平均的に期待される価値 Vπ(s)V^\pi(s) に比べ、特に行動 aa を選ぶことがどれだけ得か」を測ります。優位関数を使った方策勾配が、現代的な定式化の標準形です。

θJ(θ)  =  Eπθ ⁣[tθlogπθ(atst)Aπ(st,at)]\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]

要するに:「平均より良い行動の確率を上げ、平均より悪い行動の確率を下げる」。VV という基準線を持ち込むことで、ノイズの多い絶対リターンを安定した相対評価に変えたわけです。


6. 確率的方策の利点と次への橋渡し

方策勾配が価値ベースに勝る場面を整理します。

一方で REINFORCE は VV を真値で持てない(5.2 では VV を引きたいが、それ自体を学ぶ必要がある)という宿題が残ります。そこで「方策(Actor)」と「価値 VVQQ(Critic)」を同時に学習し、優位関数をその場で推定する枠組みへ発展します。それが Actor-Criticと深層強化学習 です。Critic がブートストラップで AA を低分散に見積もり、Actor がそれを使って方策を更新します。


⚠️ よくある誤解・落とし穴


対応するシミュレーション

simulations/policy_gradient_bandit.py:4本腕バンディットで、方策をソフトマックスで表し REINFORCE で学習します。得た報酬に応じて logπ(a)\nabla\log\pi(a) の向きにパラメータを動かすと、最良の腕の確率が1へ近づき平均報酬が最適値へ上がること、そして「報酬−ベースライン」と引くことで不偏のまま分散を下げられること(Actor-Criticと深層強化学習 の優位関数へ)を可視化します。

REINFORCEでバンディットの最適腕に収束

関連ノート