07.2 策略梯度與 PPO#
本章導讀#
貝爾曼方程在「狀態離散且可列舉」時最漂亮。但開車、寫文章——狀態是連續的或天文級多的, 列舉不了。策略梯度換一條路:直接把策略 \(\pi_\theta\) 寫成參數化函數, 對「總獎勵」求梯度、直接梯度上升。 REINFORCE 是它的最簡形式,PPO 是現代最常用的改良——RLHF 就是用它訓出來的。
淺顯說明#
策略梯度像「試誤調參」:
- 用目前的策略玩幾局,記下每步的動作與總獎勵。
- 獎勵高的局:把當時的動作機率調高;獎勵低的局:調低。
- 重複——策略慢慢走向高獎區。
難處在於:總獎勵是隨機環境的期望值,無法直接求梯度。 對數導數技巧(log-derivative trick)把它轉成「可採樣」的形式——這是本節的核心數學。
正規理論#
策略梯度目標#
參數化策略 \(\pi_\theta(a \mid s)\) ,目標函數是期望累積獎勵:
軌跡 \(\tau = (s_0, a_0, s_1, a_1, \dots)\) 的機率: \(P(\tau) = \rho_0(s_0)\prod_t \pi_\theta(a_t \mid s_t) P(s_{t+1} \mid s_t, a_t)\) 。
對數導數技巧(核心推導)#
對 \(J\) 求梯度( \(\nabla_\theta P(\tau)\) 中的環境項 \(P(s_{t+1}\mid s_t,a_t)\) 與 \(\theta\) 無關,可消去):
而 \(\nabla_\theta \log P(\tau) = \sum_t \nabla_\theta \log \pi_\theta(a_t \mid s_t)\) ,故得策略梯度定理:
意義:期望值的梯度(無法直接算)= 「 \(\log\) 策略的梯度 × 獎勵」的期望(可採樣)。 用幾局樣本平均即可估計,再做梯度上升。
REINFORCE(Monte-Carlo 策略梯度):
用「從 \(t\) 起的回報 \(G_t\) 」取代整局 \(R(\tau)\) ,降低方差(因果性:未來的獎勵不影響過去的決策責任)。
baseline 與優勢函數#
減去一個與動作無關的基線 \(b(s)\) 不改變期望(因 \(\mathbb{E}[\nabla\log\pi \cdot b] = b\,\nabla\sum_a\pi = 0\) ),卻能降低方差:
取 \(b(s) = V^\pi(s)\) ,括號內就是優勢函數:
PPO:信任域與 KL 限制#
一步梯度走太遠會毀掉策略(新策略偏離舊策略太遠,樣本資訊失效)。 TRPO/PPO 的想法:限制新舊策略的距離。TRPO 用帶約束的優化(拉格朗日乘子):
PPO 用裁剪(clipping)近似同一件事:
概率比被夾在 \([1-\epsilon, 1+\epsilon]\) ——策略每次只許小幅更新。KL 散度(04.3 節)是「策略距離」的度量, 限制它 = 防止策略崩潰。
RLHF:把人類偏好寫進獎勵#
RLHF(ChatGPT 的訓練法)三步:
- 收集人類偏好對 \((y_w \succ y_l)\) ,訓練獎勵模型 \(\hat r_\theta(x, y)\) (Bradley–Terry 模型):
- 用 PPO 最大化獎勵: \(\max_\pi \mathbb{E}_{x, y \sim \pi}[\hat r(x, y)]\) 。
- 加 KL 懲罰防止語言模型漂移成「獎勵駭客」:
簡易範例:兩動作策略上升#
狀態只有一個,動作 \(\{a_1, a_2\}\) , \(\pi_\theta(a_1) = \sigma(\theta)\) 。動作 \(a_1\) 得獎勵 \(+1\) , \(a_2\) 得 \(-1\) 。
策略梯度: \(\nabla_\theta J = \mathbb{E}[\nabla_\theta \log \pi_\theta(a)\, r(a)]\) 。 而 \(\nabla_\theta \log \sigma(\theta) = 1 - \sigma(\theta)\) 、 \(\nabla_\theta \log(1 - \sigma(\theta)) = -\sigma(\theta)\) :
(代入 \(\pi(a_2) = 1 - \pi(a_1)\) 。)所以 \(\theta \leftarrow \theta + \eta\,\sigma(\theta)\) —— \(\theta\) 增大 → \(\pi(a_1)\) 增大 → 更常選好動作。取 \(\eta = 1\) , \(\theta_0 = 0\) :
| \(k\) | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| \(\pi(a_1)\) | 0.500 | 0.731 | 0.796 | 0.848 |
策略單調走向「總選 \(a_1\) 」——試誤調參的數學本質。
歷史典故#
- 2016 年 AlphaGo:見卷宗 ../2016-AlphaGo.md——策略網路的自我對弈訓練,是策略梯度的大規模應用。
- 2022 年 ChatGPT 與 RLHF:見 ../2022-ChatGPT與RLHF.md——PPO + KL 懲罰,把人類偏好寫進語言模型。
- 2025 年 DeepSeek-R1:見 ../2025-DeepSeek-R1.md——用可驗證獎勵(答案對錯)做 RL,推理鏈「湧現」(06.3 節)。
習題#
- 證明:減去 baseline 不改變策略梯度的期望( \(\mathbb{E}[\nabla\log\pi\, b(s)] = 0\) )。
- 對本節範例求 \(J(\theta) = \sigma(\theta)(+1) + (1-\sigma(\theta))(-1) = 2\sigma(\theta) - 1\) ,直接對 \(J\) 求導驗證 \(\nabla J = \pi(a_1)\) 。
- 解釋為什麼 PPO 的 clip 等價於「KL 信任域」的軟版本,以及獎勵駭客(reward hacking)為何需要 KL 懲罰來防。
補充#
1. 數學推導證明#
證明(習題 1):baseline 不改變期望。
(用 \(\nabla\log\pi = \nabla\pi/\pi\) 。)故 \(\mathbb{E}[\nabla\log\pi\,(Q - b)] = \mathbb{E}[\nabla\log\pi\,Q]\) ——減基線只降方差,不引入偏差。取 \(b(s) = V(s)\) 即得優勢函數形式。 \(\blacksquare\)
證明(習題 2,含正文修正):兩動作例的真梯度是 \(2\sigma(1-\sigma)\) 。
\(J(\theta) = \sigma(\theta)(+1) + (1-\sigma(\theta))(-1) = 2\sigma(\theta) - 1\) ,直接求導( \(\sigma' = \sigma(1-\sigma)\) ):
(註:正文寫 \(\nabla J = \pi(a_1)\) 係筆誤——漏了 \(\sigma' = \sigma(1-\sigma)\) 的 \((1-\sigma)\) 因子與常數 2; \(\theta = 0\) 時真值 \(0.5\) 恰與 \(\sigma(0) = 0.5\) 巧合, \(\theta = 1\) 時真值 \(2\times0.731\times0.269 \approx 0.393\) 才見分曉。)策略梯度估計的期望等於此值: \(\mathbb{E}[\nabla\log\pi\cdot r] = \sigma(1-\sigma)(+1) + (1-\sigma)(-\sigma)(-1) = 2\sigma(1-\sigma)\) ——兩路一致。更新 \(\theta \leftarrow \theta + \eta\cdot 2\sigma(1-\sigma)\) 仍單調增(梯度恆正), \(\pi(a_1) \to 1\) 的結論不變,只是速度比正文表格慢一些。 \(\blacksquare\)
說明(習題 3):clip ≈ 信任域;KL 防獎勵駭客。 PPO 的 \(\min(rA, \mathrm{clip}(r)A)\) 在 \(r \notin [1-\epsilon, 1+\epsilon]\) 時把梯度截掉——等於說「概率比離 1 太遠的樣本不准再推」,這正是 \(D_{\mathrm{KL}}(\pi_{\text{old}}\|\pi_{\text{new}}) \le \delta\) 的一階近似(小步時 KL \(\approx \frac{1}{2}\mathbb{E}[(r-1)^2]\) )。獎勵駭客(鑽獎勵模型的空子、說討好話)本質是策略漂到獎勵模型沒見過的區域; \(\beta\,D_{\mathrm{KL}}(\pi\|\pi_{\text{ref}})\) 把策略拴在參考模型附近,駭客增益抵不過 KL 懲罰。
2. 簡易範例#
範例一:梯度公式的數值驗證。 程式 _code/07.2-reinforce-policy-gradient.py 對 \(J = 2\sigma-1\) 做中心差分: \(\theta = 0, 1, 2\) 時數值梯度 \(0.5000, 0.3932, 0.2100\) ,等於理論 \(2s(1-s) = 0.5000, 0.3932, 0.2100\) 到四位小數——修正後公式的數值驗證。
範例二:REINFORCE 上升+基線降方差。 程式跑 200 輪(每輪 50 局):無基線 \(\theta \approx 6.01\) 、 \(\pi(a_1) \approx 0.9976\) ;有基線 \(\theta \approx 5.11\) 、 \(\pi(a_1) \approx 0.994\) ——兩者都走向總選好動作。方差比較( \(\theta = 1\) 、2 萬次抽樣):無基線方差 \(\approx 0.0419\) ,最佳基線 \(b^* = 1 - 2\sigma \approx -0.4621\) 下方差 \(\approx 0.0\) (此單狀態例子中基線恰消去全部方差)——基線不改期望、只降噪聲的具體演示。