VC-PPO 详解:PPO 在长 CoT 上为什么崩?价值优化才是命门
2024 年底到 2025 年,DeepSeek-R1 带火了”用 RL 训练长思维链(Long CoT)“这条路线。当时社区里一个流行的印象是:PPO 在长 CoT 任务上不行了,GRPO 才是正解——GRPO 直接砍掉 critic,用组内相对奖励当优势,简单稳定,效果还好。
字节 Seed 团队 2025 年 3 月的这篇论文(也是 DAPO 同一拨人)提出了一个不同的诊断:PPO 不是不行,是它的价值模型(value model / critic)在长 CoT 场景下坏掉了。只要把 critic 修好,PPO 不但能活,还能反超 GRPO。
论文:What’s Behind PPO’s Collapse in Long-CoT? Value Optimization Holds the Secret 作者:Yufeng Yuan, Yu Yue, Ruofei Zhu, Tiantian Fan, Lin Yan(ByteDance Seed) 链接:https://arxiv.org/abs/2503.01491 提出的算法:VC-PPO(Value-Calibrated PPO,价值校准的 PPO)
一句话版:PPO 在长 CoT 上崩溃有两个根因——value 初始化偏差和奖励信号衰减;VC-PPO 用 Value Pretraining(价值预训练)治前者,用 Decoupled-GAE(解耦 GAE)治后者,把 AIME 上的 PPO 从 5.6 分救到 49 分,超过同设置下 GRPO 的 38.9 分。
背景:RLHF 里的 PPO 长什么样
先把符号定下来。语言生成被建模成一个 token 级 MDP:
- 状态 \(s_t = (x_0, ..., x_m, y_0, ..., y_t)\):prompt 加上已生成的 token;
- 动作:从词表里选下一个 token;
- 奖励:稀疏地只给在最后一个
token(
<eos>)上——比如数学题答对 +1、答错 -1,中间的思考过程没有分步奖励。
PPO 的 policy 更新用 clipped surrogate objective:
\[L^{CLIP}(\theta) = \hat{\mathbb{E}}_t \Big[ \min\big(r_t(\theta)\hat{A}_t,\ \mathrm{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t\big) \Big]\]
其中优势 \(\hat{A}_t\) 用 GAE 估计:
\[\hat{A}_t = \sum_{l=0}^{T-t-1} (\gamma\lambda)^l \delta_{t+l}, \qquad \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)\]
RLHF 里通常 \(\gamma = 1\),\(\lambda = 0.95\)。 critic \(V(s)\) 是个”LLM 骨干 + 每个 token 输出一个标量”的网络,惯例是从训好的 reward model 初始化。
这两个惯例——\(\lambda=0.95\) 的 GAE、用 reward model 初始化 critic——在传统 RL(MuJoCo/Atari)和短回复 RLHF 里都没问题,但论文证明它们在长 CoT 下恰好是两颗雷。
失败现象:输出长度崩塌
直接把 PPO 搬到长 CoT 任务上,训练一开始就出现:
- 验证集性能持续下降;
- 模型输出长度急剧缩短。
这两件事是因果关联的:已有研究表明输出长度和复杂推理能力强相关(o1 的核心就是”想得更久”),长度崩了,推理能力自然崩。而奖励是规则 verifier 给的,本身并不偏好短答案——所以长度崩塌只能来自 policy 优化动力学,也就是每个 token 拿到的优势信号出了问题。
根因一:Value 初始化偏差(为什么模型越来越短)
惯例是用 reward model 初始化 critic。看起来很合理——两者都是”给 response 打个标量分”。但论文指出两者目标其实不匹配:
- Reward model 只在
<eos>位置被训练打分,前面的 token 不参与训练。于是它对越靠前的 token(越不完整的 response)天然打出越低的分; - Value model 的任务是估计”从当前 token 继续生成,期望最终拿多少奖励”。
训练初期 KL 惩罚约等于 0,把 reward model 的分数当 \(V\) 用,代入 TD 误差 \(\delta_t = r_t + V(s_{t+1}) - V(s_t)\):由于靠前的 token \(V\) 系统性偏低,每一步都产生一个正偏差,并且沿轨迹累积。展开 GAE 看:
\[\hat{A}_t = \sum_{l=0}^{T-t-1} \lambda^l \big(r_{t+l} + V(s_{t+l+1}) - V(s_{t+l})\big)\]
结果是:越靠前的 token,优势被抬得越正。模型发现”早点结束、让’靠前的 token’占比更高”能拿到虚高的优势,于是疯狂缩短输出——这就是长度崩塌的机制。论文里 advantage vs token position 的相关图(Figure 2)非常直观地验证了这一点。
解法:Value Pretraining
思路很直接:正式开训之前,先把 critic 校准好。具体步骤:
- 冻结 policy(就用 SFT policy \(\pi_{sft}\)),持续采样 response;
- 用 \(\lambda = 1.0\) 的 GAE(即 Monte-Carlo return)更新 critic——此时 value 优化退化为对真实回报的纯监督回归,是稳定的梯度下降而不是半梯度方法;
- 训到 value loss 和 explained variance 足够低,存 checkpoint,之后的 RL 全程用它初始化。
论文对 value pretraining 的 loss 曲线有个有意思的观察(Figure 6):两阶段收敛。
- 第一阶段 loss 快速下降,作者称为 range alignment(量程对齐)——critic 先学会”回报大概是 ±1 这个量级”,这等价于传统 RL 里的 value warm-up;
- 第二阶段缓慢下降,作者称为 knowledge injection(知识注入)——critic 开始学会”哪些 token 更有价值”,这才是传统 warm-up 完全忽略、但对最终性能影响巨大的部分。
预训练步数也不是越多越好:消融显示 100 步最佳,150 步开始过拟合、泛化变差。
根因二:奖励信号衰减(为什么 λ=0.95 在长序列下失灵)
第二个问题更本质,藏在 GAE 的公式里。把 value 的回归目标写出来:
\[V^{target}(s_t) = \begin{cases} \sum_{l=0}^{T-t-1} \lambda^l \big(r_{t+l} + V(s_{t+l+1}) - V(s_{t+l})\big) + V(s_t), & \lambda < 1 \\ \sum_{l=0}^{T-t-1} r_{t+l}, & \lambda = 1 \end{cases}\]
RLHF 的奖励只在末端给,所以传到第 \(t\) 个 token 的奖励信号是 \(\lambda^{T-t} \cdot r_{eos}\)。\(\lambda = 0.95\) 时,往前传 100 个 token 就只剩 \(0.95^{100} \approx 0.6\%\)——长 CoT 动辄几千 token,前半段 token 的 critic 完全收不到奖励信号,价值估计自然一片混沌。CoT 越长,问题越严重。
那干脆把 \(\lambda\) 也调成 1.0 不就行了?没那么简单——policy 侧需要小 \(\lambda\) 来降方差。GAE 优势的方差展开为:
\[\mathrm{Var}[\hat{A}_t^\lambda] = \sum_{l=0}^{T-t-1} \lambda^{2l} \mathrm{Var}[\delta_{t+l}] + 2\sum_{i<j} \lambda^{i+j} \mathrm{Cov}[\delta_{t+i}, \delta_{t+j}]\]
\(\lambda\) 越小,那些更靠后、更不可靠的 TD 误差权重衰减得越快,优势估计方差越小,policy 收敛越快。在大模型训练的算力约束下,这个收敛速度是刚需。
于是一个矛盾浮出水面:critic 想要 \(\lambda=1\)(低偏差),policy 想要 \(\lambda<1\)(低方差)——而标准 PPO 里两者被迫共用同一个 \(\lambda\)。
解法:Decoupled-GAE
VC-PPO 的做法:actor 和 critic 各用各的 \(\lambda\)——\(\lambda_{actor} = 0.95\) 保收敛速度,\(\lambda_{critic} = 1.0\) 保奖励信号不衰减。
这样做数学上合法吗?论文给了一个简洁的证明:用任意价值函数 \(\bar{V}\) 定义 n-step return \(G_{t:t+h}\),policy 梯度可以重写成
\[\mathbb{E}_t\big[\nabla_\theta \log \pi_\theta(a_t|s_t) \hat{A}_t\big] = \mathbb{E}_t\Big[\nabla_\theta \log \pi_\theta(a_t|s_t) \Big((1-\lambda)\sum_{l=1}^{T-t-1}\lambda^{l-1} G_{t:t+l} + \lambda^{T-t-1} G_{t:T} - \bar{V}(s_t)\Big)\Big]\]
其中 \(\bar{V}(s_t)\) 项在期望意义下不贡献梯度(baseline 性质)。代入任意 \(\bar{V}\) 都不会给 policy 梯度引入额外偏差——所以 critic 用 \(\lambda=1.0\) 训出来的 \(V\) 完全可以配 actor 的 \(\lambda=0.95\) 用。
直觉上说:value 优化是 MSE 回归,对方差耐受;policy 梯度对高方差敏感。两者对 bias-variance 的偏好本来就不同,强行共享 \(\lambda\) 没有道理。这也是论文认为最有后续研究价值的观察。
VC-PPO 完整算法
两个技术合起来就是 VC-PPO,和 PPO 的差别只有两处(伪代码第 5、6 行):
1 | |
改动极小,属于”两行代码级”的修改,但效果天差地别。
实验
设置:Qwen2.5-32B-Base,几十个带
<think> 格式样本做 cold start;verl
框架;规则奖励(答案对 +1,错 -1,忽略 think 部分);KL 系数设
0(规则奖励无法被 hack);policy lr \(1\times10^{-6}\),critic lr \(2\times10^{-6}\)。主实验 16k context,消融
8k。
主结果(16k context,对比 GRPO):
| 模型 | AIME24 pass@1 | AIME24 pass@32 | GPQA | CodeForces |
|---|---|---|---|---|
| GRPO | 38.9 | 70.0 | 49.4 | 12.6 |
| VC-PPO | 48.8 | 73.3 | 48.8 | 12.8 |
48.8 是当时不蒸馏的 Qwen-32B-Base 在 AIME 上的最高分,超过了 DeepSeek-R1 技术报告里同口径的 47.0(论文也注明 R1 训练数据未公开,严格对比不成立)。作者还提到 VC-PPO 已用于内部模型,AIME 拿到 74。
消融(8k context)——两个组件缺一不可:
| 算法 | AIME pass@1 | AIME pass@32 | GPQA | CodeForces |
|---|---|---|---|---|
| GRPO | 35.8 | 63.0 | - | - |
| PPO(裸奔) | 5.6 | 36.7 | 38.7 | 7.3 |
| VC-PPO w/o Decoupled-GAE | 29.4 | 66.7 | 46.9 | 9.9 |
| VC-PPO 完整版 | 41.9 | 76.6 | 48.6 | 11.4 |
裸 PPO 只有 5.6 分——基本就是把 SFT 模型训坏了。去掉 Decoupled-GAE 掉到 29.4,说明光修初始化不够,训练中的信号衰减同样致命。
Value Pretraining 步数消融:50 步 20.6 → 100 步 30.1 → 150 步 25.1(过拟合回落)。
\(\lambda_{actor}\) 消融(\(\lambda_{critic}\) 固定 1.0):
| \(\lambda_{actor}\) | 0.9 | 0.95 | 0.99 | 1.0 |
|---|---|---|---|---|
| AIME pass@1 | 34.3 | 41.3 | 41.9 | 29.4 |
\(\lambda_{actor} = 1.0\) 明显最差,坐实了”policy 侧必须降方差”;推荐区间 \([0.95, 1.0)\)。
讨论里两个值得记住的观点
1. 先验越强,value 越需要对齐。 传统 RL 里 policy 和 value 都是随机初始化,谁也不用迁就谁。但 RLHF 的初始 policy 是 SFT 模型、还带着精心构造的 CoT 格式——是个很强的先验。此时一个未对齐的 critic 几轮更新就能把 CoT pattern 摧毁(长度崩塌就是表现形式)。Value pretraining 本质上是让 critic 先对齐到初始 policy,再开始动 policy。
2. value 和 policy 对 bias-variance 的偏好天然不同。 MSE 回归目标对方差不敏感(要 \(\lambda=1\) 的低偏差),policy gradient 目标被高方差拖累(要 \(\lambda<1\) 的低方差)。共享 \(\lambda\) 是传统 RL 高方差累积奖励环境下的遗产,在”轨迹级、定义良好”的 RLHF 奖励下并不成立。
我的评价
- 定位:这篇论文是”保住 PPO”路线(与之相对的是 GRPO/DAPO 的”干掉 critic”路线)里最有说服力的一篇。它说明 PPO 在长 CoT 上的失败不是算法本质缺陷,而是两个可以精准定位、低成本修复的工程+理论问题。
- 优点:诊断做得非常漂亮——从”长度崩塌”这个现象一路追到 advantage 与 token position 的相关性,再追到 RM/critic 目标不匹配和 GAE 衰减,链条完整、每步都有图或公式支撑。Decoupled-GAE 的无偏性证明也很干净。
- 局限:实验只有 Qwen2.5-32B 一个模型、数学为主的任务;value pretraining 要额外花一笔采样+训练成本;对比的 GRPO 基线未必是调到最好的 GRPO。另外它和 DAPO 的关系有点微妙——同一个团队先后给出了”救活 critic”和”不要 critic”两套方案,实际工程中 DAPO(critic-free)反而流传更广,多少说明维护一个良好 critic 的成本依然不低。
- 实践建议:如果你在用 veRL/OpenRLHF 跑 PPO 类长 CoT 训练,遇到输出长度莫名缩短,先画一张 advantage vs token position 的图——大概率能直接复现这篇论文的 Figure 2,然后 value pretraining + \(\lambda_{critic}=1.0\) 两板斧下去。
点赞与评论
喜欢这篇文章?点个赞,或留下你的想法。登录 GitHub 后即可参与。
如果评论无法加载,请检查网络连接后刷新页面。