PPO(Proximal Policy Optimization)是 RLHF(Reinforcement Learning from Human Feedback)流水線裡最常用的強化學習演算法:ChatGPT、Claude 早期的對齊訓練都用它把一個已經會說話的模型,調教成一個”說人話更討喜”的模型。這篇文章按”為什麼需要它 → 它怎麼推匯出來 → 怎麼落到 LLM 訓練裡”的順序講清楚 PPO,重點放在它在 LLM RLHF 場景下的具體形態,而不是經典的 Atari/MuJoCo 場景。
1. RLHF 全景與 MDP 建模
一個典型的 RLHF 流程分三步:SFT——用人工標註的高質量問答對,對預訓練模型做監督微調,得到一個”聽得懂指令”的基礎策略;訓練 Reward Model(RM)——讓標註員對同一個 prompt 的多個模型輸出排序,訓練一個打分模型 ,輸入 prompt 和回覆 ,輸出一個標量分數,代表”人類有多喜歡這個回覆”;PPO 階段——把 SFT 模型當作初始策略,用 RM 的打分作為強化學習的 reward 訊號,繼續最佳化這個策略。PPO 只負責第三步,但效果很大程度上取決於前兩步的質量——RM 學得不準,PPO 會很忠實地把策略最佳化到 RM 的漏洞上(這就是後面要講的 reward hacking)。
要用 RL 的框架處理語言生成,首先要把生成過程翻譯成 MDP(馬爾可夫決策過程)的語言:狀態 是 prompt 加上目前已經生成的 token,即 ;動作 是下一個要生成的 token,動作空間就是整個詞表(通常幾萬到十幾萬);策略 就是 LLM 本身, 是模型在給定上下文時對下一個 token 的機率分佈;一個 episode 是一次完整的生成,從 prompt 開始到 EOS 或截斷為止。reward 是和經典 RL 最不一樣的地方:RM 通常只在整個回覆生成完畢後對完整序列打一個分,中間每個 token 沒有”環境”給出的即時獎勵,原始 reward 是序列級、稀疏的,只落在最後一個 token 上。這個”每個 token 是一步決策,但獎勵只在最後才出現”的結構,決定了後面 GAE 和 KL 懲罰要怎麼設計。
2. 從策略梯度到 Clipped Objective
強化學習最直接的做法是策略梯度:直接對期望回報 求梯度,REINFORCE 給出的估計是:
直覺很簡單:某次取樣的軌跡回報 是正的就調高這次取樣到的動作的機率,是負的就調低。問題在於 是蒙特卡洛取樣得到的,變異數很大,尤其在長序列(LLM 生成動輒幾百個 token)和巨大動作空間(幾萬詞表)下會被進一步放大。標準做法是引入一個 baseline(通常是狀態價值函數 ),用優勢函數 替代原始回報——它衡量”這個動作比這個狀態下的平均水平好多少”,平均值為零,變異數顯著更小:
策略梯度還有一個更棘手的問題:更新幅度不好控制。學習率稍大,一次梯度更新就可能讓策略的輸出分佈劇烈偏移——對 LLM 來說,意味著模型可能幾步之內就開始輸出亂碼,或坍縮到能騙過 RM 但語言質量很差的退化模式,而且這種偏移一旦發生很難恢復,因為下一批 rollout 已經是從被破壞的策略裡採出來的。TRPO(Trust Region Policy Optimization)的方案是顯式約束新舊策略之間的 KL 散度,把每一步更新限制在一個”信賴域”內,但這需要求解帶約束的二階最佳化問題,實現複雜、代價高。PPO 的出發點是:能不能用一個更簡單的一階方法,達到類似的效果?
PPO 的答案是用一個機率比來衡量新舊策略的差異:。如果直接最佳化 ,當 很大時最佳化過程會瘋狂拉高 ,導致策略一步走出信賴域。PPO 的 clipped objective 把這個比值夾在一個區間內:
通常取 0.1~0.2。當 (這個動作比平均水平好)時, 一旦超過 ,clip 後的項就不再增長,梯度也就沒有動力繼續把 推得更高;當 時同理, 一旦跌破 ,目標就不再因為繼續降低 而變得更”好”。取 而不是直接用 clip 後的值,是為了保證這個目標始終是真實目標的一個悲觀下界——無論 正負,最終最佳化的都是更保守的那個估計,防止模型基於單次取樣的優勢估計做出過度自信、不可逆的更新。這就是”proximal”(鄰近)這個名字的來源:用一個廉價的一階方法,達到和 TRPO 類似的”每步更新幅度受限”的效果。
3. GAE 與完整損失函數
Clipped objective 裡的 需要一個價值函數 來估計。PPO 通常配合 GAE(Generalized Advantage Estimation)計算優勢:
是單步 TD 誤差, 控制”往後看多遠”: 時 GAE 退化成只用單步 TD 誤差(低變異數、高偏差), 時退化成蒙特卡洛優勢估計(高變異數、無偏),常見取值在 0.9~0.97 之間權衡。在 LLM RLHF 場景裡,由於原始 reward 只落在序列最後一個 token, 需要學會”預測從當前生成到結尾最終能拿到的 RM 分數”,這也是為什麼需要單獨訓練一個 Critic(價值模型),通常從 SFT 模型或 RM 初始化,輸出維度改成每個 token 位置一個標量。
實際實現中,PPO 的總損失是三項的組合:
是上面推導的 clipped policy objective,訓練 Actor; 是 Critic 的迴歸損失(); 是策略的熵,加一個熵獎勵鼓勵策略保持一定的隨機性,防止過早收斂到確定性輸出。 分別控制價值損失和熵獎勵的權重。
4. LLM RLHF 裡的 PPO:四個模型與 KL 懲罰
經典 RL 場景(比如 MuJoCo)裡 PPO 只需要 Actor 和 Critic 兩個網路。LLM RLHF 的 PPO 階段要同時在視訊記憶體裡放四個模型,這是它區別於經典 PPO 最大的工程挑戰:
| 模型 | 是否訓練 | 作用 |
|---|---|---|
| Policy / Actor | 訓練 | 當前正在最佳化的 LLM,從 SFT 模型初始化,負責生成回覆 |
| Reference Model | 凍結 | SFT 模型的一份只讀副本,只用來計算 KL 懲罰,防止 Policy 跑得太遠 |
| Reward Model | 凍結 | 單獨訓練好的打分模型,只在序列末尾給一個標量分數 |
| Critic / Value Model | 訓練 | 預測每個 token 位置的價值 ,為 GAE 提供優勢估計 |
四個模型往往參數規模相近(Critic 和 Reward Model 有時共享底座,只是輸出頭不同),意味著 PPO 階段的視訊記憶體和計算開銷大約是純推理的數倍——這也是後面 GRPO 等變體想要砍掉 Critic 的直接動機。
只靠 RM 的打分做 reward,策略很容易朝著 RM 的漏洞最佳化過去,而不是真正變得更好。RLHF 的標準做法是把 Policy 和 Reference Model 之間的 KL 散度作為懲罰項加進 reward:
這個 KL 懲罰是逐 token計算並加到每一步的 reward 上,而 RM 的分數只在最後一個 token 出現——GAE 會自動把末尾的 RM 分數按時間差分傳播回前面的 token(credit assignment),每一步自身的 KL 偏移也被即時計入 reward,兩件事互不衝突。 的取值很敏感:太小則約束不住策略,容易 reward hacking;太大則策略幾乎不敢偏離 SFT 模型,學不到 RM 想要的偏好。InstructGPT 等工作採用自適應 KL 控制:持續監控實際 KL 值和目標 KL 的偏差,用一個簡單的比例控制器動態調整 ,而不是固定一個常數。
5. 實踐中的坑、PPO 之外的變體
工程實踐裡幾個常見的坑:Reward hacking——策略找到 RM 打分函數里的漏洞而不是真正提升質量,常見表現是回覆異常囉嗦(RM 對長回覆有偏好)、堆砌 RM 喜歡的措辭,緩解手段包括 KL 懲罰、RM 整合、定期用新資料重新訓練 RM;PPO epoch 數不能太多——同一批 rollout 資料重複做太多次梯度更新會讓策略過擬合到這批樣本、KL 迅速失控,LLM RLHF 裡通常只做 1~2 個 epoch,比經典 RL 場景保守得多;Value Model 訓練不穩定——Critic 從頭學習預測最終 RM 分數本身很難,訓練早期價值估計噪聲大會汙染優勢估計,一些實踐會先單獨 warm-up Critic;Reward 歸一化——不同 batch 之間 RM 分數尺度可能漂移,常用 running mean/std 歸一化(whitening);取樣參數——rollout 階段的 temperature/top-p 直接決定探索到的動作分佈,進而影響優勢估計的變異數,是個容易被忽略但影響很大的超參數。
PPO 的主要代價是”重”:需要單獨訓練 RM、維護 Critic、同時跑四個模型。近兩年的變體分別砍掉了一部分複雜度:**DPO(Direct Preference Optimization)**跳過顯式的 RM 和 PPO 取樣-更新迴圈,直接從人類偏好對 構造對比式損失函數,用監督學習的方式最佳化策略,代價是假設了 Bradley-Terry 偏好模型,且失去了線上探索的靈活性;**GRPO(Group Relative Policy Optimization,DeepSeekMath 提出)**保留 PPO 的 clipped objective 和線上 rollout,但去掉 Critic——對同一個 prompt 取樣一組輸出,用組內獎勵的平均值和變異數把每個輸出的優勢標準化,直接省掉一個和 Policy 同等規模的模型,是目前 LLM 推理能力訓練中很受歡迎的簡化方向。這兩者都是在”PPO 的通用性”和”更少的模型、更簡單的流程”之間做取捨——PPO 仍是最成熟、最通用的基線,但如果偏好資料結構足夠規整,或能接受組內相對獎勵的近似,更輕量的變體往往價效比更高。
歸根結底,PPO 在 LLM RLHF 裡做的事情,是把”用 RM 的打分改進模型”這件事,約束在”每一步更新都不能偏離參考模型太遠”的框架裡完成:clipped surrogate objective 保證單次更新幅度有界,GAE 把稀疏的序列級獎勵合理分攤到每個 token 上,KL 懲罰從 reward 層面再加一道防線。理解這三件事分別在解決什麼問題,比記住最終的目標函數公式更重要。