本文有配套的交互报告,含可下钻的长度标尺、Equation 13 三段拆解与三种处理方式的对比切换。
无法回避的一个工程设定
RL 训练的 rollout 必须有生成长度上限。显存要按最长序列预留,batch 要等最慢的一条写完,一条失控的 response 能拖垮整批吞吐。DAPO 的配置是:预期最大长度 16,384 token,额外保留 4,096 token 的缓冲区间,硬性生成上限为 20,480(论文 §4.1)。
上限一设,就必然有一部分回答被截断。这些样本该怎么办?默认做法很常见:给惩罚性奖励,按答错处理(reward 记 0 或负分)。
DAPO 论文(arXiv:2503.14476)§3.4 指出,这个默认做法会带来问题:截断样本的错误处理会引入奖励噪声,而且是在组内归一化的放大下注入整个训练过程。原文的理由很直白:一个推理过程本身合理,仅仅因为写得太长而被惩罚,这种惩罚会让模型困惑——它无法区分推理是否有效。
噪声是怎么进 advantage 的
GRPO 的 advantage 是组内相对排名:同一道题采 $G$ 条回答,减组内均值(除以 std)。这意味着,任何一条回答的奖励一旦出错,就会影响整组。
举一个具体算例:一道题采 8 条回答,真实情况是 4 对 4 错,其中 2 条"错"其实是被截断的优质推理(如果写完很可能对)。
- 按真实质量:组均值 0.5,答对的回答拿到正 advantage,答错的拿到负的;
- 按截断=0 分:截断样本也被算作错误的回答,组均值被拉低(错的算 6 条,均值 0.25),于是所有答对样本的 advantage 被抬高、所有答错样本的 advantage 被减轻——包括那两条真正答错的。
一层扭曲还不够,还有第二层:那两条被截断的优质推理本身,会被作为负样本强化。模型从中学到的不是"要写短一点",而是"我这种推理方式不对"——这正是论文说的会让模型产生困惑的地方。这两类惩罚混为一谈后,模型会把好的推理方式和"写得长"一起抛弃。
方案一:Overlong Filtering——认为截断样本"不可判定",屏蔽其 loss
DAPO 的第一种处理方式是:不把截断样本当作错误样本,而是直接不承认它是样本。Overlong Filtering 把被截断回答的 loss 整体屏蔽——这条样本不参与 advantage 估计,也不产生梯度。
论文 Figure 5 给出的效果:应用 Overlong Reward Shaping 后,AIME 准确率和 actor 模型的熵都更稳定,训练稳定性明显提升。这一点值得注意:熵的稳定意味着截断噪声本身就在干扰探索动力学——并不只影响 reward 的账面数字。
代价同样明显,论文没有展开,我补充两点:
- 算力白费。一条截断样本的 rollout 成本已经花了(它往往是最长的那条,恰好占用最多算力),屏蔽后一条梯度都没换回来。这与 dynamic sampling 的逻辑相同——都是"用算力换信号质量",DAPO 全篇都是这个取向;
- 隐性的幸存者偏差。什么样的样本更容易被截断?长题、难题、需要长 CoT 的题。系统性地屏蔽截断样本,等于系统性地降低难题在训练分布中的权重。短期内,训练会更稳定,长期代价则是模型可能在最需要长推理的题目上暴露短板。论文没有讨论这个副作用,这是我自己提出的保留意见。
方案二:Soft Overlong Punishment——悬崖前修一段缓冲坡
完全屏蔽会丢失信息:模型无法学到长度本身很重要。DAPO 的第二种处理方式是 Soft Overlong Punishment,把长度本身变成一个连续、可判别的奖励维度(论文 Equation 13):
$$R_{length}(y) = \begin{cases} 0, & |y| \le L_{max} - L_{cache} \ \dfrac{(L_{max} - L_{cache}) - |y|}{L_{cache}}, & L_{max}-L_{cache} < |y| \le L_{max} \ -1, & L_{max} < |y| \end{cases}$$
三段分别解释:
- $|y| \le L_{max}-L_{cache}$(DAPO 配置下即 ≤ 12,288 token):不惩罚。长度在这个阶段完全是自由的;
- 进入 cache 区间(12,288 到 16,384):线性渐变惩罚,从 0 平滑降到 -1。每多写一个 token,惩罚就增加 $1/L_{cache} = 1/4096$;
- 超过 $L_{max}$(被截断):惩罚封顶为 -1。注意这一项会加到原来的对错奖励上——答对但写超了,总分照样可能被拉低。
这个设计最精妙的地方在于:悬崖没有被消除,悬崖前修了一段缓冲坡。超过 $L_{max}$ 仍然是 -1 的硬惩罚,和 naive 做法一样狠;但模型在到达悬崖前四千 token 就开始收到连续的"快超预算了"的信号,而且信号强度与超预算的程度单调相关。组内归一化之后,“12,500 token 差点超"和"16,300 token 即将超"的两条回答会拿到可分辨的 advantage 差,模型能据此学会提前收尾,而不是到了上限才知道疼。长度控制从一个二元事件(没超/超了)变成一个连续可学习的任务。
放进本周"长度问题"的完整图景
本周前几篇文章讨论的都与长度有关,今天这篇讨论的是最后一个方面:
- $1/|y|$ 的梯度摊薄(Dr.GRPO,昨天):错误回答越长,每个 token 受的惩罚越小,模型会倾向于把错误回答写得过长。解决方式:改归一化项;
- token-mean(DAPO §3.3):样本内先平均再对组求和改成 batch 内所有 token 统一平均,防止长回答在损失中占据过大权重。解决方式:改损失聚合;
- Overlong(DAPO §3.4,本篇):生成长度上限产生的截断样本,其奖励不可判定。解决方式:屏蔽(filtering)或改奖励函数(soft punishment)。
三者处理的是三个不同层级的长度问题:梯度权重、损失聚合、奖励判定。DAPO 同时使用 token-mean 和 overlong shaping,表示它既修梯度侧,也修奖励侧;Dr.GRPO 侧重归一化。它们并不冲突。
还可以看出 DAPO 的一个设计取向:与其使用不可靠的信号,不如不用。dynamic sampling 过滤没有梯度信号的 prompt(全对/全错的题),overlong filtering 屏蔽奖励不可靠的样本(截断的回答),Dataset Transformation 把答案统一转成整数以消除解析器噪声(§3.5,DAPO-Math-17K)。四项技术都指向同一个方向:训练崩溃往往不是算法不够好,而是信号中混入了噪声。
我的三个判断
一、截断样本是“不可判定”样本,将其判为错误属于奖励层面上的误判。RLVR 的前提是奖励可以验证——能判对错才给分。截断样本的 verifier 根本没能执行完判定,它既不是 1 也不是 0。Overlong Filtering 承认这种不可判定性,Soft Punishment 则引入一个新的可判定维度(长度本身)。两种处理方式都符合"奖励必须可验证"的原则,而 naive 的 punitive reward 违反了这个原则。
二、Overlong 处理后熵更稳定这件事,比表面看上去更重要。Figure 5(b) 显示 shaping 后 actor 熵的曲线更平稳。这说明,长度上限附近发生的混乱(突然被惩罚的优质长推理、被迫乱收尾的回答)并不仅仅使 reward 失真,还会增加探索噪声。结合前天写的 Clip-Higher(熵坍缩)一起看:熵既会被优化器错误压制而坍缩,也会被奖励噪声干扰而剧烈波动。熵监控必须和奖励判定质量一起分析。
三、cache 宽度和屏蔽比例是需要监控的两个超参数,目前没有公开依据。4,096/16,384 = 25% 的缓冲坡长度是怎么定的,论文没有给;训练中截断率(被屏蔽样本占比)随模型长度行为漂移,屏蔽率过高时有效 batch 缩水、难题占比下降,过低则说明长度控制已经失效或上限设得太宽。这两个数字在 DAPO 论文里都没有监控曲线,复现时只能自己补。
未决问题
- Overlong Filtering 造成的难题权重流失,在长期训练里是否需要配合长度课程(progressive length curriculum)补偿,没有公开实验;
- cache 宽度(25%)的选取依据与消融,论文未披露;
- Soft Punishment 的 -1 封顶与 Clip-Higher 的不对称裁剪叠加时,长但正确的探索性回答是否会被双重抑制,目前没有数据。
参考来源
- DAPO 论文:arXiv:2503.14476v2(§3.4 机制描述、Equation 13、§4.1 配置数值、Figure 5 的出处)
- 本地教材 hands-on-modern-rl:第 18 章 deepseek-dapo.md 与附录 DAPO cheatsheet(
docs/en/appendix_code_cheatsheet/dapo.md) - 前篇:熵是怎么塌掉的:DAPO 的 Clip-Higher 在修什么、“答错就写长一点”:GRPO 两个归一化项怎么扭曲优化方向