完整目标:三项之和,两套参数
PPO 同时优化两个网络:策略 \(\pi_\theta\)(参数 θ)和价值网络 \(V_\phi\)(参数 φ)。总目标是三项的加权和:
符号速查表 —— 只列 GRPO 篇没有的新面孔
\(\mathbb{E}\)、\(\pi_\theta\)、\(w\)、clip、min 等与 GRPO 篇速查表含义相同,不再重复。一句话记住 PPO:"critic 给每个 token 估价 (V) → 实际回报与估价的差算成逐 token 优势 (GAE) → 按新旧概率比加权更新,同时训练 critic 让估价更准"。
状态 / 动作。经典 RL 术语;在 LLM 里,\(s_t\) = "prompt + 已生成的前 t 个 token",\(a_t\) = 第 t 个生成的 token。下标 \(t\) 沿一条回答逐 token 走。
价值函数(critic):一个独立训练的网络(参数 φ),输入"写到一半的文本",输出"从这里写下去预期最终能拿多少奖励"。它是 PPO 的 baseline 来源,也是本页主角。
逐 token 奖励。注意与 GRPO 篇的序列级 \(r_i\) 不同:PPO 的框架里每一步都可以有奖励。LLM 场景的实际形态:中间 token 的 \(r_t\) ≈ 0(或只有 KL 项),完整奖励挤在最后一个 token。
折扣因子:未来奖励打折的比例(经典 RL 取 0.99)。LLM 里常取 1.0——"第 500 个 token 拿到的分不比第 5 个 token 的便宜"。
TD 误差(时序差分误差):\(r_t + \gamma V(s_{t+1}) - V(s_t)\),即"走了一步之后,发现实际比 critic 预期好/差多少"。GAE 的原材料。
GAE 的偏差-方差旋钮:决定往后看多少步的 TD 误差(常取 0.95)。λ=0 只看一步(信 critic,低方差高偏差);λ=1 看到底(信实际回报,高方差低偏差)。
token 级优势:第 t 个 token "比 critic 预期好多少"。与 GRPO 的序列级 \(\hat{A}_i\) 本质不同——每个 token 有自己的值,天然自带 credit assignment。
价值损失:critic 的回归目标,让 \(V_\phi\) 逼近实际观测到的回报 \(V^{target} = \hat{A}_t + V_{old}(s_t)\)。critic 与策略在同一个循环里交替变准。
损失权重:\(c_1\)(常 0.5~1.0)控制价值损失占比;\(c_2\)(经典 RL 常 0.01,LLM 常 0)控制熵奖励力度。
策略熵:\(-\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 还是信实际回报
| λ | 等价于 | 特性 |
|---|---|---|
| 0 | TD(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-p | rollout 时的探索来源(替代④的职能之一);训练-推理温度不一致又是一个隐形坑 |
| 正交初始化、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)\) 变成统计出来的组内对照。
baseline = 同一 prompt 的贪心解码回答的 reward(只多推理一次)
采 G 条,baseline = 其余 G−1 条的均值(留一法,无偏)
采 G 条,组内 减均值除 std,保留 PPO 的 min/clip 骨架
但故事没有停在 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 篇 —— 七个旋钮的后续故事