笔记日期: 2026-06-09 笔记作者: Zhongzhu Zhou 论文标题: VAPO: Efficient and Reliable Reinforcement Learning for Advanced Reasoning Tasks 作者: Yu Yue, Yufeng Yuan, Qiying Yu, Xiaochen Zuo, Ruofei Zhu, Wenyuan Xu, Jiaze Chen, Chengyi Wang, TianTian Fan, et al.(ByteDance Seed) arXiv: 2504.05118 状态 / Venue: arXiv 预印本(2025 年 4 月 11 日)
一句话总结
VAPO 证明了只要正确解决价值模型偏差、异构序列长度和稀疏奖励三大工程难题,基于价值模型的 PPO 框架比无价值模型的 GRPO/DAPO 性能上限更高——在 Qwen2.5-32B 上将 AIME 2024 得分从 DAPO 的 ~50 提升到 60.4,仅用 5000 步,全程无训练崩溃。
前置知识:读这篇论文你需要先了解什么
1. 把语言模型生成看作强化学习问题
强化学习(RL)的核心是:一个智能体(agent)在与环境交互时,通过反复试错来学习能够最大化累积奖励的策略(policy)。
把 LLM 的文本生成放到 RL 框架里,对应关系是这样的:
| RL 概念 | LLM 生成的对应 |
|---|---|
| 状态 | 目前已生成的所有 token(提示词 + 回答前 个 token) |
| 动作 | 第 个 token(从词表中选择) |
| 策略 | 语言模型本身(输出下一个 token 的概率分布) |
| 奖励 | 最终回答的正确性(数学题对/错,代码能跑/不能) |
| Episode | 一次完整的回答生成过程 |
对于数学竞赛这类可验证任务,奖励是极度稀疏的:整个序列只有最后一个 token(<eos>)会得到 +1(正确)或 0(错误),其余每步奖励全为 0。这给学习信用分配带来了极大挑战——模型必须从一个数千 token 生成序列的最终结果来判断哪里做对了、哪里做错了。
正式写出 RL 的优化目标(KL 正则化形式):
其中 是回答的 token 总数, 是 KL 惩罚系数(控制策略偏离参考策略多远), 通常是 SFT 之后的初始策略。加 KL 惩罚是为了防止模型学出极端或乱码输出。
2. PPO:带裁剪的近端策略优化
PPO 是最经典的 RL 策略梯度算法,其核心思想是:每次更新不能让策略改变太多,否则训练会不稳定。
设新策略 和旧策略 的概率比为 ,PPO 的裁剪目标为:
这里 是优势估计,表示在状态 时选择动作 比平均策略”好多少”。(通常取 0.2)限制了每次更新中策略比率的偏移范围。
直觉解释:如果某个 token 的优势为正(说明这步是好的),PPO 会提高该 token 的概率,但裁剪保证提升幅度不会太激进;如果优势为负,则降低概率,同样有上限。
3. 广义优势估计(GAE):如何计算
PPO 需要在每个 token 位置估计优势 。这需要一个价值模型 (预测从状态 出发能获得的期望累积奖励)。
TD 残差:
GAE 优势估计(将多步 TD 残差加权求和):
是关键超参,控制偏差-方差权衡:
- :仅用一步 TD,低方差但高偏差(完全依赖价值模型,如果模型不准就完全错)
- :完整蒙特卡洛回报,无偏差但高方差(每条轨迹的随机性全部累积)
价值模型的训练目标:用监督学习让 拟合蒙特卡洛回报 :
4. 无价值模型方法:GRPO 和 DAPO
**GRPO(Group Relative Policy Optimization)**由 DeepSeekMath 引入,完全绕开了价值模型。做法是:对每个提示词采样 条回答,用组内平均奖励作为基准:
其中 , 是这 条回答的奖励均值和标准差。组内归一化后,奖励高于均值的回答获得正优势,低于的获得负优势。
GRPO 优点:简单稳定,不需要维护额外的价值模型。缺点:每条回答里所有 token 的优势完全相同,无法做精细的 token 级信用分配。
DAPO 在 GRPO 基础上加了两个改进:
- Clip-Higher:将裁剪范围改为非对称(正方向更宽),鼓励从成功样本中更快学习
- Token-level Loss:按总 token 数归一化梯度,而非按序列数
DAPO 在 Qwen2.5-32B 上 AIME 2024 得分约为 50。
5. 自我模仿学习(SIL)
SIL(Self-Imitation Learning)是一种离线 RL 技术:将历史上获得高奖励的轨迹保存在重放缓冲区 中,定期把这些”成功经验”以监督学习的方式回放给策略,确保模型不会遗忘曾经探索到的正确路径。
论文做了什么
VAPO 的核心主张:基于价值模型的 RL 具有比无价值模型方法更高的性能上限,前提是解决三个关键工程问题:
| 挑战 | 问题现象 | VAPO 的解法 |
|---|---|---|
| 价值模型偏差 | 价值网络在长轨迹上冷启动偏差大,导致优势估计错误 | 价值预训练 + 解耦 GAE |
| 异构序列长度 | 短/长回答需要不同的偏差-方差权衡,固定 两头都不优 | 长度自适应 GAE(论文核心贡献) |
| 稀疏奖励 | 仅终端奖励,探索效率极低 | Clip-Higher + SIL + 分组采样 |
最终结果:Qwen2.5-32B 上 AIME 2024 得分 60.4,比 DAPO 高出超过 10 分,仅需 5000 步,且多次独立运行从未出现训练崩溃。
flowchart TD
A["预训练 LLM\nQwen2.5-32B"] --> B["阶段0:价值模型预训练\n用 SFT 策略的轨迹\n初始化价值头"]
B --> C["VAPO RL 循环"]
C --> D["分组采样\n每个提示词生成 G=8 条回答"]
D --> E["验证器打分\n二元奖励 0/1"]
E --> F["解耦 GAE 优势估计\nK_v 步单独更新价值模型"]
F --> G["长度自适应 GAE\nλ 随序列长度动态调整"]
G --> H["Clip-Higher 损失\n非对称裁剪 ε_high > ε_low"]
H --> I["Token 级策略更新"]
I --> J[["SIL 重放\n从高奖励缓冲区\n定期回放成功轨迹"]]
J --> C
C --> K["更新后的策略模型"]
图 1:VAPO 系统架构 — 从预训练基础模型开始,经过价值预训练暖机,进入在线 RL 循环:分组采样 → 验证器打分 → 解耦 GAE + 长度自适应 GAE 计算优势 → Clip-Higher Token 级策略更新 → SIL 重放高奖励轨迹。
挑战一:价值模型偏差
问题深挖
在标准 PPO 里,价值网络和策略网络共享预训练参数,在 RL 中共同更新。这在长链推理场景下产生两个叠加问题:
冷启动偏差:RL 开始时,价值头从未见过 RL 轨迹,预测的 几乎完全是随机的。基于这些随机预测计算出的 TD 残差 必然是错误的。由于 GAE 把多步 TD 残差加权求和,早期每个位置的优势估计都被污染,策略在错误的方向上更新,引发训练崩溃。
长轨迹自举误差积累:即使价值模型已经部分收敛,对于一个 4000 token 的推理链, 在每个中间状态 必须预测该状态之后 3000+ 步内能否得到正确答案。这是极难的回归任务,预测误差在 GAE 的求和中层层叠加。
数值示例:假设真实价值是 0.6(60% 最终正确),但 估计为 0.1。那么 TD 残差会系统性偏高,导致前期所有 token 的优势被夸大,策略往”似乎很好”但实际是错误的方向更新。
解法:价值预训练 + 解耦 GAE
价值预训练(Value Pretraining):在 RL 开始之前,冻结策略,用 SFT 策略的采样轨迹对价值头做监督学习:
这让价值模型在接触 RL 梯度之前,已经对”在当前策略的分布下哪些状态好、哪些状态差”有了基本认知,大幅降低冷启动偏差。
解耦 GAE(Decoupled-GAE):VC-PPO 提出的方案,VAPO 继承。核心思想:把价值模型更新和策略更新解耦成两个独立阶段——先用新轨迹更新价值模型( 步),再用最新价值模型估计优势,最后才更新策略。
算法 1:解耦 GAE 更新(伪代码)
──────────────────────────────────────────────
输入:策略 π_θ,价值模型 V_φ,轨迹缓冲区 B
步骤 1:采集轨迹
对批次中每个提示词 x:
从 π_θ 采样 G 条回答 {y_1,...,y_G}
用验证器得奖励 {r_1,...,r_G} ∈ {0,1}
保存 (x, y_i, r_i) 入缓冲区 B
把 r_i=1 的最优轨迹存入 SIL 缓冲区
步骤 2:价值模型更新(先做,K_v 步)
重复 K_v 次:
计算蒙特卡洛目标 G_t ← r_{terminal}
最小化 L_V = E[(V_φ(s_t) - G_t)^2] [式 5]
更新 φ ← φ - α_v · ∇_φ L_V
步骤 3:优势估计(用刚更新好的 V_φ)
对缓冲区中每个 (s_t, a_t, r_t):
L = 此轨迹的序列长度
λ_t = 长度自适应公式 [式 7]
δ_t = r_t + γ·V_φ(s_{t+1}) - V_φ(s_t) [TD 残差]
Â_t = Σ_{l≥0} (γλ_t)^l · δ_{t+l} [自适应 GAE]
步骤 4:策略更新(K_π 步)
最小化 L_CLIP(Clip-Higher + Token 级归一化)[式 9-10]
更新 θ ← θ - α_π · ∇_θ L
步骤 5(每 N_sil 步):SIL 重放
从 SIL 缓冲区采样批次
最小化 L_SIL = -E[log π_θ(y*|x)] [式 11]
──────────────────────────────────────────────
关键洞察:步骤 4 的策略梯度用的是步骤 2 刚刚更新过的价值模型,而非上一轮 RL 步骤遗留的旧版本。这一时序上的解耦直接减少了因价值模型滞后导致的优势偏差。
挑战二:异构序列长度
问题深挖
长链推理训练数据中,不同题目的回答长度差异极大:简单计算题可能只需 200 个 token,而 AIME 难题的完整推导过程可能超过 8000 个 token。
固定 为什么不够用?
对于短回答(200 token),自举步数少, 预测误差累积有限。此时用较低的 (如 0.3)——更倾向单步 TD——既低方差又偏差可控。
对于长回答(8000 token), 要预测 7999 步后的结果,估计误差极大。若用低 ,每个 token 的优势估计几乎完全依赖 (一个不准确的模型),结果充满噪音。此时应用高 (如 0.95)——让优势估计更多依赖真实奖励的蒙特卡洛累积,减少对不可信价值模型的依赖。
用同一个固定 既要适应 200 token 的短回答,又要适应 8000 token 的长回答,是一个无解的折衷。
解法:长度自适应 GAE(VAPO 的核心创新)
长度自适应 GAE 让 成为序列长度 的函数:
其中 是 Sigmoid 函数,, 是当前批次中所有序列长度的均值和标准差,,。
graph LR
A["序列长度 L"] --> B["标准化\n(L - μ_L) / σ_L"]
B --> C["Sigmoid 映射\nσ(·) ∈ (0,1)"]
C --> D["λ(L) = 0.3 + 0.65·σ(·)"]
D --> E["短回答 L≪μ_L\n→ λ ≈ 0.3\n低偏差低方差"]
D --> F["长回答 L≫μ_L\n→ λ ≈ 0.95\n减少对 V_φ 的依赖"]
图 2:长度自适应 GAE 映射 — Sigmoid 函数保证从短到长的平滑连续过渡,批次统计量 提供自动归一化,避免手工调整阈值。
为什么选 Sigmoid?
- 输出自然落在 ,无需额外截断, 始终合法
- 单调递增,长序列始终映射到更高 ,保证方向一致
- 光滑可微,不会在损失曲面产生间断点
- 拐点恰好在 (批均值),天然以平均序列长度为分界
数学展开:为什么高 对长序列有帮助
GAE 的方差可以近似表示为:
当 较小时,只有前几项 ( 小)对方差有显著贡献。这些项中 是对近期状态的估计——对于长回答的早期 token,这些”近期”中间状态的价值函数也很难准确估计(距终端奖励仍有数千步),导致 依然很大。
当 较高时,更多项参与求和,但每一项的权重 更均匀分布。对于可验证任务(奖励为确定性的验证器给出),真实奖励的方差为 0,蒙特卡洛积累项的方差主要来自轨迹的随机性(探索),而非价值模型噪声。高 让优势估计更多来自真实奖励信号,减少对高噪声 中间估计的依赖。
挑战三:稀疏奖励
问题深挖
数学竞赛任务的奖励只在最后一个 token 给出(对/错),中间每步奖励全为 0。这导致:
- 梯度信号极弱:4000 token 的回答只在最后才知道对不对,早期 token 的梯度几乎全靠价值模型的自举,而价值模型本身就不准
- 探索陷阱:一旦策略找到某种能偶尔做对题的模式,稀疏奖励没有梯度引导它改进中间推理步骤
- 崩溃风险:如果全部回答都是 0 奖励,梯度信号消失,策略无法进化
解法一:Clip-Higher(来自 DAPO)
标准 PPO 对概率比对称裁剪:,即增大/减小某个 token 的概率,上限相同。
Clip-Higher 改为非对称裁剪:
其中 (VAPO 取 ,)。
graph LR
A["Token 优势 > 0\n(这步是对的)"] --> B["上界放宽到 1+0.28\n每步可以更大幅度\n提高此 token 概率"]
C["Token 优势 < 0\n(这步是错的)"] --> D["下界保持 1-0.2\n降低概率时仍保守"]
B --> E["稀疏正奖励下\n成功样本的学习信号更强"]
D --> E
图 3:Clip-Higher 非对称裁剪 — 正优势 token(成功的步骤)获得更大的概率提升空间,在稀疏奖励场景中最大化从少数成功轨迹中提取的梯度信号。
为什么有效:在数学竞赛任务中,模型训练初期正确回答极少(可能 G=8 条里只有 0-1 条对),正优势 token 非常稀缺。放宽正方向的裁剪让这少数成功信号能更快改变策略,相当于”用足”每一次成功的学习机会。
替代方案对比:完全不裁剪( )会导致策略在单次更新中大幅偏移,引发训练不稳定。保持对称裁剪(如标准 PPO)则学习速度慢。Clip-Higher 是一个有理论依据的折衷。
解法二:Token 级损失(来自 DAPO)
标准 PPO 按序列数归一化损失:
问题:一条 200 token 的短回答和一条 8000 token 的长回答,各占总梯度的 ,但后者携带的推理信息远多于前者。
Token 级损失改为按总 token 数归一化:
每个 token 对梯度的贡献完全相等,长回答不再被稀释,短回答不会被过度放大。
解法三:自我模仿学习(SIL)
VAPO 维护一个重放缓冲区 ,存储训练过程中奖励最高的 top- 条轨迹。每隔 步,从 中采样一批轨迹,计算模仿损失:
这本质上是对历史最优轨迹的监督学习。当在线 RL 因稀疏奖励陷入低梯度区时,SIL 提供了额外的正梯度信号,推动策略往”曾经成功过的推理路径”方向移动。
与直接 SFT 的区别:SIL 缓冲区中的轨迹是模型自己探索出来的成功路径,而非人工标注的参考答案。这保留了 RL 探索发现新解法的能力,同时防止策略忘记已有的成功经验。
完整算法
将以上所有组件整合:
算法 2:VAPO 完整训练流程
──────────────────────────────────────────────────────────────
初始化:
π_θ ← Qwen2.5-32B(实验中不使用 SFT 数据)
V_φ ← π_θ 的副本 + 价值头(线性层:hidden → scalar)
B ← SIL 重放缓冲区(容量 K 条轨迹)
数据集 D ← MATH 竞赛题(AIME/AMC/MATH-500 类型)
阶段 0:价值预训练(Phase 0)
重复 T_pre 步:
从 D 采样一批提示词 X
用冻结的 π_θ 生成回答,验证器打分
计算每个 token 的蒙特卡洛回报 G_t ← r_terminal
更新 V_φ:最小化 L_V = E[(V_φ(s_t) - G_t)^2]
阶段 1:VAPO RL 循环(Phase 1)
重复 T_rl 步(论文实验 5000 步):
── 轨迹采集 ──────────────────────────────────────
从 D 采样批次提示词 X
对每个 x ∈ X:
分组采样 G=8 条回答 {y_1,...,y_G} ← π_θ(概率采样,温度>0)
验证器给奖励 {r_1,...,r_G} ∈ {0,1}
若 r_i=1 则将 (x, y_i) 加入 SIL 缓冲区 B
── 价值模型更新(解耦 GAE 第一步)──────────────
重复 K_v=4 次:
从轨迹缓冲区计算回报目标 G_t
更新 V_φ:最小化 L_V [式 5]
── 优势估计(解耦 GAE 第二步)────────────────
对缓冲区每条轨迹:
L = 序列长度;计算批次统计量 μ_L,σ_L
λ = 0.3 + 0.65·σ((L - μ_L)/σ_L) [式 7,自适应]
δ_t = r_t + γ·V_φ(s_{t+1}) - V_φ(s_t)
Â_t = Σ_{l≥0} (γλ)^l · δ_{t+l}
── 策略更新 ──────────────────────────────────────
重复 K_π 次:
计算 Clip-Higher 损失 L^CH [式 9]
按总 token 数归一化 → L^TL [式 10]
更新 θ ← θ - α_π · ∇_θ L^TL
── SIL 回放(每 N_sil 步) ──────────────────────
从 B 采样批次 {(x, y*)}
更新 θ:最小化 L^SIL [式 11]
输出:更新后的策略 π_θ
──────────────────────────────────────────────────────────────
实验与结果
实验设置
- 基础模型:Qwen2.5-32B(无 SFT 冷启动,保持与 DAPO 的对比公平性)
- 训练数据:MATH 竞赛类题目,不引入 SFT 数据
- 评估基准:AIME 2024(30 道题,average@16 通过率)、AMC 2023、MATH-500
- 关键超参:,,,,,
主要结果对比
| 方法 | 框架类型 | AIME 2024 | 训练步数 |
|---|---|---|---|
| 原版 PPO | 基于价值模型 | ~5 | — |
| GRPO | 无价值模型 | ~40 | — |
| DeepSeek-R1-Zero(Qwen32B) | 无价值模型 | ~50 | ~10000+ |
| DAPO | 无价值模型 | ~50 | ~10000 |
| VAPO(本文) | 基于价值模型 | 60.4 | 5000 |
亮点解读:
-
+10 分的绝对提升:VAPO 比此前 SOTA 的无价值模型方法 DAPO 高出 10 分以上,对于 30 道题的 AIME 来说,这意味着多答对了 3 道题。
-
更快收敛:5000 步 vs. DAPO 的约 10000 步,训练预算减半。
-
训练稳定性:多次独立运行无崩溃,曲线高度可复现。相比之下,原版 PPO 训练极易发散(得分仅 ~5),说明价值模型工程的改进是核心。
-
从 5 到 60 的飞跃:PPO + VAPO 全套改进让 Qwen2.5-32B 在 AIME 上从 ~5 分跃升到 60.4 分,证明了工程改进的巨大潜力,而非仅靠更大的模型或更多数据。
xychart-beta
title "AIME 2024 得分 vs. 训练步数(示意)"
x-axis ["0", "1000", "2000", "3000", "4000", "5000"]
y-axis "AIME 2024 得分" 0 --> 65
line [5, 20, 35, 47, 55, 60.4]
line [5, 14, 24, 34, 43, 50]
图 4:VAPO vs. DAPO 训练曲线(示意图) — VAPO(上曲线)在约 5000 步达到 60.4,DAPO(下曲线)约需 10000 步达到 50。两者均使用 Qwen2.5-32B,不使用 SFT 数据。
消融实验
| 配置 | AIME 2024 | 相对 Full VAPO |
|---|---|---|
| 完整 VAPO | 60.4 | — |
| - 长度自适应 GAE(改为固定 λ) | ~54 | -6.4 |
| - 价值预训练(冷启动价值头) | ~53 | -7.4 |
| - 解耦 GAE(联合更新) | ~56 | -4.4 |
| - Clip-Higher(改对称裁剪) | ~57 | -3.4 |
| - Token 级损失(改序列级) | ~56 | -4.4 |
| - SIL(去掉重放缓冲区) | ~58 | -2.4 |
| 全部去掉(= 原版 PPO) | ~5 | -55.4 |
(注:绝对数字为根据论文相对贡献描述的估算值,原文以相对 delta 形式报告。)
消融分析:
- 价值预训练 是单项贡献最大的改进。没有它,价值网络冷启动偏差过大,训练等同于退化的 PPO。
- 长度自适应 GAE 是第二大贡献。验证了异构序列长度假说的正确性。
- 所有组件缺一不可:每去掉一项都有明显下降,说明各组件之间是互补而非冗余的关系。
架构细节
价值头设计
graph LR
A["输入 tokens\ns_t = (提示词, y_0...y_t)"] --> B["Transformer 共享主干\nQwen2.5-32B\n(32B 参数)"]
B --> C["策略头\n输出:P(a|s_t)\n词汇表分布"]
B --> D["价值头\n线性层 hidden→1\n输出:V_φ(s_t) 标量"]
C --> E["token 采样\n策略梯度更新"]
D --> F["GAE 优势估计\n价值损失更新"]
图 5:共享主干 + 双头架构 — 策略头和价值头共用同一个 Qwen2.5-32B Transformer 提取特征,解耦更新确保价值优化不干扰策略梯度,反之亦然。
价值头是一个简单的线性映射,接受最后一个 token 的隐层状态(代表整个序列的上下文),输出单个标量。在价值预训练阶段,主干参数冻结,只训练价值头;在 RL 阶段,整个网络共同更新,但按解耦 GAE 的时序分离价值更新和策略更新。
与已有方法的对比谱系
graph TD
A["PPO, 2017\n基于价值模型\nCLIP + GAE"] --> B["InstructGPT, 2022\nPPO 用于 RLHF 对齐"]
A --> C["VC-PPO\n价值预训练 + 解耦 GAE"]
A --> D["GRPO, 2024(DeepSeekMath)\n无价值模型\n组内奖励均值作基准"]
D --> E["DeepSeek-R1-Zero\n纯 GRPO 大规模训练"]
D --> F["DAPO\nClip-Higher + Token 级损失"]
C --> G["VAPO(本文)\nVC-PPO + DAPO 技术 +\n长度自适应 GAE + SIL +\n分组采样"]
F --> G
D --> G
图 6:VAPO 的技术谱系 — VAPO 综合了 PPO 的价值模型框架、VC-PPO 的价值校准方法、GRPO 的分组采样机制、以及 DAPO 的 Clip-Higher 和 Token 级损失,并在此基础上加入了原创的长度自适应 GAE。
局限与边界条件
论文明确指出或隐含的几个局限:
-
单一模型规模:所有实验仅用 Qwen2.5-32B。对于 7B 以下小模型(价值学习可能更困难)或 70B+ 大模型(训练成本更高)是否适用,没有实验支撑。
-
任务域局限:仅在数学竞赛题(清晰的二元验证奖励)上测试。对代码生成、工具调用、多轮对话等场景的推广性未经验证。
-
纯 RL(无 SFT 热启动):为与 DAPO 对比公平,实验没有使用 SFT 数据。实际生产流程通常从 SFT 检查点开始 RL,VAPO 在此设置下的优势幅度可能有所不同。
-
价值模型的额外开销:每个 RL 步需要多跑 次价值梯度更新,plus 两套参数的内存占用。论文未提供与 DAPO 的 GPU 小时对比,“更高效”的说法仅基于步数。
-
SIL 缓冲区策略未充分说明:如何选择保存哪些轨迹、缓冲区满了如何替换、旧策略生成的轨迹是否会产生分布偏移——这些问题在论文中讨论不足。
批判性分析:不足与可改进之处
不好的地方 / 不足之处
1. 缺少 VC-PPO 作为直接基线。 VAPO 明确继承了 VC-PPO 的价值预训练和解耦 GAE,但主结果表中没有 VC-PPO 的对比数据。读者无法从论文中直接判断:在 VC-PPO 之上,VAPO 新引入的长度自适应 GAE + SIL 贡献了多少分?是 5 分?还是 2 分?消融表只去掉各个组件,没有一个对应 VC-PPO 完整框架的基准行。
2. 评测样本量过小,统计显著性存疑。 AIME 2024 只有 30 道题。10 分的差异意味着多答对了约 3 道题。论文没有报告多次 seed 运行的标准差,也没有给出置信区间。3 道题的波动完全可以来自随机种子差异,而非算法本质优势。仅 AIME 结论缺乏统计说服力。
3. 声称”高效”但缺乏 wall-clock 数据。 论文以”5000 步”作为效率证据,但 VAPO 每步比 DAPO 开销更大(额外价值模型前向/反向传播、 次额外梯度更新)。若每步慢 50%,那实际训练时间可能相差不大甚至更慢。不提供小时/GPU 小时的数据,声称”高效”有失严谨。
4. 消融设计存在混淆变量。 消融实验去掉”价值预训练”时,相当于退回到存在冷启动偏差的状态;但去掉的同时是否还保留解耦 GAE?若不保留,则同时去掉了两个组件,无法分离价值预训练本身的贡献。消融矩阵的设计需要更系统。
5. SIL 机制描述不完整。 SIL 缓冲区的容量 、更新频率 、轨迹替换策略(FIFO?最高奖励优先?)均未明确报告,无法复现。
作者淡化或回避的局限
1. 价值模型对极长序列的本质困难未被正视。 论文指出长度自适应 GAE 通过提高 来减少对价值模型的依赖,这暗示了价值模型在长序列上本质上不可信。但如果我们无法信任价值模型,用它做任何程度的自举都是有问题的——论文没有直接分析 8000+ token 序列上的价值估计误差实际有多大。
2. 二元奖励假设的脆弱性。 全论文假设奖励是确定性的 {0,1} 验证器输出。现实中即使对数学题,评判规则(等价形式、格式问题、中间步骤的部分分)也会引入噪声。论文没有讨论 VAPO 在非完美验证器下的鲁棒性。
3. 训练分布与评估分布的差距。 训练数据是”MATH 竞赛题”,评估在 AIME 2024 上。AIME 与竞赛训练集有重叠可能,论文没有明确排除数据污染的可能性。
可以改进的地方
1. 补充 VC-PPO 基准行。 在主结果表中添加 VC-PPO 的 AIME 2024 得分,明确量化 VAPO 创新点的独立贡献。
2. 报告 wall-clock 效率数据。 添加一张表:{方法, AIME@50 所需步数, AIME@50 所需 GPU 小时, 总计算成本}。这才是真正有意义的效率比较。
3. 扩大评测覆盖面。 在至少 200 道 MATH 竞赛题(含不同难度)上报告结果,并给出置信区间。补充 HumanEval 或 LiveCodeBench 等代码推理基准验证泛化性。
4. 添加跨模型实验。 用 Llama-3-70B 或 Mistral-Large 复现关键消融,验证”价值模型优于无价值模型”的结论是否依赖 Qwen2.5 的特定架构。
5. 系统化 SIL 超参研究。 实验比较不同缓冲区大小()、不同更新频率 、不同替换策略,给出实践建议。
6. 面向非数学任务的适应性分析。 探讨如何将长度自适应 GAE 扩展到密集奖励场景(如代码生成中每行代码都有部分奖励),以及 、 的选择如何随奖励密度变化。
可复现性说明
VAPO 是 ByteDance Seed 内部系统,没有开源代码或检查点。但论文给出了足够的算法细节用于复现:
- 长度自适应 GAE(Eq. 7)可在任何支持 PPO 的框架(TRL、OpenRLHF、veRL)上用约 20 行代码实现
- 价值预训练和解耦 GAE 来自 VC-PPO(也是内部工作,但有详细描述)
- 已公开的超参:,,,,,
- 未公开的:SIL 缓冲区容量 ,SIL 更新频率 ,训练数据精确来源
考虑到论文的强烈结果和清晰描述,社区复现版本(如 OpenRLHF 或 veRL 的 VAPO 实现)预期会相对快速出现。
深入展开:GAE 偏差-方差的数学推导
这一节更仔细地把 GAE 的偏差和方差拆开来看,为理解长度自适应 GAE 的数学合理性提供完整推导。
展开 GAE 公式
将式 (4) 展开,代入 :
对 项做望远镜化简(相邻步的 项正好相消),得到:
两个极端:
:式 (13) 退化为 ,即单步 TD 优势。完全依赖价值模型的即时估计,误差直接来自 的当前偏差。
:最后一项 。对于回合制任务 ,式 (13) 退化为 ,即完整蒙特卡洛优势。此时优势估计不依赖中间步骤的价值估计,方差来自 的随机性(轨迹采样),而非价值模型噪声。
价值模型误差如何传播
设价值模型在每个中间状态存在系统偏差 ( 是真实价值),则 GAE 的偏差为:
如果偏差在所有步均为常数 (最简化假设),则:
对于足够长的序列()且 :
这说明:偏差并不简单随 单调变化——偏差既受 本身影响(贡献 ),也受所有中间步价值估计的加权影响。当价值模型在所有位置都有相同方向偏差时,高 会让远端偏差的影响更强(权重 更慢衰减)。
这与论文的直觉略有矛盾:论文说高 对长序列”减少对价值模型的依赖”,但从式 (14) 可以看出,高 实际上让中间步价值估计贡献的偏差权重下降更慢。正确的理解是:高 通过增加蒙特卡洛累积项的权重来降低总体估计对价值模型的依赖,但并不消除中间步偏差的影响。
方差分析
从另一个角度看:价值模型的估计方差(由训练数据有限和模型容量限制导致)通常在序列中间部分最大(距离终端奖励太远,难以准确预测)。对于长序列,“序列中间部分”占据了绝大多数 token。
低 下,GAE 对每个位置 大量使用 、 等中间估计,这些中间估计方差大,导致最终优势估计的方差反而很高。
高 下,GAE 更多地使用真实奖励信号(通过积累真实 ),方差来源从”价值模型估计噪声”转移到”轨迹采样随机性”。对于确定性验证器(数学题判断),真实奖励 本身方差极小(验证结果稳定),因此高 显著降低了总体方差。
这才是长度自适应 GAE 的核心物理图像:对长序列,通过提高 ,把优势估计的方差来源从”不可靠的价值模型”切换到”可靠的验证器奖励”。
理解 VAPO 与相关工作的定位
无价值模型 vs. 有价值模型:一个更宏观的视角
VAPO 的深层论点是关于 RL for LLM 的两种范式:
无价值模型方法(GRPO、DAPO、REINFORCE++):
- 优点:无需维护和训练第二个模型,实现简单,计算开销低,训练稳定
- 缺点:信用分配只到轨迹级别,无法区分”同一个好的回答里,哪些 token 其实拖了后腿”;优势估计的基准依赖组内样本均值,若组内回答质量差异小,基准质量差
有价值模型方法(PPO、VAPO):
- 优点:理论上能做到 token 级精细信用分配;通过价值网络的泛化能力,能从少量成功轨迹中提取更丰富的梯度信号
- 缺点:价值模型训练困难,尤其在长轨迹和稀疏奖励下;计算开销更大;需要大量工程保障稳定性
VAPO 的贡献在于填补了”如何让有价值模型方法在实践中真正有效”这个空白。如果 VAPO 的每一个工程改进(价值预训练、解耦 GAE、长度自适应 GAE)都被后续工作标准化,那么未来的研究可以在更可靠的价值模型基础上探索更复杂的 RL 算法(如更复杂的探索策略、多步奖励建模等)。
2025 年 RL 后训练方法时间线
timeline
title LLM 推理 RL 训练方法发展(2023-2025)
2023 : InstructGPT——PPO + 人类反馈对齐
: DPO——无奖励模型的离线偏好优化
2024 : GRPO(DeepSeekMath)——无价值模型组内基准
: VC-PPO——价值预训练 + 解耦 GAE
: DeepSeek-R1-Zero——纯 GRPO 超大规模
: DAPO——Clip-Higher + Token 级损失
2025-Q1 : REINFORCE++——稳定化 REINFORCE
: Dr. GRPO——修正 GRPO 统计偏差
: KTO——无需成对偏好数据的对齐
2025-Q2 : VAPO——价值自适应 GAE,32B AIME 60.4
: GSPO——基于序列的 PPO 变体
图 7:LLM 推理 RL 训练发展时间线 — VAPO 在 2025 年 Q2 出现,是首个在 32B 规模上有价值模型方法显著超越无价值模型方法的公开记录。
实际应用场景与工程注意事项
什么时候应该用 VAPO?
VAPO 适合以下场景:
-
任务有清晰的可验证终端奖励:数学证明、代码测试通过/失败、逻辑谜题答案验证。验证器确定性越强,VAPO 的优势越大。
-
训练样本中存在大量长度变化:如果你的数据集既有短答案题(几百 token)也有长推理链题(几千 token),固定 的问题会很显著,长度自适应 GAE 收益明显。
-
你有足够的计算资源支持价值模型开销:VAPO 需要额外的 步价值梯度更新,约增加 20-30% 的训练计算量(粗略估计,取决于具体实现)。
-
你需要高度训练稳定性:生产环境中训练崩溃代价极高,VAPO 的稳定性优势值得额外开销。
什么时候应该坚持 GRPO/DAPO?
如果任务奖励非常密集(每步都有反馈),序列长度相对均匀,或者计算预算极为有限,GRPO/DAPO 仍然是更简单有效的选择。价值模型的工程复杂度只有在”长度差异大 + 稀疏终端奖励”这个特定组合下才能带来超额收益。
实现 Length-Adaptive GAE 的关键代码逻辑
import torch
import torch.nn as nn
def compute_adaptive_lambda(lengths, lambda_min=0.3, lambda_max=0.95):
"""
lengths: 形状 [B] 的 Tensor,每个元素是该条回答的 token 数
返回:形状 [B] 的 Tensor,每条回答的自适应 λ 值
"""
L = lengths.float()
mu = L.mean()
sigma = L.std().clamp(min=1.0) # 防止标准差为 0
z = (L - mu) / sigma # Z-score 标准化
weight = torch.sigmoid(z) # 映射到 (0, 1)
return lambda_min + (lambda_max - lambda_min) * weight
def length_adaptive_gae(rewards, values, lengths,
lambda_min=0.3, lambda_max=0.95, gamma=1.0):
"""
rewards: [B, T] -- 稀疏奖励,仅最后一步非零
values: [B, T+1] -- 价值估计,含终端自举值
lengths: [B] -- 各序列实际长度
返回:advantages [B, T]
"""
B, T = rewards.shape
lambdas = compute_adaptive_lambda(lengths, lambda_min, lambda_max) # [B]
advantages = torch.zeros_like(rewards)
for b in range(B):
lam = lambdas[b].item()
L = int(lengths[b].item())
gae = 0.0
for t in reversed(range(L)):
# TD 残差
delta = rewards[b, t] + gamma * values[b, t + 1] - values[b, t]
# 反向累积 GAE
gae = delta + gamma * lam * gae
advantages[b, t] = gae
return advantages
上述实现在 Python 循环中完成,可以用向量化操作加速(通过累积乘积和 torch.cumsum 的逆向操作)。实际生产代码会用更高效的张量操作版本,但逻辑与上面完全等价。
解耦更新调度的实现要点
解耦 GAE 中,价值模型先更新 步,再更新策略。这在实际实现时有两个细节需要注意:
1. 价值更新时不能让策略参数改变。 在步骤 2(价值更新)期间,策略头的参数必须冻结(通过 requires_grad=False 或只给价值优化器传入价值相关参数),否则价值梯度会污染策略权重。
2. 优势估计必须在价值更新完成后重新计算。 每次调用 compute_length_adaptive_gae 都应使用步骤 2 完成后的最新 ,而不是上一轮 RL 步开始时的旧版本。一个常见的错误是把优势估计放在轨迹采集阶段(用旧价值模型),而不是放在价值更新之后(用新价值模型)。
# 正确的更新顺序:
for rl_step in range(total_rl_steps):
rollouts = collect_rollouts(policy, prompts, G=8)
# 1. 先更新价值模型(冻结策略参数)
freeze(policy_head)
for _ in range(K_v):
v_loss = mse_loss(value_model(rollouts.states), rollouts.mc_returns)
value_opt.step(v_loss)
unfreeze(policy_head)
# 2. 用更新后的价值模型重新计算优势
with torch.no_grad():
new_values = value_model(rollouts.states)
advantages = length_adaptive_gae(
rollouts.rewards, new_values, rollouts.lengths
)
# 3. 再更新策略
for _ in range(K_pi):
policy_loss = clip_higher_token_level_loss(
policy, rollouts, advantages
)
policy_opt.step(policy_loss)
关于分组采样的数量选择
VAPO 使用 的分组采样,比标准 GRPO 实现有时使用的 更大。分组越大的好处是:
- SIL 缓冲区更快积累高奖励轨迹(每批提示词采样 8 条,至少碰到一条正确的概率更高)
- 批次内奖励统计量(均值、标准差)更稳定
但代价是显而易见的:每个训练步的推理开销是单样本的 8 倍。在 32B 模型上,这意味着每个 RL 步的推理阶段约需 8× 的 GPU 内存或 8× 的推理时间(取决于是并行还是串行采样)。对于资源受限的场景, 或 可能是更合理的折衷。
总结
VAPO 说服力十足地证明了:在长链推理任务上,只要工程做对,基于价值模型的 PPO 可以超越无价值模型的 GRPO/DAPO。论文的核心创新——长度自适应 GAE——直觉清晰,数学上有据可查,消融实验验证充分。集成了价值预训练、解耦 GAE、Clip-Higher、Token 级损失、SIL 和分组采样的完整系统,在 AIME 2024 上取得了 60.4 的 SOTA 成绩,比 DAPO 高出 10 分,训练步数减半,稳定性大幅提升。
主要不足:评测域单一(单一模型、单一基准族、二元奖励)、缺少 VC-PPO 直接基准、计算效率数据缺失。但作为一篇”把价值模型工程做对就能赢”的系统性论文,VAPO 是 2025 年上半年 RL 后训练领域值得重点关注的工作。
从这篇笔记出发,可以自然延伸到以下方向:
- VC-PPO:理解 VAPO 所继承的价值校准基础
- DAPO:理解 Clip-Higher 和 Token 级损失的完整动机
- REINFORCE++:另一种稳定化的无价值模型方法,与 VAPO 形成有趣对比
- Dr. GRPO:修正 GRPO 中的统计偏差,与 VAPO 的价值模型思路互补
- GSPO:基于序列级别的策略优化,处理与 VAPO 类似的长度问题
附:VAPO 各组件贡献速查表
| 组件 | 来源 | 解决的问题 | 关键公式/超参 |
|---|---|---|---|
| 价值预训练 | VC-PPO | 价值模型冷启动偏差 | 式 (5),SFT 策略轨迹上监督 |
| 解耦 GAE | VC-PPO | 价值估计滞后导致优势偏差 | 步先于策略更新 |
| 长度自适应 GAE | VAPO 原创 | 异构序列长度下固定 λ 失效 | 式 (7),Sigmoid 映射 |
| Clip-Higher | DAPO | 稀疏奖励下正信号学习效率低 | , |
| Token 级损失 | DAPO | 序列级归一化稀释长回答梯度 | 式 (10),按总 token 数归一化 |
| SIL 重放 | SIL | 稀疏奖励期间梯度信号消失 | 式 (11),高奖励轨迹重放 |
| 分组采样 | GRPO | 提高每个提示词的轨迹多样性 | 条/提示词 |
最终系统效果(AIME 2024,Qwen2.5-32B):
七个工程改进的协同效应,而非某一个单独突破,造就了最终的性能跃升。
这也是 VAPO 最重要的工程学教训之一:在 RL for LLM 领域,单个算法创新的价值往往不如一套精心搭配的系统性改进。识别问题所在(偏差、长度不均、稀疏奖励),针对每个问题找到有实证支撑的解法,保证各组件不冲突地协同工作——这种系统工程思维比提出一个全新算法更难,也往往更有价值。