RL FOR LLM · 姊妹篇 · 前传

PPO 公式解剖

六个旋钮,与一个叫 Critic 的主角

PPO(Schulman et al., 2017)是 GRPO 的直系祖先,也是 InstructGPT / ChatGPT 初代 RLHF 的引擎。 它与 GRPO 最大的结构差异是多了一整个要训练的价值网络(critic)——本页的主线就是: critic 带来了什么、为什么在 LLM 时代它成了负担、以及大家如何一步步把它砍掉,故事的终点正是 GRPO 篇的起点。

完整目标:三项之和,两套参数

PPO 同时优化两个网络:策略 \(\pi_\theta\)(参数 θ)和价值网络 \(V_\phi\)(参数 φ)。总目标是三项的加权和:

$$J_{PPO}(\theta, \phi) = \mathbb{E}_t\Big[ \underbrace{\min\big( \textcolor{#f87171}{w_t}\, \textcolor{#60a5fa}{\hat{A}_t},\ \textcolor{#f87171}{\mathrm{clip}(w_t,\, 1\!-\!\varepsilon,\, 1\!+\!\varepsilon)}\, \textcolor{#60a5fa}{\hat{A}_t} \big)}_{\text{① 策略损失 } L^{CLIP}} \Big] \;-\; \underbrace{c_1\, \textcolor{#a78bfa}{L^{VF}(\phi)}}_{\text{③ 价值损失}} \;+\; \underbrace{c_2\, \textcolor{#fb7185}{\mathcal{H}\big[\pi_\theta\big]}}_{\text{④ 熵奖励}}$$
$$\textcolor{#60a5fa}{\hat{A}_t = \sum_{l=0}^{\infty} (\gamma\lambda)^l\, \delta_{t+l}}, \quad \delta_t = r_t + \gamma \textcolor{#a78bfa}{V_\phi(s_{t+1})} - \textcolor{#a78bfa}{V_\phi(s_t)} \qquad\text{② GAE}$$
$$\textcolor{#a78bfa}{L^{VF}(\phi) = \big( V_\phi(s_t) - V_t^{target} \big)^2}, \qquad \textcolor{#fb923c}{r_t \mathrel{+}= -\beta\, \log\tfrac{\pi_\theta}{\pi_{ref}}\ \text{(LLM: KL 折进奖励)}} \quad\text{③ / ⑤}$$
① 比值 w 与 clip
② GAE 优势 Â
③ Critic Vφ
④ 熵 H
⑤ KL 控制
⑥ 训练循环(公式外)

符号速查表 —— 只列 GRPO 篇没有的新面孔

\(\mathbb{E}\)、\(\pi_\theta\)、\(w\)、clip、min 等与 GRPO 篇速查表含义相同,不再重复。一句话记住 PPO:"critic 给每个 token 估价 (V) → 实际回报与估价的差算成逐 token 优势 (GAE) → 按新旧概率比加权更新,同时训练 critic 让估价更准"

\(s_t\ /\ a_t\)

状态 / 动作。经典 RL 术语;在 LLM 里,\(s_t\) = "prompt + 已生成的前 t 个 token",\(a_t\) = 第 t 个生成的 token。下标 \(t\) 沿一条回答逐 token 走。

\(V_\phi(s_t)\)

价值函数(critic):一个独立训练的网络(参数 φ),输入"写到一半的文本",输出"从这里写下去预期最终能拿多少奖励"。它是 PPO 的 baseline 来源,也是本页主角。

\(r_t\)

逐 token 奖励。注意与 GRPO 篇的序列级 \(r_i\) 不同:PPO 的框架里每一步都可以有奖励。LLM 场景的实际形态:中间 token 的 \(r_t\) ≈ 0(或只有 KL 项),完整奖励挤在最后一个 token。

\(\gamma\)

折扣因子:未来奖励打折的比例(经典 RL 取 0.99)。LLM 里常取 1.0——"第 500 个 token 拿到的分不比第 5 个 token 的便宜"。

\(\delta_t\)

TD 误差(时序差分误差):\(r_t + \gamma V(s_{t+1}) - V(s_t)\),即"走了一步之后,发现实际比 critic 预期好/差多少"。GAE 的原材料。

\(\lambda\)

GAE 的偏差-方差旋钮:决定往后看多少步的 TD 误差(常取 0.95)。λ=0 只看一步(信 critic,低方差高偏差);λ=1 看到底(信实际回报,高方差低偏差)。

\(\hat{A}_t\)

token 级优势:第 t 个 token "比 critic 预期好多少"。与 GRPO 的序列级 \(\hat{A}_i\) 本质不同——每个 token 有自己的值,天然自带 credit assignment。

\(L^{VF}\ /\ V^{target}\)

价值损失:critic 的回归目标,让 \(V_\phi\) 逼近实际观测到的回报 \(V^{target} = \hat{A}_t + V_{old}(s_t)\)。critic 与策略在同一个循环里交替变准。

\(c_1,\ c_2\)

损失权重:\(c_1\)(常 0.5~1.0)控制价值损失占比;\(c_2\)(经典 RL 常 0.01,LLM 常 0)控制熵奖励力度。

\(\mathcal{H}[\pi_\theta]\)

策略熵:\(-\sum_a \pi(a|s)\log\pi(a|s)\),输出分布的"犹豫程度"。加进目标里鼓励探索,防止过早收敛到确定性策略。

策略损失 —— 比值与 clip(GRPO 从这里继承)

\(w_t = \pi_\theta(a_t|s_t) / \pi_{old}(a_t|s_t)\),min/clip 的"不许刷分、不拦纠错"设计理念详见 GRPO 篇②,此处只讲 PPO 原生语境的差异

变体 / 旋钮说明
ε 的取值0.1 ~ 0.3,常用 0.2。Atari/MuJoCo 调参经验与 LLM 不通用,LLM RLHF 常用更小的 ε 或配合 target-KL 早停
Dual-Clip 的出生地给 \(\hat{A}<0,\ w\gg 1\) 方向补上界 \(c\approx 3\)——这个补丁最早来自游戏 AI(王者荣耀 Wukong),后来才被 LLM 社区借用
target-KL 早停不改公式,监控 \(\mathbb{D}_{KL}(\pi_{old}\|\pi_\theta)\) 超阈值就提前结束本批更新(OpenAI Spinning Up 的默认实践)——用⑥的手段兜①的底
前身:TRPO 硬约束\(\max J\ \text{s.t.}\ \mathbb{D}_{KL} \le \delta\),需要二阶优化(共轭梯度 + 线搜索)。PPO 的 clip 就是它的一阶廉价近似——PPO 本身就是"调公式"的产物

GAE 优势估计 —— λ 与 γ 的偏差-方差交易

\(\hat{A}_t = \sum_l (\gamma\lambda)^l \delta_{t+l}\):把"每一步实际比预期好多少"(TD 误差)沿时间指数加权累加

λ:信 critic 还是信实际回报

λ等价于特性
0TD(0):只看一步低方差
0.95常用默认折中
1蒙特卡洛:\(\hat{A}_t = R_t - V(s_t)\)高方差、无偏

λ 越小越依赖 critic 的估价(critic 不准就引入偏差);λ 越大越依赖实际回报(奖励稀疏时方差大)。整个权衡是否成立,取决于 critic 准不准——伏笔埋向③。

变体 / 旋钮说明
γ 的语义切换经典 RL 取 0.99(未来奖励打折);LLM 常取 1.0——token 位置没有"时间成本",打折反而惩罚长回答后段
LLM 退化形态奖励只在末 token(中间 \(r_t \approx 0\)),γ=λ=1 时 GAE 坍缩为 \(\hat{A}_t = R - V(s_t)\):所有 token 共享同一个 R,差异全来自 \(V(s_t)\)——credit assignment 的担子完全压在 critic 身上
advantage 归一化按 minibatch 减均值除 std("37 个实现细节"之一)——GRPO 组内归一化的前身
GAE 重算时机每个 epoch 用更新后的 critic 重算 Â,还是整批固定——实现层分歧,影响可观

Critic 本身 —— 本页主角,也是后来被砍的那个

一个与策略同量级的完整网络,专职给"写到一半的文本"估价。它的训练质量决定②的一切,它的成本决定 PPO 在 LLM 时代的命运

变体 / 旋钮说明
Value clipping\(L^{VF} = \max\big((V_\phi - V^{targ})^2,\ (\mathrm{clip}(V_\phi,\, V_{old}\pm\varepsilon_v) - V^{targ})^2\big)\)——注意是悲观 max(取更大的损失),给 critic 也套一个信任域。实证上收益存争议,但几乎所有实现都带
损失权重 \(c_1\)0.5 ~ 1.0。共享底座时它决定两个任务抢梯度的比例;独立网络时等价于 critic 的学习率
共享底座 vs 独立网络经典 RL(Atari)常共享 CNN 底座 + 两个头;LLM RLHF 几乎都用独立 critic(常从 reward model 初始化)——代价是显存再多一个 policy 量级的模型
Critic 预热(warmup)先冻结策略、只训 critic 若干步再联合训练——初始 critic 是随机的,直接联训会用垃圾 Â 更新策略
初始化来源从 RM 初始化(输出头已对齐奖励尺度)vs 从 SFT 初始化(表征贴近策略)——两派做法并存
诊断指标explained variance:\(1 - \mathrm{Var}(V^{targ} - V_\phi)/\mathrm{Var}(V^{targ})\),接近 1 = critic 称职;接近 0 甚至为负 = Â 全是噪声

Critic 给 PPO 的两样礼物

  • 逐 token 的 credit assignment:\(V(s_t)\) 的逐步变化天然指出"哪一步走对/走错"——这是组相对方法(GRPO)至今没有的能力
  • 低方差 baseline:减掉 \(V(s_t)\) 大幅压低梯度方差,单条轨迹也能学(GRPO 必须靠采 G 条来凑 baseline)

它在 LLM 场景的三宗罪

  • 显存翻倍:RLHF 已要同时驻留 policy / ref / RM 三个模型,critic 是第四个,且要训练(优化器状态×3)
  • 学不准:奖励稀疏在末 token,"这段写到一半的证明值多少分"本质上难以回答;explained variance 常年难看
  • 不准则有害:critic 的偏差直接注入每个 token 的 ——礼物变毒药,②的低方差优势名存实亡

熵奖励 —— 经典 RL 的探索保险,LLM 里的弃子

\(+\, c_2\, \mathcal{H}[\pi_\theta]\):往目标里加一项"保持犹豫"的奖励,防止策略过早变成确定性策略

变体 / 旋钮说明
\(c_2\) 的取值经典 RL 常 0.01;LLM RLHF 常直接取 0——词表几万维,熵奖励会鼓励往胡言乱语的 token 上摊概率
用别的旋钮替代LLM 时代维持探索改用:采样温度(⑥)、Clip-Higher(放宽①的上界,让低概率 token 能被推高)、KL 正则的松紧(⑤)——熵项的职能被拆给了其他旋钮
熵作为监控指标即使不进 loss,熵也是最重要的仪表盘之一:骤降 = 熵坍缩(探索死亡),骤升 = 策略崩坏(开始胡说)

KL 控制 —— 一条贯穿 TRPO → PPO → RLHF 的演化线

"别让策略一步跑太远"这一个诉求,先后有四种实现,而且注意:前三种约束的是 \(\pi_{old}\)(信任域),第四种约束的是 \(\pi_{ref}\)(总漂移锚)——是两个不同的参照物

路线做法代表
硬约束\(\max J\ \ \text{s.t.}\ \mathbb{D}_{KL}(\pi_{old}\|\pi_\theta) \le \delta\),二阶优化求解TRPO (2015)
自适应惩罚\(J - \beta\,\mathbb{D}_{KL}\),KL 超标就调大 β、低于目标就调小PPO-penalty
clip 替代干脆不算 KL,用比值截断近似信任域(即①)PPO-clip(事实标准)
折进奖励(RLHF 特色)\(r_t \mathrel{+}= -\beta\log\frac{\pi_\theta}{\pi_{ref}}\) 逐 token 塑形,防止策略偏离初始模型太远(奖励模型在远处不可信)InstructGPT 及主流 RLHF
混预训练梯度PPO 目标 + \(\gamma_{ptx}\) × 预训练语言建模 loss,防灾难性遗忘PPO-ptx(InstructGPT)

训练循环 —— 公式外的"37 个实现细节"

PPO 的表现里,实现细节的贡献不亚于算法本身(Huang et al. 的著名复现研究)。这些不在公式里,却决定成败

旋钮说明
epoch 复用次数 K一批 rollout 数据重复训练 3~10 遍——这正是 \(w\) 偏离 1 的制度性来源:K 越大越 off-policy,①和⑤压力越大。LLM RLHF 常保守到 K=1~2
minibatch 划分与 shuffle批内随机切分,每个 epoch 重新洗牌;advantage 归一化按 minibatch 做还是按整批做,结果不同
学习率退火 / 梯度裁剪线性退火到 0;全局梯度范数裁剪(0.5)——两个"不起眼但删了就崩"的细节
奖励缩放 / 白化reward 做 running std 缩放,防止 value loss 尺度失控——GRPO 组内 std 归一化的精神前身(连同它的争议)
采样温度 / top-prollout 时的探索来源(替代④的职能之一);训练-推理温度不一致又是一个隐形坑
正交初始化、Adam ε 等"37 个细节"清单的长尾——每一条单独看都微不足道,合起来决定能否复现论文数字

全景图:双网络的数据流

critic 同时被 \(c_1 L^{VF}\) 反向训练:主循环里嵌着一个"给估价师上课"的副循环——两个网络互相依赖、交替变准,这正是 PPO 比 GRPO 难调稳的结构性原因

算法 ↔ 旋钮映射

  • TRPO⑤硬约束
  • PPO-penalty⑤自适应β
  • PPO-clip⑤→clip
  • InstructGPT⑤shaping+ptx⑥K=1
  • Dual-Clip PPO
  • ReMax / RLOO / GRPO砍③改②
  • VC-PPO / VAPO修③②解耦λ

诊断指标 → 该查哪个旋钮

  • explained var ≈ 0 / 负③ critic(warmup、初始化、c₁)
  • value loss 爆炸 ⑥ 奖励缩放
  • 熵坍缩④ c₂ ① clip 上界
  • KL 飙升⑥ epoch K ⑤ β
  • clip fraction 高⑥ off-policy 深度 ① ε

终章:砍掉 critic 之路,与钟摆的回摆

到 LLM 时代,③的三宗罪(显存、学不准、不准则有害)让"critic 是否值得"成为公开问题。答案沿一条清晰的路线演化——核心 trick 都是同一个:用"多采几条回答"换掉"训练一个估价网络",baseline 从模型学出来的 \(V(s_t)\) 变成统计出来的组内对照。

ReMax

baseline = 同一 prompt 的贪心解码回答的 reward(只多推理一次)

RLOO

采 G 条,baseline = 其余 G−1 条的均值(留一法,无偏)

GRPO

采 G 条,组内 减均值除 std,保留 PPO 的 min/clip 骨架

砍掉后得到的

显存省下一整个可训练模型;少了一个要调稳的网络与 c₁、λ、warmup 等一串超参;奖励本来就在序列末尾,组对照与之天然匹配。

砍掉后失去的(每一条都变成了 GRPO 篇的旋钮)

token 级 credit assignment 没了 → GRPO 篇③"引回 critic/PRM"那一行;Â 退化为序列级但 w 还是 token 级 → 粒度错位 → GRPO 篇①的 GSPO;组内统计的 std/长度归一化又埋新雷 → 的 Dr. GRPO 与 DAPO。

但故事没有停在 GRPO:钟摆已经开始往回摆

"砍掉 critic"不是历史的终点,而是钟摆的一个方向。字节 Seed 的 VC-PPO / VAPO 正面论证 value-based 在长 CoT 推理上优于 value-free(VAPO 在 AIME 上超过同门的 DAPO);智谱等团队的新报告也用回了 PPO。而且回摆不是用回原版 PPO——是带着修好的 critic 回来的:当年三宗罪里最致命的"学不准",这几年有了具体解法。

Value Pretraining

先用蒙特卡洛回报把 critic 单独预训练到位,再进 RL 循环——治"初始 critic 是垃圾、联训互相拖累"(VC-PPO)

解耦 GAE

critic 用 λ=1 训练(无偏,治长序列 value 衰减偏差),policy 用 λ<1(压方差)——同一个 λ 旋钮,两个网络各转各的,又一个"调公式"标本(VC-PPO / VAPO)

长度自适应 GAE

λ 随序列长度变化,长 CoT 下 credit assignment 更稳(VAPO)

所以 critic 之争的本质是一个资源分配的设计理念问题:你愿意把预算花在「训练一个估价网络」还是「多采几条回答」上?前者买到 token 级信号和单轨迹学习,承担 value 学习的工程风险;后者买到架构简单免调 critic,承担 rollout 成本和粒度错位的疤。答案取决于你的瓶颈在显存还是推理、任务需不需要精细 credit assignment、以及有没有把 critic 训准的工程能力——最后这条是大厂与小团队的真实分水岭,GRPO 的流行有一半原因是它对工程能力要求低。

把两页连起来看:PPO 用一个 critic 网络换来 token 级的精细信号;GRPO 用统计对照换掉 critic,省下成本也留下粒度错位的疤;GSPO、DAPO、Dr. GRPO 给这道疤做后续处理;而 VC-PPO、VAPO 和智谱们又带着修好的 critic 摆了回来。 算法史不是"新的打败旧的",而是一连串"为当下瓶颈重新分配代价"的交易——没有淘汰,只有轮换。连"砍不砍掉整个组件"这种结构级决策,也是可逆的、随瓶颈漂移的。读懂每笔交易换了什么,比记住公式本身重要得多。

继续阅读:GRPO 篇 —— 七个旋钮的后续故事