← 返回列表

详解 GRPO:损失函数怎么算,序列平均与批次平均差在哪

摘要

GRPO 把 PPO 里最重的两个部件——价值网络与广义优势估计——替换成一个朴素的统计操作:同一提示采样 GG 个回答,用组内奖励的均值与标准差做标准化。损失函数的计算链条由此变为:采样 → 打分 → 组内标准化 → 逐 token 裁剪。

这条链上有一个容易被忽视的核心不对称,是本文的主线:

  • 组内优势 A^i\hat{A}_i 是序列级标量——它只回答”这条回答整体好不好”,对整条回答的每个 token 取同一个值;
  • 重要性比率 ρi,t\rho_{i,t} 是 token 级因子——它在每个位置单独计算,是裁剪项里唯一携带位置信息的因子。

两者的乘积结构意味着:模型知道这条回答整体好不好,却不知道到底是哪个 token 让它好——所有 token 收到同样的方向指令,功劳的细分只能靠跨样本的统计涌现。此外,损失中的 1/∣yi∣1/\lvert y_i\rvert 还藏着序列平均与批次平均两种归一化的分歧,后者正是 GRPO 长度偏差的根源。

0. 记号与问题设定

0.1 记号约定

记号含义粒度
xx提示(prompt)—
GG组大小:同一提示下采样的回答数—
yiy_i组内第 ii 个回答;∣yi∣\lvert y_i\rvert 为其 token 数—
rir_i第 ii 个回答的奖励(规则验证器或奖励模型给出)序列级
A^i\hat{A}_i组内相对优势,一个标量,整条回答共享序列级
ρi,t\rho_{i,t}第 ii 个回答第 tt 个 token 处的重要性比率token 级
ℓi,t\ell_{i,t}第 ii 个回答第 tt 个 token 的裁剪项取值token 级
ε\varepsilon裁剪范围;β\betaKL 系数

在记号表里显式标出”粒度”一栏,是因为本文的全部论点都建立在序列级与 token 级的区分之上。

0.2 与 PPO 的定位差异

一句话定位:GRPO 保留 PPO 的裁剪结构,只替换优势估计方式。 PPO 需要一个与策略同规模的价值网络,用它在每个 token 位置估计”从这往后能拿多少回报”,从而得到逐 token 的优势序列;GRPO 不训练任何价值网络,改用一个直觉观察:“这条回答好不好”可以通过”同组其它回答好不好”来定义——比组内平均强就是好,比组内平均差就是差。

由此得到的是一个序列级标量,而非逐 token 序列。后文所有细节都由这个定位差异衍生。

1. 组内优势:一个序列级标量

要点:组内优势 = 减组内均值再除组内标准差。减均值是降方差的基线,除标准差只是尺度归一化。整个过程是纯标量运算,没有任何位置信息。

1.1 定义

对同一提示采样 GG 个回答并打分,得到 r1,…,rGr_1,\dots,r_G。组内相对优势定义为

A^i=ri−mean(r1,…,rG)std(r1,…,rG)(1)\hat{A}_i=\frac{r_i-\mathrm{mean}(r_1,\dots,r_G)}{\mathrm{std}(r_1,\dots,r_G)} \tag{1}
(1)

式 (1) 包含两个操作,先分清楚各自的职责:

  • 减均值:这是”基线减除”,回答的是”你比组内平均水平好多少”。减掉一个不依赖动作的常数不会给梯度估计引入偏差,却能显著降低方差——这是强化学习里最古老的降方差技巧;
  • 除标准差:这只是尺度归一化,让不同组之间的优势量级可比。它不是基线的一部分,也因此引入了自己的副作用(见 §1.3)。

大白话:式 (1) 做的是组内排名。奖励的绝对大小不重要,重要的是”在这组人里你排第几”。

1.2 为什么它是序列级

三个观察足以说明 A^i\hat{A}_i 的粒度:

第一,输入就是序列级的。 奖励 rir_i 在整条回答生成完毕后给出——规则验证器比较答案对错,奖励模型阅读完整回答打分——它从头到尾只有一个标量,不包含”第几个 token 起了作用”的信息。

第二,标准化是纯标量运算。 式 (1) 只涉及 GG 个标量的均值与标准差,序列内部的任何结构都不参与计算。

第三,下标里没有 tt。 A^i\hat{A}_i 只带回答编号 ii,不带 token 位置 tt。这意味着在损失函数里,整条回答的每一个 token 位置乘的都是同一个值。这一点在 §2.2 会展开成全文的核心论点。

1.3 边界情形与副作用

组内奖励完全相同时,优势严格为 0,整组不产生任何梯度——“全对”或”全错”的组对训练没有贡献,梯度信号只在组内存在分歧时出现。

除零与噪声放大。标准差为 0 时式 (1) 变成 0/00/0,实现中通常在分母加一个极小常数兜底,但这只防止出现 NaN:若奖励连续或存在浮点误差,分子非零而分母趋近 0,优势会被放大到方向由噪声决定。兜底常数防的是崩溃,不是噪声。

难度偏差。简单题全对、难题全错时,组内标准差都很小,任何微小差异都被放大为大优势;中等难度、有对有错时标准差大,奖励差被压缩。净效果是优化信号从信息量最大的中等难度样本被系统性地移向两端。缓解方式之一是直接移除标准差归一化,只保留减均值。

2. 损失函数:序列级优势 × token 级比率

要点:裁剪项是一个乘积——token 级因子 ρi,t\rho_{i,t} 与序列级因子 A^i\hat{A}_i。前者随位置变化,后者整条回答共享。这一乘积结构决定了 GRPO 的信用分配粒度。

2.1 目标函数

JGRPO(θ)=E[1G∑i=1G1∣yi∣∑t=1∣yi∣ℓi,t−β DKL(πθ∥πref)](2)\mathcal{J}_{\mathrm{GRPO}}(\theta)=\mathbb{E}\Big[\frac{1}{G}\sum_{i=1}^{G}\frac{1}{\lvert y_i\rvert}\sum_{t=1}^{\lvert y_i\rvert}\ell_{i,t}-\beta\,D_{\mathrm{KL}}(\pi_\theta\|\pi_{\mathrm{ref}})\Big] \tag{2}
(2)

其中逐 token 的裁剪项与重要性比率分别为

ℓi,t=min⁡(ρi,t A^i,  clip(ρi,t, 1−ε, 1+ε)⋅A^i)(3)\ell_{i,t}=\min\Big(\rho_{i,t}\,\hat{A}_i,\ \ \mathrm{clip}(\rho_{i,t},\,1-\varepsilon,\,1+\varepsilon)\cdot\hat{A}_i\Big) \tag{3}
(3)
ρi,t=πθ(oi,t∣x,oi,<t)πθold(oi,t∣x,oi,<t)(4)\rho_{i,t}=\frac{\pi_\theta(o_{i,t}\mid x,o_{i,<t})}{\pi_{\theta_{\mathrm{old}}}(o_{i,t}\mid x,o_{i,<t})} \tag{4}
(4)

式中 oi,to_{i,t} 是第 ii 个回答的第 tt 个 token,oi,<to_{i,<t} 是它前面的所有 token。裁剪的机制——比率超出 [1−ε,1+ε][1-\varepsilon,1+\varepsilon] 后梯度单边截断——与 PPO 完全相同,这里不重复其动机。

2.2 乘积结构:两个因子各司其职

式 (3) 的结构值得拆开看:它是一个乘积,两个因子粒度不同、职责不同。

  • token 级因子:ρi,t\rho_{i,t} 在每个位置单独计算——当前策略在这个位置输出这个 token 的概率,相对采样策略变了多少倍。它是裁剪项里唯一携带位置信息的因子,裁剪也作用在它身上;
  • 序列级因子:A^i\hat{A}_i 与位置无关,只回答”这条回答整体好不好”。它在乘积里扮演的是一把尺子:符号决定抬高还是压低,绝对值决定力度。

于是整条回答的梯度被这把尺子统一缩放:A^i\hat{A}_i 为正,每个 token 的概率都往上抬;为负,每个 token 都往下压。

2.3 核心推论:模型不知道是哪个 token 导致了好结果

把 §1.2 与 §2.2 合起来,得到 GRPO 最重要的一个性质:

模型知道”这条回答整体好不好”,但不知道”到底是哪一个 token 导致它好”。

奖励在序列末尾给出,组内标准化不携带任何位置信息,优势对每个 token 取同一个值——于是更新时,好回答里的所有 token 得到同样的鼓励,坏回答里的所有 token 得到同样的压制。那个真正让答案正确的关键 token,和它旁边的填充 token、语气词,在单条回答内部被完全同等对待。

对比 PPO 的 GAE 就能看清差别:GAE 从序列末尾往回递归,逐位置算出不同的优势,靠近奖励的位置信号强、远离的位置逐渐衰减——信用分配在单条序列内部完成。GRPO 放弃了这种序列内分配,把整个机制替换成一个标量的复制粘贴。

那 token 级的功劳还分得清吗?分得清,但靠的是跨样本统计:同一个前缀(提示加上已生成的 token 序列)在大量采样中反复出现,如果一个 token 出现在高分回答里的频率系统性高于低分回答,鼓励它的梯度就会在多次更新中不断叠加,而压制来自另一些样本。也就是说,GRPO 的 token 级信用分配不是单条回答内算出来的,而是从大量组的统计中涌现出来的。这也是为什么组大小 GG 和采样多样性对 GRPO 至关重要——统计要够多,涌现才可靠。

3. KL 项:损失里唯一的逐 token 评估

式 (2) 的 KL 项值得单独指出:它是整个损失函数里唯一逐 token 计算的评估成分——在每个位置比较当前策略与参考策略的输出分布。实践中它以两种形态出现,需要能互相辨认:

形态一:k3 无偏估计量。 逐 token 计算

D^KL=u−log⁡u−1,u=πref(oi,t∣⋅)πθ(oi,t∣⋅)(5)\hat{D}_{\mathrm{KL}}=u-\log u-1,\qquad u=\frac{\pi_{\mathrm{ref}}(o_{i,t}\mid\cdot)}{\pi_\theta(o_{i,t}\mid\cdot)} \tag{5}
(5)

无偏性一眼可验:E[u]=∑πθ⋅(πref/πθ)=1\mathbb{E}[u]=\sum\pi_\theta\cdot(\pi_{\mathrm{ref}}/\pi_\theta)=1,于是 E[u−log⁡u−1]=1−E[log⁡u]−1=E[log⁡(πθ/πref)]=DKL(πθ∥πref)\mathbb{E}[u-\log u-1]=1-\mathbb{E}[\log u]-1=\mathbb{E}[\log(\pi_\theta/\pi_{\mathrm{ref}})]=D_{\mathrm{KL}}(\pi_\theta\|\pi_{\mathrm{ref}})。且 u−log⁡u−1≥0u-\log u-1\ge0 恒成立,估计值不会为负;当策略与参考完全一致(u=1u=1)时惩罚恰为 0。该估计量作为独立项从损失中减去。

形态二:奖励内嵌。 把 KL 惩罚折进每个 token 的奖励里,再走组内标准化的老路:

rt′=−βlog⁡πθ(oi,t∣⋅)πref(oi,t∣⋅)r'_t = -\beta\log\frac{\pi_\theta(o_{i,t}\mid\cdot)}{\pi_{\mathrm{ref}}(o_{i,t}\mid\cdot)}

大白话:形态一把 KL 当作损失里的独立正项;形态二把它当作”负奖励”混进打分。两者在数学上不等价,实现中认准自己用的是哪种即可。注意形态二里 KL 进入了奖励,也就参与了组内标准化——一个 token 级信号被折叠成了序列级标量的一部分。

4. 序列平均 vs 批次平均

要点:1/∣yi∣1/\lvert y_i\rvert 让每条回答的贡献先除以自己的长度——序列平均让回答等权,批次平均让 token 等权。区别不在损失值的大小,而在梯度怎么分配。

4.1 两个公式

式 (2) 中的 (1/∣yi∣)∑tℓi,t(1/\lvert y_i\rvert)\sum_t\ell_{i,t} 是序列级平均:先对每条回答内部按 token 数平均,再对 GG 条回答平均:

Lseq=1G∑i=1G(1∣yi∣∑t=1∣yi∣ℓi,t)(6)\mathcal{L}_{\mathrm{seq}}=\frac{1}{G}\sum_{i=1}^{G}\Big(\frac{1}{\lvert y_i\rvert}\sum_{t=1}^{\lvert y_i\rvert}\ell_{i,t}\Big) \tag{6}
(6)

另一种选择是批次级平均:所有 token 一视同仁,分母是整批的 token 总数:

Lbatch=1∑i=1G∣yi∣∑i=1G∑t=1∣yi∣ℓi,t(7)\mathcal{L}_{\mathrm{batch}}=\frac{1}{\sum_{i=1}^{G}\lvert y_i\rvert}\sum_{i=1}^{G}\sum_{t=1}^{\lvert y_i\rvert}\ell_{i,t} \tag{7}
(7)

4.2 区别:等权对象不同

两种归一化的分歧可以浓缩为一句话:序列平均让每条回答平起平坐,批次平均让每个 token 平起平坐。

序列平均先把每条回答的损失除以自己的长度,长回答的每个 token 分摊到的梯度被稀释,短回答的每个 token 被浓缩——于是短回答的单个 token 承受的梯度压力远大于长回答。批次平均则让每个 token 的梯度与它来自哪条回答无关。

4.3 序列平均如何催生长度偏差

这个梯度不对称会被优化器利用。模型要降低损失,有两条路:把 token 写对(难),或把回答写长(易)。

在序列平均下,同一个”犯错 token”混进一条短回答里,它在损失里的权重就大;混进一条长回答里,权重被长度摊薄。于是模型学到:与其冒险写短,不如多写几句把风险稀释。表现为训练中输出长度单调膨胀——这正是 GRPO 序列平均归一化被反复指出的长度偏差。修复方式正是把归一化换成式 (7) 的批次平均(或用固定长度做分母),让每个 token 的风险不再随回答长度缩水。

4.4 一张表总结

序列平均批次平均
分母每条回答自己的 token 数整批 token 总数
等权对象每条回答每个 token
长回答的梯度被稀释(1/∣yi∣1/\lvert y_i\rvert)与 token 数成正比
副作用长度偏差:模型倾向写长长回答主导梯度方向
修复倾向—DAPO 等采用的方向

5. 计算流程:六步配方

  1. 采样:对每个提示用当前策略生成 GG 个回答,记录每个 token 的对数概率;
  2. 打分:规则验证器或奖励模型给每条回答一个标量 rir_i;
  3. 组内标准化:按式 (1) 算 A^i\hat{A}_i(分母加极小常数兜底);
  4. 逐 token 组装:按式 (4) 算 ρi,t\rho_{i,t},按式 (3) 算裁剪项——每个 token 的 token 级因子乘以同一个序列级优势;
  5. 归一化:选择式 (6) 或式 (7) 聚合整批;
  6. 减 KL 项:按 §3 的形态一或形态二加入 KL 约束,交给优化器更新,然后丢弃数据重新采样。

6. 结论

  1. GRPO 的优势是一个序列级标量:奖励在末尾给出、标准化是纯标量运算、下标里没有位置——模型只知道回答整体好不好;
  2. 裁剪项是乘积结构:token 级因子 ρi,t\rho_{i,t} 携带位置信息,序列级因子 A^i\hat{A}_i 决定方向与力度,整条回答被统一缩放;
  3. 由此得到 GRPO 最核心的性质:模型不知道是哪个 token 导致了好结果,好回答的所有 token 同获鼓励、坏回答的所有 token 同受压制,token 级信用分配只能靠跨样本统计涌现——这也是组大小与采样多样性至关重要的原因;
  4. KL 项是整个损失里唯一逐 token 的评估成分,注意它与序列级优势的粒度差异;
  5. 序列平均让回答等权、批次平均让 token 等权:前者把长回答的每个 token 梯度稀释,催生”写长摊薄风险”的长度偏差;后者消除该偏差,代价是长回答主导梯度方向;
  6. 实现时先确认两件事:KL 项用的是无偏估计量还是奖励内嵌,损失用的是序列平均还是批次平均——它们都不等价,且直接影响训练行为。

参考文献

  1. Shao et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300, 2024.
  2. DeepSeek-AI. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning. arXiv:2501.12948, 2025.
  3. Liu et al. Understanding R1-Zero-Like Training: A Critical Perspective. arXiv:2503.20783, 2025.
  4. Yu et al. DAPO: An Open-Source LLM Reinforcement Learning System at Scale. arXiv:2503.14476, 2025.
  5. Schulman et al. Proximal Policy Optimization Algorithms. arXiv:1707.06347, 2017.