Loss 平均:Token、回答与长度权重#

进阶8 分钟阅读查看源文件 ↗

TL;DR#

本页内容7 个部分

Loss 平均:同一批数据,两种长度权重

1. 平均单位为什么重要#

同一批有两条回答,长度分别为 2 和 4。若第一条的 token loss 都是 1,第二条都是 3,对全部 token 平均得到 7/37/3,先在回答内平均再对回答平均却得到 22。数据没有改变,为什么 loss 和训练权重会不同?

将 token 或回答的训练项汇总为一个 loss 时,需要明确平均的单位与范围。回答长度不同时,“每个 token 等权”和“每条回答等权”是两种不同选择。

2. 有效位置与两种平均定义#

本节比较同一批 token loss 的两种聚合配置:(1)将全部有效位置的 loss 相加,再除以 token 总数;(2)先分别计算每条回答内 token loss 的均值,再对回答取平均。聚合分母决定各项的梯度系数,选择不同配置可能改变合成梯度的方向。

第二种配置同时采用回答内平均与回答间平均。“对回答平均”本身只指定外层操作,不规定每条回答的目标内部怎样计算。 例如,RLOO 在回答内对 token score 求和,再对回答平均;它没有逐回答长度分母。

2.1 训练项与有效位置的约定#

设这次汇总包含 NN 条回答,第 ii 条有 Ti>0T_i>0 个有效生成位置,单个位置的 loss 为 ℓi,t(θ)\ell_{i,t}(\theta)。在 PPO 中,它可以是 clipped 目标取负后的 Actor loss;下面不改变这个单项公式,只改变怎样汇总。

TiT_i 按实际参与训练的 mask 计数,排除 prompt 和 padding;本文完整回答计入终止 token。以下比较固定的已采样 batch,长度和 mask 在这次反传中视为常数。

“Batch 平均”仍需说明是对 token 还是回答平均。核对时,可以选定一个 token,把各层平均的分母相乘,计算该训练项的最终系数。

2.2 两条不等长回答的 loss 与权重#

假设同一批只有两条回答,所有位置都有效,单个 token loss 如下:

回答 长度 各 token 的 loss 回答内总和 回答内平均
y1y_1 22 [1,1][1,1] 22 11
y2y_2 44 [3,3,3,3][3,3,3,3] 1212 33

按 token 平均,得到 Ltoken=(2+12)/(2+4)=7/3≈2.333L_{\text{token}}=(2+12)/(2+4)=7/3\approx2.333;按回答平均,则是 Lseq=(1+3)/2=2L_{\text{seq}}=(1+3)/2=2。

各聚合分母对应的训练项权重如下:

比较对象 Token 平均 回答平均
y1y_1 中每个 token 的权重 1/61/6 1/41/4
y2y_2 中每个 token 的权重 1/61/6 1/81/8
y1y_1 的平均 loss 的权重 2/6=1/32/6=1/3 1/21/2
y2y_2 的平均 loss 的权重 4/6=2/34/6=2/3 1/21/2

因此,token 平均使长回答的平均 loss 获得更高权重;回答平均让两条回答的平均 loss 等权。等权不表示它们的 loss 数值相同或梯度向量范数相同。 上面是聚合方式的手算例子,不是训练实验。

2.3 定义两种平均目标#

把所有有效位置的 loss 相加,再除以有效 token 总数:

Ltoken(θ)=∑i=1N∑t=1Tiℓi,t(θ)∑i=1NTi.L_{\text{token}}(\theta)=\frac{\sum_{i=1}^{N}\sum_{t=1}^{T_i}\ell_{i,t}(\theta)}{\sum_{i=1}^{N}T_i}.

每个 token 的权重都是 1/∑iTi1/\sum_iT_i。长回答提供更多项,因此在各回答的平均 loss 之间,权重与长度成正比。

例如,TRL 的 PPO 实现对当前计算批次的 Actor loss 使用带 mask 的整体均值,分母就是该批的有效位置数。[1]

先将第 ii 条回答的 token loss 之和除以该回答的长度 TiT_i,再对 NN 条回答取平均:

Lseq(θ)=1N∑i=1N1Ti∑t=1Tiℓi,t(θ).L_{\text{seq}}(\theta)=\frac1N\sum_{i=1}^{N}\frac1{T_i}\sum_{t=1}^{T_i}\ell_{i,t}(\theta).

每条回答的平均 loss 占 1/N1/N;但该回答内每个 token loss 的聚合系数是 1/(NTi)1/(NT_i),所以短回答的单个 token 权重更大。

两种方法都做了归一化。区别不是“有没有除长度”,而是除以整批的总长度,还是先除以每条回答自己的长度。若所有 Ti=TT_i=T,两式都变成 1/(NT)1/(NT) 乘全部 token loss 之和;长度不等时才显出相对权重的差异。

3. 聚合分母与梯度权重#

3.1 两条回答合成的梯度方向#

仍取长度为 22 和 44 的两条回答。若在当前参数处,它们各自的平均 token 梯度为 (1,0)(1,0) 和 (0,1)(0,1),则 token 平均得到 (1/3,2/3)(1/3,2/3),回答平均得到 (1/2,1/2)(1/2,1/2)。两个向量不平行,区别已经超出整体尺度。

3.2 聚合系数的梯度推导#

固定这批样本,对两种 loss 求导:

∇θLtoken=1∑iTi∑i∑t∇θℓi,t,∇θLseq=1N∑i1Ti∑t∇θℓi,t.\begin{aligned} \nabla_\theta L_{\text{token}} &=\frac1{\sum_iT_i}\sum_i\sum_t\nabla_\theta\ell_{i,t},\\ \nabla_\theta L_{\text{seq}} &=\frac1N\sum_i\frac1{T_i}\sum_t\nabla_\theta\ell_{i,t}. \end{aligned}

第一种给所有 token 梯度乘同一个系数;第二种按各回答的长度分配系数。当长度不等、各回答的梯度又不共线时,相对权重改变就可能改变合成梯度的方向,不能一般地用调整一个学习率抵消。

还可以先在每条回答内求和,只在 batch 上平均,即 Lsum=1N∑i∑tℓi,tL_{\text{sum}}=\frac1N\sum_i\sum_t\ell_{i,t}。对同一固定 batch,有 Ltoken=N∑iTiLsumL_{\text{token}}=\frac{N}{\sum_iT_i}L_{\text{sum}},二者的纯梯度方向相同,只差本批共用的尺度;但这个尺度会随 batch 的平均长度改变。

从整条回答的期望奖励出发,∇θlog⁡πθ(y∣q)\nabla_\theta\log\pi_\theta(y\mid q) 自然展开为 token 梯度之和,没有每条回答自己的 1/Ti1/T_i。REINFORCE 推导了这个形式;再除长度,就是额外的权重选择。

4. 跨批汇总与回答数的尺度换算#

4.1 按有效计数汇总小批次#

沿用长度为 2 和 4、token 平均 loss 分别为 11 和 33 的两条回答。若它们分在两个 microbatch 中,直接把这两个均值平均,得到 22,并不等于合在一起后的 token 均值 7/37/3。

若要保留整个 batch 的 token 平均,就要按各块的有效 token 数加权。 本例的合并 loss 为 Ltoken=(2×1+4×3)/(2+4)=7/3L_{\text{token}}=(2\times1+4\times3)/(2+4)=7/3。梯度累积或多卡汇总时,局部均值、有效 token 数与最后的梯度缩放也要保持同一口径。[2]

4.2 回答级梯度的求和与平均#

以 TailRL 为例,设一组有 KK 条回答,第 ii 条的回答权重为 ωi\omega_i,完整回答的 score 为 zi=∇θlog⁡πθ(yi∣q)z_i=\nabla_\theta\log\pi_\theta(y_i\mid q)。TailRL 未中心化的梯度估计器是 ∑iωizi\sum_i\omega_i z_i。

若实现改为对 KK 条回答取平均,即 1K∑iA^izi\frac1K\sum_i\hat A_i z_i,应令 A^i=Kωi\hat A_i=K\omega_i,才能保留相同的梯度估计。中心化时,先定义组均值 ωˉ=(1/K)∑iωi\bar\omega=(1/K)\sum_i\omega_i,再在回答平均中使用 A^i=K(ωi−ωˉ)\hat A_i=K(\omega_i-\bar\omega)。

沿用 TailRL 的三条回答算例,中心化权重为 [−1/3,−1/12,5/12][-1/3,-1/12,5/12],均值形式应使用 [−1,−1/4,5/4][-1,-1/4,5/4]。

乘以 KK 只补偿回答平均引入的分母。TailRL 的同组均值中心化还会把对应有限阶目标从 KK 阶变为 K−1K-1 阶;这一目标变化由 TailRL 的有限组推导说明。

5. 聚合选择与方法对照#

5.1 与 Advantage 归一化的分工#

这两步作用在不同对象上:

  1. Advantage 归一化:先对更新权重 A^\hat A 减均值、除标准差,再用它构造各 token 的 loss。
  2. Loss 平均:单个 token 的 loss 已经确定,再决定用 token 数还是回答数及各自长度来汇总。

两步可以组合,但应分别记录。Loss 已经求平均,并不要求 return、任务评分或 advantage 再除一次长度;额外除法会再次改变权重。

5.2 训练项与聚合范围的比较条件#

PPO 中的 E^t\widehat{\mathbb E}_t 表示采样位置上的经验平均。固定长度采样段下,多种聚合表达式可能相同。[3]

LLM 回答长度可变时,就应展开这个平均的分母。比较两种方法,先对齐有效位置、回答权重和汇总范围,再讨论梯度差异。同一种 PPO clipped 目标可以采用两种聚合,算法名不能代替配置说明。

如果联合使用 Actor、Critic 或单独的 KL loss,还要分别写清它们怎样平均;只改变其中一项的聚合,可能同时改变这些项之间的相对强度。

5.3 各方法采用的聚合配置#

各方法页采用的聚合配置如下:

方法与配置 Loss 怎样聚合 还需分别说明什么
PPO(本站示例) 计算批次内有效 token 平均 Mask 与汇总范围;不能把该配置泛化到所有 PPO
REINFORCE++ 先回答内平均,再对回答平均 Return 的全局归一化与 loss 的回答平均是不同操作
RLOO 回答内 token score 求和,再对回答平均 加入逐回答长度平均会改变原序列级梯度
GRPO(原始目标) 先回答内平均,再对组内回答平均;实际还对问题平均 组内 Advantage 标准化与回答长度权重分别产生影响
Dr. GRPO token 求和,除以回答数乘共同常数 共同常数与每条回答自己的长度不同;去标准差是另一项修改
DAPO 保留组内按有效 token 平均 跨题、microbatch 与多卡的计数仍需展开;动态采样另外改变数据
GSPO 回答目标平均;几何平均 ratio 的求导带来 1/Ti1/T_i 长度已进入 ratio,不能据此推断没有长度权重
ReCo 回答内平均,再组内平均 回答似然权重、方差比和 loss 分母是三层不同权重
ERPO 任务项乘题目权重;Query 惩罚在问题 token mask 上单独聚合 静态 reference 权重与动态 current 权重分开;内部 Actor 仍沿用所选更新器
SRPO 单轨迹目标对有效 token 平均 轨迹内教师/old 对数概率差的中心化与 loss 平均分开;跨题汇总另行声明
TailRL 原始估计器对回答 score 加权求和 若改成回答平均,应将权重乘组大小;逐回答再除长度会另改目标
ARPO(默认数学目标) 轨迹内有效模型 token 平均,再对完整轨迹平均 共享前缀仍计入各轨迹,长度分母影响分支信号的合成
PivotRL(回合级数学目标) 对局部动作组平均,再对选中状态平均;动作概率内部为 token 概率乘积 完整动作 ratio 未取长度次方根;逐 token surrogate 与长度平均若另加,须单列
DPO(原始目标) 回答内 log 概率求和,两条回答构造一个 loss,再对偏好对平均 不先除逐回答长度;sigmoid 作用在两回答分差上,不是独立 token loss 的平均

DPO 的平均单位是一对回答。要先得到完整回答的分差,再经过 sigmoid 与负 log;把各 token 分别算 loss 后平均,通常不能得到同一个结果。

单独的 KL loss 也要注明自己的聚合范围;k2k_2、k3k_3 描述采样表达式,不能仅凭这个名称推断 loss 的平均分母。比较完整训练目标时,要同时对齐任务项与正则项的权重。

参考资料#

  1. TRL PPO(v0.26.0). 原文:指定计算批次的 masked mean。
  2. Fixing Gradient Accumulation(Hugging Face). 原文:有效 token 数不同的局部均值怎样汇总。
  3. PPO(2017). 原文:Clipping、经验目标与 Actor–Critic。