笔记日期: 2026-06-30 笔记作者: Zhongzhu Zhou 论文标题: DAPO: An Open-Source LLM Reinforcement Learning System at Scale 作者: Qiying Yu、Zheng Zhang、Ruofei Zhu、Yufeng Yuan、Xiaochen Zuo、Yu Yue 等(字节跳动 Seed / 清华 AIR SIA-Lab) arXiv: 2503.14476 状态/会议: Preprint,v2 2025年5月20日
一句话总结
DAPO 把 GRPO 在大规模 LLM 强化学习中失效的四个原因逐一拆开、逐一修复,最终让 Qwen2.5-32B 在 AIME 2024 上达到 50% 准确率(avg@32),比 DeepSeek-R1-Zero-Qwen-32B 高出 3 个百分点,且只用了一半的训练步数,同时完整开源算法、代码(verl 框架)和数据集(DAPO-Math-17K)。
前置知识:读懂这篇文章需要了解什么
这一节从头建立读懂 DAPO 所需的基础。如果你已经熟悉 PPO 和 GRPO,可以直接跳到”问题:GRPO 哪里出了问题”一节。
1.1 语言模型的强化学习目标
把 LLM 的 RL 训练抽象成策略优化问题:语言模型是策略 ,给定提示 ,它逐 token 采样一个回复 。奖励函数 给这个回复打分。目标是最大化期望奖励:
根据策略梯度定理(REINFORCE,Williams 1992),对 的梯度为:
直觉:如果某个回复奖励高,就增大它被生成的概率;奖励低,就减小概率。
实践中用优势函数 (其中 是基线,通常是均值奖励)代替原始奖励,降低梯度方差而不引入偏差。
1.2 逐 Token 的策略梯度分解
语言模型逐 token 生成,因此完整回复的对数概率可以分解为:
对整个回复的梯度,就是对每个 token 梯度的求和,每项乘以同一个回复级别的优势 :
不同的 RL 实现对这个求和的加权方式不同——这正是 DAPO 中逐样本对比逐 Token 损失的核心区别。
1.3 重要性采样与 PPO 截断技巧
直接策略梯度方法的采样效率低:每更新一次参数 ,旧样本就变成了离线策略样本,必须丢弃。重要性采样允许用旧策略 的样本来估计新策略 的梯度,方法是对每个样本乘以重要性比率:
重要性采样的问题:如果 和 偏差太大, 会变得极大或极小,导致梯度方差爆炸。
PPO(Schulman et al., 2017)通过截断解决这个问题,把重要性比率限制在 (通常 ),然后取悲观的 min:
截断保证了每步更新的保守性。重要的是,可以对同一批 rollout 做多次梯度更新( 次),因为截断防止了过大的偏移。
1.4 GRPO:用组内相对比较替代价值函数
PPO 需要一个价值函数(Critic)来估计优势。为 LLM 训练 Critic 既贵又复杂。GRPO(DeepSeekMath, 2024)的解决方案是:在同一问题的一组回复中做相对比较,完全省去 Critic。
对每个问题 ,GRPO 采样 个回复 ,计算各自的奖励 。回复 的组内标准化优势为:
同一回复 内所有 token 共用同一个优势值。GRPO 的目标函数(按样本级别平均):
关键特点:
- 不需要 Critic:优势来自组内相对表现。
- KL 惩罚项: 把策略锚定在参考(预训练)模型附近。
- 按样本平均:每个回复以 的权重贡献梯度,与长度无关。
1.4a 方差缩减:为什么这么重要
高方差的梯度估计会拖慢学习。REINFORCE(式2)的梯度估计方差正比于:
对于二值奖励(),方差取决于正确/错误的比例是否均衡。当所有回复都正确时( 全部一样),——但这意味着梯度信号里没有任何有用信息(已经完全会的题,没法再学习改进)。动态采样直接针对这一点:通过过滤只保留混合正误的问题,最大化优势值的方差,从而最大化每步梯度的信息量。
GRPO/DAPO 的组内归一化(式7)本身也是方差缩减:把绝对奖励值(依赖奖励尺度)转化为组内相对比较(尺度无关,方差受控)。这在概念上类似于 PPO 中使用优势函数,但不需要额外训练价值网络。
1.5 熵坍塌:为什么探索能力消失
策略的熵衡量其随机性/多样性:
高熵 → 输出多样;低熵 → 近似确定性输出。RL 训练中存在一个持续的熵下降压力,称为熵坍塌(entropy collapse):模型不断把概率质量集中到少数几个 token,丧失探索能力,最终陷入局部最优。
对于 AIME 这类难题,同一道题往往需要尝试不同思路,熵坍塌会让模型只会用一种固定的推理套路,性能在早期就停滞。
1.6 KL 惩罚项的作用与局限
在标准 RLHF 场景中,KL 项 防止策略偏离预训练模型太远,对于指令跟随任务有保护作用。但对于数学推理,预训练模型 本身就没有解题能力——用它约束策略反而阻碍学习。DAPO 直接删掉这个项。
问题:GRPO 在哪里失效了
用 GRPO 直接训练 32B 数学推理模型时,字节跳动团队发现了四个具体失效点:
失效一:熵坍塌。 训练初期熵快速下降,模型陷入固定推理套路,AIME 准确率在 30% 左右停滞。
失效二:梯度饥饿。 当某个问题的所有 个回复都对(accuracy=1)或都错(accuracy=0)时,组内标准化优势(式7)的分母 ,导致所有 ,梯度为零。这批样本对训练毫无贡献。随着模型提升,越来越多的简单问题变成”全对”,有效梯度批次越来越少(论文 Figure 3b 可以看到这个趋势持续增长)。
失效三:样本级平均带来的长度偏差。 GRPO 对每个回复赋予相同权重()。长回复中每个 token 的梯度权重更小,这隐式地惩罚了模型生成长推理链,即使长回复是对的。同时,包含胡言乱语的长回复也获得和优质短回复相同的总梯度权重,相当于在强化垃圾 token。
失效四:截断样本造成奖励噪声。 超过最大长度 的回复被强制截断。如果对所有截断回复统一给 ,就会产生奖励噪声:一个正在正确推导中被截断的回复,和一开始就胡说的回复,收到同等惩罚。这个信号混乱严重污染梯度。
GRPO 基线
论文以 Qwen2.5-32B 上运行朴素 GRPO 作为基线,AIME 2024 avg@32 只有 30%。目标是通过四个技术到达甚至超越 DeepSeek-R1-Zero-Qwen-32B 的 47%。
graph TD
A["朴素 GRPO 基线:30pct"] --> B["+ 超长过滤:36pct"]
B --> C["+ Clip-Higher:38pct"]
C --> D["+ 软超长惩罚:41pct"]
D --> E["+ 逐 Token 损失:42pct"]
E --> F["DAPO 完整版:50pct"]
G["DeepSeek-R1-Zero-Qwen-32B:47pct"] -.->|"对比参考"| F
style A fill:#fcc,stroke:#900
style F fill:#cfc,stroke:#060
style G fill:#ffc,stroke:#660
图1:从 GRPO 基线(30pct)到完整 DAPO(50pct)的消融链条,AIME 2024 avg@32。每行添加一个技术。完整 DAPO 超越 DeepSeek-R1-Zero 3个百分点,且训练步数减少 50pct。
创新一:Clip-Higher——非对称截断上界
对称截断为何导致熵坍塌
标准 PPO/GRPO 用对称区间 截断重要性比率。考虑优势 (系统想增加某个 token 的概率)时,上界 的实际效果:
- 对于高概率”开发”token,:允许增长到最多 ,绝对增量最大 。
- 对于低概率”探索”token,:允许增长到最多 ,绝对增量仅 。
两个 token 面对同一个截断上界,但低概率 token 的绝对增量是高概率 token 的 1/90。低概率 token 永远难以逃出”低概率陷阱”——这就是熵坍塌的机制。论文 Figure 3a 实测显示:被截断(up-clipped)的 token 的平均概率在整个训练过程中一直低于 0.2,验证了这个分析。
解法:解耦上下截断范围
DAPO 把上下截断参数解耦:
参数取值:(不变),(放宽)。
为什么是非对称的?
- 下界():控制策略能以多快的速度降低 token 概率。保持 0.2 防止”急性遗忘”——不让模型太快丢掉已学到的有用行为。
- 上界():控制策略能以多快的速度提升 token 概率。放宽到 0.28 给低概率探索 token 更多增长空间。
现在低概率 token 每步最多能增长到 ,相对增幅从 20pct 变成 28pct,积累多步后效果显著。
graph LR
subgraph "标准 PPO:对称截断"
A1["r_t = 1.5(想增大)"] --> B1["截断到 1.2(ε=0.2)"]
A2["r_t = 0.5(想减小)"] --> B2["截断到 0.8(ε=0.2)"]
end
subgraph "DAPO Clip-Higher:非对称"
C1["r_t = 1.5(想增大)"] --> D1["截断到 1.28(ε_high=0.28)"]
C2["r_t = 0.5(想减小)"] --> D2["截断到 0.8(ε_low=0.2 不变)"]
end
图2:标准 PPO 的对称截断 vs. DAPO 的 Clip-Higher 非对称截断。上界从 1.2 放宽到 1.28,给低概率探索 token 更多增长空间;下界保持 0.8,防止快速遗忘。
为什么不直接对称地把 ε 提升到 0.28?
若对称提升到 0.28,也会放宽下界,允许模型更快速地降低高概率 token 的概率。这会导致训练不稳定:已学到的良好行为可能被快速清除。非对称设计的精髓:对遗忘保守,对学习激进。
Clip-Higher 的边界条件
- 过大:重要性比率变得极端,重新引入训练不稳定;截断区间太宽,失去 PPO 信任域保证的意义。
- 接近 :与对称截断无区别,无改善。
- 0.28 这个具体值是经验调参得到的,论文没有给出理论推导。
创新二:动态采样——消除零梯度批次
零梯度批次的来源
回顾组内标准化优势(式7)。当某个问题的 个回复全对( 全部相同)或全错( 全部相同)时:
所有 token 的优势为零 → 这个问题的梯度贡献为零 → 批次有效梯度缩水,方差增大,训练效率下降。随着模型提升,越来越多简单问题变成”全对”,有效批次比例持续下滑(论文 Figure 3b)。
解法:采样前过滤掉零梯度样本
DAPO 在采样时强制约束:只保留那些 个回复中既有正确也有错误的问题:
如果某个问题采出的 个回复全对或全错,直接丢弃,继续从数据集里采新问题,直到缓冲区填满 个有效问题为止。
flowchart TD
A["为问题 q 采 G 个回复"] --> B{"全对或全错?"}
B -- "是(零梯度)" --> C["丢弃,不进缓冲区"]
B -- "否(有正有误)" --> D["加入训练缓冲区"]
C --> E["从数据集再采一个问题"]
E --> A
D --> F{"缓冲区已满 N 个?"}
F -- "否" --> E
F -- "是" --> G["进行策略梯度更新"]
图3:动态采样流程。产生零梯度的问题(全对或全错)被丢弃。持续采样新问题,直到缓冲区里有 N 个有效问题,每个都贡献非零梯度信号。
实际效率分析
论文的一个重要观察:在同步 RL 系统中,生成时间由当前批次中最长的样本决定(所有序列都生成完才进行下一步)。丢弃某些问题(和它们的回复)并不必然增加挂钟时间,因为长尾回复的生成时间无论如何都要等。实验(论文 Figure 6)显示,动态采样实际上减少了收敛时间——尽管生成了更多总回复数,但需要更少的梯度更新步数。
与课程学习的对比
另一种解决零梯度的思路是课程学习:按难度预排序问题,先易后难。动态采样更简单、自适应:不需要预计算难度分数,随着模型进步自动把注意力转向模型还没掌握的中等难度问题。
动态采样的边界条件
- 数据集非常难、模型几乎不能答对任何题时:过滤率极高,有效问题极少,训练几乎停滞。需要监控过滤器接受率。
is_equivalent(a, o_i)的可靠性至关重要。对整数答案数学题,精确匹配很可靠;对开放式问题,实现一个可靠的等价检查函数远比想象中难。- 随着模型性能提升,“全对”问题越来越多,过滤开销也越来越大——这是动态采样在高性能阶段的可扩展性隐患。
创新三:逐 Token 策略梯度损失
样本级平均的问题
GRPO 的损失先对每个回复内部做 token 平均,再对 G 个回复做平均(样本级平均):
其中 是每个 token 的梯度项。每个回复贡献 ,与长度无关。
这带来两个问题:
问题A(隐式惩罚长回复): 短回复(200 tokens)和长回复(5000 tokens)各占 的总梯度权重。但短回复中每个 token 的梯度权重是长回复的 25 倍。这相当于告诉模型:生成短回复比生成长推理链”更有效率”,间接压制了长链推理。
问题B(无法惩罚长回复中的垃圾): 包含大量重复/胡说内容的长回复,与优质短回复享有相同的总梯度贡献。垃圾 token 被同等地强化。
解法:改为逐 Token 平均
DAPO 把分母从 改为 (所有 token 总数):
现在每个 token 的贡献权重相同,都是 。长回复贡献更多梯度,但每个 token 地位平等。
graph TD
subgraph "样本级 GRPO"
R1["回复 A:200 tokens,正确"] -- "权重 1/G" --> GL["梯度损失"]
R2["回复 B:5000 tokens,正确+垃圾"] -- "权重 1/G" --> GL
note1["每个回复等权,无论长短\n长回复中的垃圾 token 未被额外惩罚"]
end
subgraph "逐 Token DAPO"
R3["回复 A:200 tokens,正确"] -- "200/N_total 权重" --> GL2["梯度损失"]
R4["回复 B:5000 tokens,正确+垃圾"] -- "5000/N_total 权重" --> GL2
note2["每个 token 等权\n长回复贡献更多梯度(含垃圾部分的惩罚)"]
end
图4:样本级(GRPO)vs. 逐 Token(DAPO)梯度平均。逐 Token 下,每个 token 权重相等,长回复中的垃圾 token 自然受到与其优势值对应的梯度惩罚。
数学推导:两者的实质差异
设 ,(每个回复的 token 平均梯度)。则:
样本级是等权平均;逐 Token 是按长度加权。若长回复质量高( 大),逐 Token 更好;若长回复充斥垃圾( 小),逐 Token 对其的惩罚更重。总体上,逐 Token 损失对”高质量长推理链”更友好,对”垃圾长回复”更严厉。
效果与边界条件
论文报告逐 Token 损失在 AIME 2024 上直接贡献 +1pct,但”提升训练稳定性,使回复长度更健康地增长”(论文 Figure 4)。其主要价值在于稳定性而非单纯准确率。
边界条件:逐 Token 损失本身对长度中性(不显式奖励或惩罚长度),但与超长奖励塑形结合后,获得负奖励的长回复在梯度中权重更大,形成复合惩罚效应。
创新四:软超长惩罚——消除奖励噪声
硬截断惩罚的问题
当回复超过 tokens 时,生成被强制截断。朴素方法对所有截断回复给 。这产生奖励噪声:
- 一个推导到 90pct 正确然后被截断的回复:
- 一个从头到尾胡说的回复:
模型收到一样的惩罚,无法从中区分”太长了”和”方向错误”。
论文先测试了超长过滤(直接屏蔽截断样本的损失,不更新),发现这一改动单独贡献了 +6pct——证明硬截断惩罚的奖励噪声是 GRPO 基线中最严重的问题之一。但过滤浪费了采样这些回复的算力。
解法:渐进式软惩罚函数
DAPO 设计了一个长度感知的软惩罚:在安全区内零惩罚,超过安全区后线性增加惩罚:
参数: tokens, tokens。因此:
- :无惩罚
- :线性从 0 到
- (截断):惩罚
总奖励为:
graph LR
A["回复长度 |y|"] --> B{"是否 <= 16384?"}
B -- "是" --> C["R_length = 0\n无惩罚"]
B -- "否" --> D{"是否 <= 20480?"}
D -- "是(16384 < |y| <= 20480)" --> E["R_length 线性从 0 到 -1\n渐进惩罚"]
D -- "否(截断,|y| > 20480)" --> F["R_length = -1\n最大惩罚"]
图5:超长奖励塑形函数。16384 tokens 以内无惩罚。16384 到 20480 之间线性软惩罚。超过 20480 tokens(被截断)则给最大惩罚 -1。
软惩罚为何优于硬惩罚
硬惩罚 对所有截断样本一视同仁,梯度告诉模型”这整个行为都是最差的”,信号失真。软惩罚给出与超长程度成比例的梯度信号:稍微超长的回复只受轻微惩罚,给模型一个连续的优化目标,让它学会在接近上限时及时收尾。
4096 tokens 的缓冲区 给模型早期预警:在离截断还有 4096 tokens 时就开始感受轻微惩罚,有助于策略学会在合理时间内得出结论。
完整 DAPO 目标函数
汇总四个创新,DAPO 的完整目标函数为:
满足动态采样约束:
其中:
与 GRPO(式8)相比,DAPO 的五处关键差异:
- 删除 KL 惩罚项:数学推理需要策略大幅偏离预训练模型。
- 非对称截断:,对探索 token 更友好。
- 逐 Token 分母: 替代 ,每个 token 等权。
- 动态采样约束(式20):保证每个批次都有非零梯度信号。
- 奖励含软超长惩罚: 同时考虑正确性和长度。
DAPO 算法流程详解
伪代码(论文 Algorithm 1)
算法:DAPO
输入:策略 π_θ,奖励函数 R,数据集 D
参数:G, ε_low, ε_high, L_max, L_cache, N(缓冲区大小),μ(每次 rollout 的梯度更新次数)
for step = 1, 2, ..., M:
// === 阶段一:动态采样 ===
buffer ← []
while len(buffer) < N:
q ← 从 D 采一个问题
{o_1, ..., o_G} ← π_{θ_old}(· | q) // 采 G 个回复
{R_1, ..., R_G} ← [R_total(q, o_i) for i] // 计算奖励(含长度惩罚)
n_correct = |{i : is_equivalent(answer(q), o_i)}|
if 0 < n_correct < G: // 动态采样过滤条件
buffer.append((q, {o_i}, {R_i}))
// === 阶段二:计算优势 ===
for each (q, {o_i}, {R_i}) in buffer:
μ_R = mean({R_i}), σ_R = std({R_i})
A_i = (R_i - μ_R) / σ_R // 组内标准化优势
// === 阶段三:多次梯度更新 ===
π_{θ_old} ← π_θ // 固定旧策略
for update = 1, 2, ..., μ:
计算 J_DAPO(θ)(式19)
θ ← θ + α ∇_θ J_DAPO(θ) // 梯度上升
输出:π_θ
逐步解析
动态采样 while 循环: 核心在于只让”有正有误”的问题进入缓冲区。这确保缓冲区里的每一条样本都能提供非零梯度信号,是动态采样的实现核心。
奖励计算: R_total = R_correctness + R_length。对于 16384 tokens 以内的回复,R_length = 0,总奖励等于正确性奖励。
优势计算: 使用 而非 做组内归一化,这样长度惩罚也通过优势函数影响策略梯度。
固定旧策略(π_{θ_old} ← π_θ): 重要性比率 相对于固定的 计算。固定后可以做 次梯度更新,这是 PPO 多轮复用样本的方式。
多次梯度更新(μ 次): 每次 rollout 后对同一批样本做 次梯度更新,提升样本利用效率。截断约束确保策略不会在单次更新中偏移太多。
训练超参数
| 超参 | 取值 |
|---|---|
| 基础模型 | Qwen2.5-32B |
| 优化器 | AdamW |
| 学习率 | |
| 预热步数 | 20(线性预热) |
| Rollout 每次问题数 | 512 |
| 每题采样回复数 | 16 |
| 每次 rollout 梯度更新次数 | 16 |
| 生成温度 | 1.0 |
| Top-p | 0.7 |
| 20480 tokens | |
| 4096 tokens | |
| 0.2 | |
| 0.28 | |
| 硬件 | 128 × H20 GPU |
| 框架 | verl(volcengine) |
与相关工作的对比
DAPO 处于 LLM 后训练 RL 算法快速演进的浪潮中。了解它与其他方法的关系,有助于判断哪些是真正的创新。
REINFORCE++(2025)
REINFORCE++ 是一个简化版本,去掉了 PPO 的价值函数,用逐 Token 的基线做方差缩减,但不使用组采样。DAPO 的逐 Token 损失思路与此类似,但 DAPO 额外引入了动态采样和 Clip-Higher,这是 REINFORCE++ 所没有的。
RLOO(Leave-One-Out,2024)
RLOO 对每个回复用”留一法”计算基线:回复 的基线是其余 个回复的均值奖励。这比 GRPO 的全局均值基线方差更小。RLOO 在 很大时等价于 GRPO。DAPO 沿用 GRPO 的全局均值基线,但通过动态采样确保基线只从有效信息样本中计算。
GSPO(组序列策略优化,2025)
GSPO(已于 2026-05-31 覆盖)提出在序列级别做截断,认为长序列中逐 Token 重要性比率的极端值会扭曲整体更新。DAPO 的 Clip-Higher 解决的是另一个问题——放宽上界以促进探索。两个技术是互补的,并不矛盾。
DeepSeek-R1-Zero(2025)
DeepSeek-R1-Zero 直接在大模型上运行带 KL 惩罚的 GRPO。与之对比:DAPO 删除 KL 并添加四个修复,在相同的 Qwen2.5-32B 基础模型上,用一半训练步数达到更高性能。这表明 DAPO 的修改方向比 DeepSeek 方案更高效,而不仅仅是数据或规模的区别。
为什么用规则奖励而不是学习型奖励模型
DAPO 沿用 DeepSeek-R1 的思路,对可验证任务直接用规则奖励:
为什么不用学习型奖励模型?
主要原因是抗奖励劫持(reward hacking)。学习型奖励模型可以被”游戏”:策略会找到那些奖励模型打高分但实际上答案错误的回复——这是 RL 中有据可查的规格博弈(specification gaming)问题。对于可验证的整数答案,精确匹配不存在这个漏洞:要么等于标准答案,要么不等。
另一个原因是零噪声验证:学习型奖励模型本身有误差率,对于 AIME 这类难题它也可能判错。整数精确匹配的错误率为零。
规则奖励的局限:没有部分分。推导了 9/10 步骤但最后算术出错的回复,和完全胡说的回复一样得 。这种粗糙的信号在某些情况下会拖慢学习。过程奖励模型(PRM,对每一步推导打分)是解决这个问题的研究方向,但需要更昂贵的标注。
实验设计与评估
数据集:DAPO-Math-17K
训练数据来自竞赛数学网站的爬取与人工标注。原始答案格式多样(分数、根式、表达式),难以用规则精确验证。受 AIME 竞赛风格启发,团队将所有答案转化为整数:
例如,原始答案 → 改写问题让答案变成 (整数)。
转化过程使用了 LLM 驱动的 CoT 四步流程:提取答案格式 → 改写题目 → 求解改写后的题目 → 给出整数最终答案。最终得到 17000 条问题,每条配一个整数答案,极大简化了奖励验证。
整数转化的四步流程:
- 提取答案格式:分析原始答案的数学结构(如 )
- 改写问题:让答案变成所需整数(如 )
- 求解新问题:验证改写后的问题有整数解
- 给出整数答案:作为训练标签
附录中给出了一个转化示例:
- 原始题目:最小化某代数式,答案
- 转化后:求 ,其中原答案形如 ,答案
评估:AIME 2024 avg@32
AIME(美国数学邀请赛)是高难度竞赛数学题集,2024 年共 30 道题(I 卷 15 道 + II 卷 15 道)。每道题难度高,通常需要 1000-20000 tokens 的推理链才能解决。
评估协议:avg@32——每道题生成 32 个回复,报告平均正确率。这比 pass@1 更稳定,适合高随机性的模型。
“50 points” = AIME 2024 平均准确率 50pct(平均每次生成约 15 道题答对)。
实验结果:逐步消融
论文 Table 1 报告了逐步加入技术的消融结果(AIME 2024 avg@32):
| 配置 | 准确率 | 变化量 |
|---|---|---|
| DeepSeek-R1-Zero-Qwen-32B(参考) | 47pct | — |
| 朴素 GRPO 基线 | 30pct | — |
| + 超长过滤 | 36pct | +6 |
| + Clip-Higher | 38pct | +2 |
| + 软超长惩罚 | 41pct | +3 |
| + 逐 Token 损失 | 42pct | +1 |
| + 动态采样(= 完整 DAPO) | 50pct | +8 |
关键观察:
超长过滤贡献最大(+6pct): 说明硬截断惩罚是 GRPO 基线中最严重的问题。仅靠屏蔽截断样本的损失,就能提升 6 个百分点。
动态采样给出最后的 +8pct 跳升: 其他技术组合到位后(达到 42pct),加入动态采样跳至 50pct。这个大幅跳升说明在其他问题修复后,零梯度批次成为瓶颈,动态采样消除这一瓶颈效果显著。但具体机制未经分析。
逐 Token 损失直接准确率提升小(+1pct): 但论文指出其提升训练稳定性、使回复长度更健康增长的贡献不可忽视。
完整 DAPO(50pct)超越 DeepSeek-R1-Zero(47pct),且只用一半步数(论文 Figure 1)。
案例分析:反思行为的自发涌现
论文 Table 2 展示了一个令人印象深刻的案例——模型在训练过程中自发学会了在推导中途”暂停并反思”:
题目(简化版): 四面体 S-ABC 中,底面 ABC 是等边三角形,点 A 在面 SBC 上的投影 H 是 △SBC 的垂心,二面角 H-AB-C 为 30°,SA=2,求体积(以 形式表达,给出 )。
模型回复(节选): 模型建立坐标系、开始计算…
”…然而,等一下,让我用更审慎的几何方式重新思考这个二面角的问题。考虑平面 α₁ = ABC,它完全位于 xy 平面(z=0)上。让平面 α₂ = SBC…”
——模型意识到当前做法存在问题,主动切换策略,最终得出正确答案。
这种”停下来反思、切换思路”的行为是数学专家推理的典型特征。RL 训练之前的基础模型没有这种行为;训练之后这种行为自发出现,没有任何显式监督。原因:包含回溯和自我修正的回复,在最终给出正确答案上有统计优势——二值奖励捕捉到了这一点,从而强化了这种行为模式。
这个发现的重要含义:仅凭结果级奖励(正确与否),RL 就能涌现出过程级推理改进,而不需要每一步都标注的过程奖励模型。这为理解 RL 如何提升 LLM 推理能力提供了新的视角。
训练动态分析
论文追踪了四个训练指标:
通过追踪这四个指标,DAPO 训练过程有很强的可解释性,相比传统黑箱 RL 训练调试起来更有据可依。
回复长度(Figure 7a): 总体趋势是随训练进行而增长——模型学会生成更长的推理链。但不是单调的,可能出现停滞甚至下降阶段,论文认为这是模型”发现捷径”的信号(找到了短而正确的模式)。长度与准确率一起作为实验是否劣化的监控指标。
奖励分数(Figure 7b): 训练奖励稳步上升,较少出现波动或下降。但重要警告:训练后期,训练集奖励与验证集准确率的相关性较弱——模型在对训练集过拟合(奖励劫持),而非真正提升泛化推理能力。
熵(Figure 7c): DAPO(尤其是 Clip-Higher)下,熵在整个训练过程中保持缓慢上升趋势。这是健康探索的诊断信号:模型持续多样化其推理方式。对比没有 Clip-Higher 的 GRPO,熵在早期就快速坍塌。
平均概率(Figure 7d): 与熵反向相关。熵上升时,平均 token 概率略微下降,说明概率质量在扩散而非集中。
这四个指标的联合分析提供了一套 RL 训练健康度的诊断框架:
- 理想状态: 长度增长 + 奖励增长 + 熵缓慢上升 + 平均概率略降。
- 过早停滞: 长度停滞或下降 + 奖励不涨 → 可能是数据太难或熵坍塌。
- 奖励过拟合: 奖励持续涨但验证集准确率不涨 → 模型在刷训练集,应考虑停训。
- 熵崩溃: 熵急剧下降 + 长度骤减 → 需要检查 Clip-Higher 的 ε_high 是否太小。
自发涌现的推理行为
论文中最有趣的发现之一:自我反思行为在 RL 训练中自发涌现。早期训练中,模型从不回头检查已有推导;随着训练进行,模型开始自发生成:
- 自我验证步骤(“让我验证一下这个结果……”)
- 回溯修正(“等等,让我重新考虑……”)
- 错误检测与重新计算
这些行为完全没有被显式监督——它们纯粹从结果正确性奖励中涌现。这对”RL 能否激发高阶推理元认知能力”这个问题给出了强有力的实证回答。
verl 框架简介
DAPO 基于 verl(字节跳动开源的混合流 RLHF 框架,原称 HybridFlow)构建。
系统架构
graph TD
A["提示词数据集 D"] --> B["Rollout Workers\n(策略 π_θ_old 生成 G 个回复)"]
B --> C["奖励计算\n(R_correctness + R_length)"]
C --> D["动态采样过滤器\n(保留有正有误的批次)"]
D --> E["优势归一化\n(组内标准化)"]
E --> F["策略更新\n(μ 次 DAPO 目标梯度更新)"]
F --> G["更新后的策略 π_θ"]
G --> B
style A fill:#e8f4fd,stroke:#2196f3
style F fill:#e8fde8,stroke:#4caf50
style G fill:#e8fde8,stroke:#4caf50
图6(系统架构):基于 verl 的 DAPO 端到端训练流水线。Rollout Workers 异步生成回复;动态采样过滤器作为质量门控;策略更新使用 DAPO 目标函数(非对称截断 + 逐 Token 平均)。
核心设计原则
混合并行: Actor(策略)、Critic、参考模型和奖励模型可以独立配置不同的并行策略(张量并行、流水线并行、数据并行),灵活适应 128 张 H20 GPU 的集群。
灵活部署: Actor 和参考模型可以共置(co-located)也可以分开部署,根据显存-计算权衡灵活选择。
高效 rollout: 在策略模型更新的同时,可以并行进行下一批回复的采样,减少 GPU 空闲时间。
策略-参考模型解耦: 策略模型(频繁更新)和参考模型(冻结)可以使用不同的并行配置。由于参考模型不更新,可以保留为低精度(BF16)或更积极地分片,节省显存。
Rollout 与训练并行: 当策略模型在处理当前批次的梯度更新时,verl 可以同时生成下一批 rollout。这对长 CoT 推理模型(每个回复可能 10000+ tokens)非常关键——rollout 生成时间往往是总计算时间的主要部分。
开源内容
- 训练代码:
github.com/volcengine/verl - 训练数据集:
DAPO-Math-17K(HuggingFace) - 完整超参数配置
这是当时强推理系统中罕见的完整开源发布,大幅提升了复现性。
四个创新的内在联系
四个技术各自针对一个失效点,但它们并不独立——相互之间存在协同效应:
Clip-Higher 让动态采样更高效。 更高的熵(来自 Clip-Higher)意味着模型对每个问题生成更多样的回复,“有正有误”的概率更大,动态采样过滤器的通过率更高,额外采样开销降低。
动态采样让逐 Token 损失更有效。 过滤掉零梯度批次后,批次中每个问题的优势值都有实质性差异,逐 Token 梯度信号更真实——来自模型真正”不确定”的问题,而非必对/必错的极端情况。
逐 Token 损失与软超长惩罚相互加强。 超长回复贡献大量 token 到梯度(逐 Token 机制),每个 token 又被负的长度惩罚所加权(超长奖励塑形)。两者叠加对病态长度增长的惩罚远强于单独使用任何一个。
删除 KL 惩罚让其他技术不受约束。 KL 惩罚项会把策略往参考模型拉——而参考模型有较低的熵。保留 KL 会部分抵消 Clip-Higher 促进探索的效果。删除 KL 后,策略能在训练中真正维持高熵。
这种协同效应可能解释了消融表格中非线性的增益:完整 DAPO 比朴素 GRPO 提升了 +20pct,远超各个单独技术贡献之和(+12pct)。
局限性与边界条件
论文本身承认的局限,以及我认为更重要的几个遗漏:
0. KL 删除从未被单独消融。 删除 KL 惩罚是 GRPO → DAPO 的重要架构变更之一,但论文从未做”DAPO 完整 + KL 保留”的对比实验来单独量化其贡献。这是一个显著的实验缺口。
1. 超参数敏感性极高: “看似微小的初始条件变化,通过迭代 RL 过程会放大为实质性的结果偏差。“数据略微不同、超参数略微调整,就可能产生截然不同的训练动态。
2. 训练奖励与验证准确率解耦: 训练后期,训练集奖励的继续提升已与验证集准确率无关,难以判断何时停训。需要直接在验证集上评估,但 AIME avg@32 的评估本身计算量很大。
3. 仅限数学领域: 所有实验都在可验证答案的数学题上。四个技术本身可能是通用的,但没有证据。
4. 计算规模门槛高: 128 张 H20 GPU 对大多数学术团队而言不可及。
批判性分析:不足与可改进之处
不好的地方与明显弱点
W1:+8pct 的动态采样跳升缺乏机制解释。 消融表格显示:逐步添加技术累积达到 42pct,最后加动态采样直接跳到 50pct(+8pct)。单看”消除零梯度批次”这个功能,+8pct 显得异乎寻常地大。论文没有实验来揭示这个跳升的机制——是动态采样与 Clip-Higher 有协同效应?是某个特定训练阶段的瓶颈被打通?这个最大的单次提升反而是解释最少的。
W2:评估标准差极大——30道题的方差问题。 AIME 2024 只有 30 道题,avg@32 意味着总共评估 30×32=960 次。50pct 准确率意味着约 480 次正确,47pct 意味着约 451 次正确,差距仅 29 次。论文没有报告置信区间,没有多次种子评估,没有统计显著性检验。DAPO(50pct)与 DeepSeek-R1-Zero(47pct)的 3pct 差距,在统计上可能并不显著。
W3:benchmark 范围极窄。 消融实验只用了 AIME 2024。没有 AIME 2025、MATH500、OlympiadBench 或任何其他指标。“大规模 LLM 强化学习系统”这个标题暗示通用性,但所有证据仅来自数学竞赛题。
W4:ε_high=0.28 没有消融验证。 论文把 0.28 作为固定超参,没有对比 0.22、0.25、0.30、0.35 等其他值的实验。这个值对不同规模的模型、不同数据集是否适用?敏感性如何?完全未知。
W5:动态采样的计算开销未量化。 论文声称动态采样”不显著影响整体训练时间”,依据是生成时间由长尾样本决定。但没有给出具体数字:平均每步需要多采多少问题?总采样 token 数是多少?在没有这些数据的情况下,“比 DeepSeek-R1-Zero 少 50pct 步数”的效率对比是不完整的。
W6:对比基线范围太窄。 论文提交时(2025 年 3 月),REINFORCE++、RLOO、GSPO 等其他 RL 算法已公开。论文只与 GRPO 朴素版和 DeepSeek-R1-Zero 对比,无法评估 DAPO 相对于其他精心调优 RL 方法的真实优势。
作者轻描淡写或回避的局限
L1:删除 KL 惩罚的潜在风险被完全忽略。 论文将删除 KL 称为”长 CoT 推理模型不必要”的设置。但 KL 惩罚在标准 RLHF 中的作用不仅是避免偏离基础模型,还有防止策略学到有害/不一致行为的安全功能。对于数学任务,删除 KL 是合理的;但对于指令跟随、安全敏感场景,无 KL 锚点的策略可能发展出有害行为。论文完全没有讨论这个风险。
L2:整数转化限制了数据代表性。 DAPO-Math-17K 的整数转化虽然简化了奖励验证,但也限制了训练数据类型。很多重要数学推理题(概率、几何、不等式)的自然答案是非整数的。转化过程可能引入系统性偏差,选择了一类特定风格的问题,训练出的模型可能对整数算术特别擅长但对其他类型泛化不足。论文未分析。
L3:动态采样在高性能阶段的可扩展性危机。 随着模型越来越强,“全对”问题占比越来越高,动态采样需要生成更多总回复才能填满缓冲区。最终可能需要生成 10×-100× 的额外回复才能找到足够的”有正有误”问题——在接近前沿性能时,动态采样的实际代价会大幅增加。这个基本可扩展性问题未被讨论。
作者轻描淡写或回避的局限
L1:删除 KL 惩罚的潜在风险被完全忽略。 论文把删除 KL 当作”长 CoT 推理不需要”的通用结论。但 KL 惩罚在 RLHF 中的作用不只是避免偏离基础模型,还有防止策略学到有害行为的安全功能。对数学任务这是合理的;但对指令跟随、安全敏感任务,无 KL 锚点的策略可能变得不可控。论文对这个风险只字未提。
L2:整数转化限制了数据多样性。 DAPO-Math-17K 的整数化转换虽然简化了验证,但也使数据集只包含可以整数化的题型。很多数学推理题(概率、几何)的自然答案是非整数的,整数化后可能引入系统性偏差,训练出的模型对”整数答案式推理”特别擅长,而对其他类型泛化不足。这一点论文没有讨论。
L3:动态采样在高性能阶段的可扩展性危机未被提及。 随着模型越来越强,越来越多的问题变成”全对”,动态采样的过滤率升高,需要生成更多回复才能填满缓冲区。在接近前沿性能时,这个额外开销可能增加 10 倍以上,让实际可扩展性成为问题。论文对此沉默。
可以改进的地方
S1:对 ε_high 做系统消融(0.20 到 0.40,每隔 0.02 测一个点)。 绘制 ε_high vs. AIME 准确率曲线,揭示最优区间和敏感性。这只需要约 10 次训练运行。
S2:2×2 消融实验揭示动态采样的交互效应。 固定其他所有 DAPO 技术,测试(Clip-Higher 开/关)×(动态采样 开/关)四种组合,找出 +8pct 跳升的真正来源。
S3:对所有 benchmark 数字报告置信区间。 对 30 道 AIME 题目和 32 次采样,用 Bootstrap 计算 95pct 置信区间。如果 DAPO(50pct)和 DeepSeek-R1-Zero(47pct)的 CI 重叠,需要对主要结论加以说明。
S4:量化动态采样开销。 报告每个有效训练步平均需要采样多少问题(有无动态采样的对比),以及每步的 wall-clock 时间。这对实际复现至关重要。
S5:在代码生成任务上验证。 HumanEval 或 LeetCode 提供可靠的二值执行奖励(类似整数答案数学题),是验证 DAPO 通用性的理想测试床。
S6:报告通用能力 benchmark(MMLU、HellaSwag)。 RL 训练可能导致通用语言理解能力下降。论文没有报告 DAPO 训练后模型在通用任务上的表现,无法评估删除 KL 惩罚是否影响了模型的安全性或通用性。
总结
DAPO 是一篇思路清晰、工程价值高的系统论文。
读完这篇论文,我觉得最有价值的贡献不是准确率数字,而是四个诊断框架:它展示了一种调试 RL for LLM 失效的方法论——先找到具体的失效信号(熵下降、梯度为零、长度偏差、截断噪声),再为每个信号设计最小化修复,最后用消融实验验证每个修复的独立贡献。这种方法论对后续研究者调试自己的 RL 系统有很强的参考价值,远比”我们用了 X 和 Y 方法”的黑箱叙述更实用。
未来值得探索的问题
-
Clip-Higher 对其他 RL 算法也有效吗? 熵坍塌不是 GRPO 独有的问题,任何截断式策略梯度方法都可能面临。非对称截断对 REINFORCE++ 或 RLOO 是否同样有效?
-
最小组大小 是多少才能让动态采样有效? 时大约 87pct 的组能通过过滤器(假设50pct基础准确率); 时只有 62pct。存在一个最小 使动态采样性价比合理。
-
过程奖励模型(PRM)能替代动态采样吗? 如果对每一步推导打分,即使”全对”回复的各步骤之间也会有优势差异,从而消除零梯度问题,同时不需要额外采样开销。
-
整个 DAPO 方案是计算最优的吗? “比 DeepSeek-R1-Zero 少 50pct 步数”是关于梯度更新次数,不是关于总计算量(FLOPs)。如果动态采样每步需要 3 倍的采样开销,实际上可能并不更高效。
DAPO 是一篇有价值的系统论文。它把 RL 训练的四个具体失效点拆开来单独研究、单独修复,并提供了完整的开源实现。论文最出彩的贡献是 Clip-Higher:对称截断抑制探索这个机制观察得干净利落,非对称修复也简单有效,有直接的实验测量佐证(上截断 token 的平均概率,论文 Figure 3a)。动态采样在实践中同样重要——零梯度批次是一个真实且随训练进展而恶化的问题。
主要弱点是最大的单技术提升(动态采样 +8pct)缺乏机制解释,benchmark 范围太窄(30道 AIME 题),以及动态采样开销未量化。从整体上看,DAPO 对 LLM RL 训练社区的透明度贡献不亚于其技术贡献——在竞争激烈的推理模型赛道上选择完整开源而非藏着掖着,这本身就值得肯定。
对于想要实践这篇论文的读者,可操作的建议如下:
- 如果你在用 GRPO/PPO 训练 LLM 推理并遇到了熵坍塌:先试 Clip-Higher,只需修改截断参数(ε_high=0.28),代价最低。
- 如果你遇到了训练不稳定或奖励噪声:加入软超长惩罚,防止截断样本污染梯度。
- 如果你发现批次中许多问题已经全对(模型学得很快):引入动态采样,让每步都有有效梯度。
- 逐 Token 损失是默认应该打开的设置:对长 CoT 场景没有副作用,有稳定的正向效果。
这四个技术不仅仅是”调参技巧”,更重要的是它们背后的诊断思路:每一个失效都有可测量的信号(熵曲线、梯度批次质量、回复长度分布、奖励-验证相关性),每一个修复都尽量最小化(只改最必要的东西)。这种”先测量、再修复、最后消融验证”的工程文化,是 DAPO 最值得学习的地方——不只是把代码开源,而是把调试思路也开源了。
最后,DAPO 自发涌现的反思行为是这篇笔记里最让我惊喜的发现。我们花了大量精力讨论算法机制和统计显著性,但有一件事是确定的:RL 训练能让模型学会在推导中途停下来、质疑自己、切换策略——这种元认知能力的涌现,完全来自于对结果正确性的追求,没有任何额外的监督。这告诉我们:好的训练信号,配上足够的探索空间,可以走得比我们想象中更远。
进一步阅读:
- DeepSeekMath(GRPO 原始论文):arXiv 2402.03300
- DeepSeek-R1(使用 GRPO 的推理模型):arXiv 2501.12948
- REINFORCE++(另一个简化 PPO 的方案):arXiv 2501.03262
- verl 框架(DAPO 基础设施):arXiv 2409.19256论文最出彩的贡献是 Clip-Higher:对称截断抑制探索这个机制观察得干净利落,非对称修复也简单有效,并有直接的实验测量(上截断 token 的平均概率)佐证。动态采样在实践中同样重要——零梯度批次是一个真实且随训练进展而恶化的问题,过滤方案优雅。
主要弱点是实验范围太窄(30道 AIME 题,缺乏统计检验)、动态采样跳升的机制未解释、以及计算开销未量化。未来工作应将这些技术推广到非数学领域,为非对称截断提供理论依据,并解决动态采样在高性能阶段的可扩展性问题。