RL POST-TRAINING · LOSS AGGREGATION · TOKEN-MEAN VS SAMPLE-MEAN

一票还是十票:
损失的聚合单位之争

500 token 的回答和 5000 token 的回答,谁对梯度的贡献大?

GRPO 说一样大——每条回答一票;DAPO 说长的大十倍——每个 token 一票。三家处理的是同一个式子里的同一个位置:损失的聚合除数。DAPO 论文 §3.3 说长 CoT 场景必须换 token 级聚合,但换完会把长度倾斜从 response 级赶到 question 级。本报告拆解三个公式、两家的论证、一个少有人讲的 tradeoff,以及「回到 PPO」的两个侧面。

本报告为博客正文的配套交互版 · 正文:/posts/token-mean-vs-sample-mean/(线上 njx-njx.github.io) · 论文 DAPO · Dr.GRPO · DeepSeekMath
证据分级:论文一手 > 实现观察(已回对)> 换算/推断/作者判断 [已标注] · 图内数字可点击下钻 · 点击画布切换三种计票规则

SCROLL

§0 · 关键结论

一句话:同一个式子的同一个位置——聚合除数,三家给了三种答案

这个旋钮和 advantage 归一化(std 那半)是正交的:上一篇的问题是「advantage 怎么算」,今天的问题是「算完之后,token 们的损失按什么规则加在一起」。

三种答案都有论文背书。GRPO(sample-mean)先在每条回答内部对 token 求平均、再对 G 条回答求平均——每条回答无论长短都是平等的一票;DAPO(token-mean)把 batch 内所有 token 拉平,统一除以总 token 数——每个 token 一票,5000 token 的回答拿 5000 票;Dr.GRPO 形式上也是每条回答一票,但除数从「每条回答的实际长度」换成全局常数——票的含义变了。

先把这笔票算清楚。下面这个计票器把开场算例做成可拖的:两条回答的长度可以改,三种计票规则可以切,每 token 权重和总权重份额实时重算。默认档就是博客的算例——500 对 5000。

Longer sequences can have more influence.

— DAPO 论文 · §3.3 原文

语境换 token-mean 后,长序列在整体梯度更新中比短序列有更大影响。 为何重要这不是副作用,是设计目标——长 CoT 时代,梯度本来就该主要花在长回答上。但「长样本拿更多票」有两层含义,DAPO 只讲了第一层(§3)。

这条报告按论证链展开:§1 把三个公式并排拆开,改动其实只有一处;§2 过 DAPO §3.3 的两个「罚不到」;§3 看那层被从 response 级赶到 question 级的倾斜,和一个随机除数带来的隐式学习率衰减;§4 把「回到 PPO」拆成两个正交旋钮;§5 给场景选型,§6 留三个未决问题。

§1 · 三个公式并排

改动只有一处:内层的 1/|o_i| 没了

GRPO 的求和结构是两层:1/|o_i|·Σ_t 先把每条回答自己平均成一个数,1/G·Σ_i 再对 G 个数求平均。DAPO 把内层平均拿掉,两层求和拉平。Dr.GRPO 保留拉平,只换除数。

下面三个公式每个部件都可以点击拆解。注意 DAPO 式里蓝色高亮的除数——那就是论文公式 12 红字标注的改动位。

GRPO · sample-mean DeepSeekMath 式 3(省略 KL 版)

J_GRPO = E [ 1G Σi 1|o_i| Σt ℓi,t ]

DAPO · token-mean 论文式 12 · §3.3

J_DAPO = E [ 1Σi|o_i| Σi Σt ℓi,t ]

Dr.GRPO · 常数除数 arXiv:2503.20783

J_DrG = E [ 1G·L_const Σi Σt ℓi,t ], Â_i = r_i − mean(r)

FORMULA DISSECTION · 点击上方部件

三种答案,同一个位置

三家处理的是同一个式子里的同一个位置——损失的聚合除数。点任意部件看它在论证链里的角色。

1/G·Σ_i

组内平均 · 回答级

G 条回答各出一个数,再求平均——回答之间平等。

GRPO 与 Dr.GRPO 都保留这层:G 条回答各占目标的 1/G。DAPO 把这层和除数合并:回答之间不再平等,权重正比于长度。

Hover 看完整定义

1/|o_i|

回答内平均 · 争议焦点

每条回答先把自己摊平——长回答每 token 权重被摊薄。

这是整场之争的焦点。它让每条回答总权重相等(一票),代价是长样本的每 token 权重被摊薄:5000 token 的正确推理,每 token 只分到 500 token 样本的 1/10。DAPO §3.3 的两个「罚不到」和 Dr.GRPO 批的 response-level length bias,都是它的面孔。

Hover 看完整定义

Σ|o_i|

拉平除数 · 随机变量

整个 group 的总 token 数——每 token 等权,且随 batch 波动。

换成它之后,单 token 不论身处长样本短样本权重相同(1/Σ|o_i|),一条回答的总权重正比于长度。注意它是随 batch 变化的随机变量:梯度尺度随 batch 长度构成波动,训练后期回答变长时还自带隐式 LR 衰减(§3,推断)。

Hover 看完整定义

§2 · DAPO 为什么非要换

两个「罚不到」:学不到,也罚不掉

DAPO 论文 §3.3 的论证很具体,针对长 CoT 场景:sample-mean 下,长样本「对整体损失的贡献不成比例地低」(原文 disproportionately lower contribution),引出两个恶果。

  • 一 · 高质量长样本里的推理模式学不到。一条 5000 token 的正确推理,每个 token 分到的梯度权重是 1/(G·5000),只有 500 token 短样本的十分之一。长样本承载的恰恰是复杂推理——按 sample-mean,越重要的内容单位权重越低。
  • 二 · 超长样本里的坏模式罚不掉。论文报告了一个观察:过长的样本里常出现 gibberish(乱码)和重复词这类低质模式。这些坏 token 的惩罚同样被 1/|o_i| 摊薄——样本越长,每个坏 token 被罚得越轻。结果是「熵和回答长度的不健康上涨」(论文图 4a/4b 的实测曲线)。

换成 token-mean 后,单 token 不论身处长样本还是短样本,权重相同。DAPO 对效果直说不讳:长序列由此「在整体梯度更新中比短序列有更大影响」(§0 引文)。下面这张图把「摊薄」画成曲线:横轴是回答长度,纵轴是 sample-mean 下每 token 的实际权重——它按 1/|o_i| 一路下滑,token-mean 则是一条平线。

§3 · 一个少有人讲的 tradeoff

倾斜没有被消灭,只是被赶到了 question 级

「长样本拿更多票」有两层含义,DAPO 只讲了第一层。第一层 response 级是 Dr.GRPO 也赞同的方向;第二层 question 级是个真实的偏向——题间权重正比于长度。

第一层 · response 级:同一条回答内部,token 不再被长度摊薄。Dr.GRPO 批的「response-level length bias」(答对时短者被器重、答错时长者更安全)和 DAPO 批的「坏 token 罚不到」,是同一个 1/|o_i| 的两副面孔,两家开的药殊途同归:per-token 等权。

第二层 · question 级(推断,未见任何论文量化):整个 batch 里,回答长的题拿走更多总权重。一道模型的回答平均 6000 token 的题,和一道平均 600 token 的题,token-mean 下的 batch 权重差 10 倍;sample-mean 下两者相等。换句话说,token-mean 把长度倾斜从 response 级赶到了 question 级——长题主导梯度。这在长 CoT 场景或许正是想要的(难题、推理重的题往往回答也长),但题目权重不再均匀,而是正比于该题当前的长度高估。

还有第二个二阶效应(机制层面推断,无论文测过):DAPO 的除数 Σ|o_i| 是随 batch 变化的随机变量,Dr.GRPO 的常数除数不是。除数随机的直接后果是梯度尺度随 batch 的长度构成波动;间接后果更有意思——训练后期回答普遍变长,除数变大,每个 token 的有效学习率自动衰减。也就是说 token-mean 自带一个与长度膨胀联动的隐式学习率衰减,而 sample-mean 和常数除数都没有这个性质。你选的不只是权重分配,还是梯度尺度的动力学。

§4 · 回到 PPO

两家都说「回到 PPO」,回的不是同一个 PPO

一个容易被忽略的史实:PPO 的原始目标函数本来就是 per-token 聚合的——对整个 batch 的 token 求和或求均值,advantage 由 GAE 逐 token 给出。GRPO 的 sample-mean 才是那个偏离者。

然后 DAPO 和 Dr.GRPO 都宣称自己「恢复了 PPO 目标」:DAPO 恢复的是 PPO 的聚合方式(token 拉平,但 advantage 保留 z-score,std 还在);Dr.GRPO 恢复的是 PPO 的目标函数形式(常数除数,advantage 退化为 r−mean,std 去掉)。两个旋钮——聚合粒度、advantage 归一化——是独立的,可以自由组合:verl 等实现里这两项确实是分开配置的(前篇的实现层讨论:trl/verl 的 masked_mean 默认把公式没有的 per-response 平均又加回去了,审计每个除数「是变量还是常数」是成本最低的检查)。

这意味着「GRPO vs DAPO vs Dr.GRPO」不是三个算法排排坐,而是一个 2×2 以上的配置空间,目前已知好的点都还在边界上试出来。点击格子看每家的旋钮组合:

§5 · 场景选型

什么时候,哪票该大

把场景拆开,选择并不玄。

聚合方式之争的本质,是「梯度预算按什么单位分」。

— 博客正文 · 作者判断

语境sample-mean 按条分,隐含每条回答信息量相等——短答案时代成立;token-mean 按 token 分,隐含每个 token 信息量相等——长 CoT 时代更接近真相,但代价是把题间权重交给长度决定。 为何重要真正缺的论文是把预算分配显式化的:权重既不按条也不按 token,而是按估计的信息量或不确定性分。在那之前,DAPO 的改法是长 CoT 下最务实的默认。

§6 · 未决问题

三个还没有答案的问题

  • ① question 级长度倾斜对训练终局的影响。token-mean 下题间权重 ∝ 长度,这层倾斜(§3,推断)对训练终局的影响,没有公开量化。
  • ② 隐式 LR 衰减与显式 schedule 的相互作用。随机除数带来的隐式学习率衰减(推断),与显式 LR schedule 叠加时的相互作用,没有人测过。
  • ③ 2×2 完整消融。聚合粒度 × advantage 归一化两个旋钮的完整 2×2 消融(sample/token × 有 std/无 std),公开文献里只有对角线上的点。