【RL】DAPO 详解1.0

首先把论文中的公式 (5) 原封不动地写出来(为便于阅读我做了排版整理):
JGRPO(θ)=E(q,a)∼D,  {oi}i=1G∼πθold(⋅∣q)[1G∑i=1G1∣oi∣∑t=1∣oi∣min⁡ ⁣(ri,t(θ) A^i,t,  clip⁡(ri,t(θ), 1−ϵ, 1+ϵ) A^i,t)  −  β DKL(πθ∥πref)]. J_{\text{GRPO}}(\theta) = \mathbb{E}{(q,a)\sim\mathcal{D},\;\{o_i\}{i=1}^G\sim\pi_{\theta_{\text{old}}}(\cdot\mid q)}\Bigg[ \frac{1}{G}\sum_{i=1}^G\frac{1}{|o_i|}\sum_{t=1}^{|o_i|} \min\!\Big(r_{i,t}(\theta)\,\hat A_{i,t},\; \operatorname{clip}\big(r_{i,t}(\theta),\,1-\epsilon,\,1+\epsilon\big)\,\hat A_{i,t}\Big) \;-\; \beta\,D_{\mathrm{KL}}(\pi_\theta\Vert\pi_{\mathrm{ref}}) \Bigg]. JGRPO(θ)=E(q,a)∼D,{oi}i=1G∼πθold(⋅∣q)[G1i=1∑G∣oi∣1t=1∑∣oi∣min(ri,t(θ)A^i,t,clip(ri,t(θ),1−ϵ,1+ϵ)A^i,t)−βDKL(πθ∥πref)].

下面逐项详细解释这个式子的每一部分、直觉与实现注意点。

  1. 外层期望和采样机制
  • 公式中的期望符号 E(q,a)∼D,  {oi}∼πθold[⋅]\mathbb{E}{(q,a)\sim\mathcal{D},\;\{o_i\}\sim\pi{\theta_{\text{old}}}}[\cdot]E(q,a)∼D,{oi}∼πθold[⋅] 表示:先从数据分布 D\mathcal{D}D 采一个题目-答案对 (q,a)(q,a)(q,a),再用旧策略 πθold\pi_{\theta_{\text{old}}}πθold 针对该 qqq 采样一组 GGG 条候选回复 {oi}i=1G\{o_i\}_{i=1}^G{oi}i=1G,最后对所有这样的采样取平均。
  • 直观上这是 group-wise 的更新:每次更新基于「一个问题 + 该问题下的一组候选回复」来计算梯度。
  1. 重要性比 ri,t(θ)r_{i,t}(\theta)ri,t(θ) 的含义(公式中被多次使用)
  • 对第 iii 条生成的第 ttt 个 token,重要性采样比定义为:
    ri,t(θ)=πθ(oi,t∣q,oi,<t)πθold(oi,t∣q,oi,<t). r_{i,t}(\theta)=\frac{\pi_{\theta}(o_{i,t}\mid q,o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t}\mid q,o_{i,<t})}. ri,t(θ)=πθold(oi,t∣q,oi,<t)πθ(oi,t∣q,oi,<t).
  • 直观:ri,t>1r_{i,t}>1ri,t>1 表示当前策略相对于旧策略提升了该 token 的概率,ri,t<1r_{i,t}<1ri,t<1 则表示降低了该 token 的概率。
  1. 优势项 A^i,t\hat A_{i,t}A^i,t(GRPO 的组内归一化优势)
  • GRPO 把每条完整回复取一个标量奖励 RiR_iRi,然后在组内归一化得到优势(参见公式 (4)):
    A^i,t=Ri−mean⁡({Rj}j=1G)std⁡({Rj}j=1G). \hat A_{i,t}=\frac{R_i-\operatorname{mean}(\{R_j\}{j=1}^G)}{\operatorname{std}(\{R_j\}{j=1}^G)}. A^i,t=std({Rj}j=1G)Ri−mean({Rj}j=1G).
  • 注意:在该定义下,同一条回复的所有 token 的 A^i,t\hat A_{i,t}A^i,t 值是相同的(因为奖励是对整条回复给出的)。
  • 直观:组内归一化把 reward 转换为相对评分,强调「相比于本组其他回复,该回复好/坏多少」,可以减少全局偏移与尺度影响。
  1. 内部的 surrogate 与裁剪(min 与 clip 的意义)
  • 每个 token 的代理目标(surrogate)由两个值取最小:未裁剪的 ri,tA^i,tr_{i,t}\hat A_{i,t}ri,tA^i,t 和裁剪后的 clip⁡(ri,t,1−ϵ,1+ϵ)A^i,t\operatorname{clip}(r_{i,t},1-\epsilon,1+\epsilon)\hat A_{i,t}clip(ri,t,1−ϵ,1+ϵ)A^i,t,即
    min⁡ ⁣(ri,tA^i,t,  clip⁡(ri,t,1−ϵ,1+ϵ)A^i,t). \min\!\Big(r_{i,t}\hat A_{i,t},\; \operatorname{clip}(r_{i,t},1-\epsilon,1+\epsilon)\hat A_{i,t}\Big). min(ri,tA^i,t,clip(ri,t,1−ϵ,1+ϵ)A^i,t).
  • 直观:当 ri,tr_{i,t}ri,t 不超出区间 [1−ϵ,1+ϵ][1-\epsilon,1+\epsilon][1−ϵ,1+ϵ] 时两者相等;当 ri,tr_{i,t}ri,t 超界时用裁剪值代替,以限制一次更新中 ri,tr_{i,t}ri,t 对目标的影响(提升训练稳定性并实现"trust region"风格的约束)。
  1. 为什么要把 token 内部先求平均再对样本求平均(公式中的 1∣oi∣\frac{1}{|o_i|}∣oi∣1 与 1G\frac{1}{G}G1)
  • 公式中对每条回复先做 1∣oi∣∑t=1∣oi∣(⋯ )\frac{1}{|o_i|}\sum_{t=1}^{|o_i|}(\cdots)∣oi∣1∑t=1∣oi∣(⋯),即先对该回复内所有 token 的 surrogate 求平均,然后再对 i=1..Gi=1..Gi=1..G 做 1G∑i(⋅)\frac{1}{G}\sum_i(\cdot)G1∑i(⋅) 平均。
  • 直观含义:每条回复在最终 loss 中"被赋予相同的权重",无论其长度 ∣oi∣|o_i|∣oi∣ 是长还是短。
  • 后果:这会导致长回复中每个 token 的贡献在整体上被稀释(因为长回复内 token 的 surrogate 被平均后降权),从而可能弱化从长链式推理中学到丰富模式的能力;这正是论文后来指出的样本级损失带来的问题,也是 DAPO 提出 token-level loss 的动因之一。
  1. KL 惩罚项 −βDKL(πθ∥πref)-\beta D_{\mathrm{KL}}(\pi_\theta\Vert\pi_{\mathrm{ref}})−βDKL(πθ∥πref) 的作用
  • 公式中的项 −βDKL(πθ∥πref)-\beta D_{\mathrm{KL}}(\pi_\theta\Vert\pi_{\mathrm{ref}})−βDKL(πθ∥πref) 用负号与前面 surrogate 相减,等价于在优化时对 KL 发出惩罚,系数为 β\betaβ。
  • 直观:该项限制在线策略 πθ\pi_\thetaπθ 不要偏离参考策略 πref\pi_{\mathrm{ref}}πref(常见做法是把 πref\pi_{\mathrm{ref}}πref 设为旧策略 πθold\pi_{\theta_{\text{old}}}πθold 或某个 frozen 的 reference),以避免策略走得太远导致畸变或训练发散。
  • 论文中后面提出去掉 KL 的理由是:在 long-CoT 场景下策略需要较大尺度的变化以获得新机制,KL 过强会抑制这种必要的演化。
  1. 把这些东西组合在一起的直觉
  • 整个 JGRPO(θ)J_{\text{GRPO}}(\theta)JGRPO(θ) 目标是在组-样本-token 三级结构上,用重要性采样把旧策略下采样的数据作为估计样本,通过组内归一化优势来构造学习信号,用裁剪 surrogate 抑制单步过大更新,并用 KL 惩罚来控制策略漂移。
  • GRPO 的设计目标是把样本组内的相对优劣信息用来进行策略改进,但它在对 token 权重的处理上(即先对 token 平均再对样本平均)带来了对长样本的不利偏差,这在 long-CoT 场景下会显现为学习效率和质量问题。
  1. 实现细节与数值稳定性建议
  • 在采样时保存旧策略的对数概率 log⁡πθold(oi,t∣⋅)\log\pi_{\theta_{\text{old}}}(o_{i,t}\mid\cdot)logπθold(oi,t∣⋅),训练时用当前策略重算 log⁡πθ(oi,t∣⋅)\log\pi_{\theta}(o_{i,t}\mid\cdot)logπθ(oi,t∣⋅),并用
    ri,t=exp⁡(log⁡πθ−log⁡πθold) r_{i,t}=\exp\big(\log\pi_{\theta}-\log\pi_{\theta_{\text{old}}}\big) ri,t=exp(logπθ−logπθold)
    来计算以提高数值稳定性。
  • 计算组内标准差 std⁡({Rj})\operatorname{std}(\{R_j\})std({Rj}) 时要添加小常数 ε\varepsilonε 以避免除零;若某组的标准差非常小(表明组内 reward 几乎相同),对应的 advantage 会很不稳定,可考虑跳过或调整。
  • 对 padding token 要做 mask,避免把 padding 的 log-prob / surrogate 计入 loss。
  • KL 项的计算与梯度回传需要注意效率与数值(通常用分批估计或近似),并合理选择 β\betaβ 以达到稳健性与灵活性的平衡。
  1. 一个简单的数值示例(说明裁剪的效果与样本平均方式)
  • 假设某组 G=2G=2G=2,第 1 条回复长度 ∣o1∣=4|o_1|=4∣o1∣=4,第 2 条长度 ∣o2∣=1|o_2|=1∣o2∣=1。若第 1 条的每个 token 的未裁剪 surrogate 为 2.02.02.0(每 token),第 2 条那唯一 token 的 surrogate 为 6.06.06.0,则按公式先对每条回复平均得:第 1 条平均为 2.02.02.0,第 2 条平均为 6.06.06.0,再取两条的均值得到 (2.0+6.0)/2=4.0(2.0+6.0)/2=4.0(2.0+6.0)/2=4.0。
  • 但如果改为 token-level 直接平均(即把所有 token 展平再平均),总 token 数为 4+1=54+1=54+1=5,平均为 (2∗4+6)/5=(8+6)/5=2.8(2*4+6)/5=(8+6)/5=2.8(2∗4+6)/5=(8+6)/5=2.8,与上面 4.04.04.0 有明显不同,说明"先按 sample 平均再按样本平均"会增强短样本对最终目标的影响(在本例中短样本贡献更大),这正是 GRPO 的样本级归一可能导致的偏差。
  1. GRPO 与 DAPO 的对比要点(帮助理解公式 (5) 的局限)
  • GRPO 的优点:通过组内归一化直接比较同一 prompt 下的多条回复,避免全局 reward scale 的问题;用了 PPO-like 的裁剪 surrogate 增强稳定性,并加 KL 控制策略漂移。
  • GRPO 的缺点(论文指出并由 DAPO 改进):样本级平均会弱化长回复的 token 影响;对称裁剪上界可能限制对低概率探索 token 的放大;当组内全部正确或全部错误时 advantage 退化成 0 导致梯度信号消失(需要动态采样过滤)。DAPO 针对这些点提出了 token-level loss、Clip-Higher(非对称裁剪)和 Dynamic Sampling 等改进。

如果你希望,我可以继续:

  • 给出基于公式 (5) 的 PyTorch 风格伪代码实现(含 log-prob 缓存、组内归一化、sample-level 平均实现);或
  • 把 GRPO 的 sample-level averaging 与 DAPO 的 token-level averaging 用一张示意图比较;或
  • 针对公式 (5) 中的 KL 项 DKL(πθ∥πref)D_{\mathrm{KL}}(\pi_\theta\Vert\pi_{\mathrm{ref}})DKL(πθ∥πref) 给出具体可计算的近似实现(例如如何估计、如何反向传播)。

你想看哪个?

好,下面把"先对每个样本内的 token 求平均再在样本间求平均,会增强短样本影响"的原因用代数严格说明并用数值例子直观演示。为保证清晰,含公式的句子我都用 LaTeX 写出。

  1. 用符号表述两种平均的定义
  • 记一组有 GGG 个样本,第 iii 个样本长度为 ∣oi∣|o_i|∣oi∣,其在第 ttt 个 token 的 surrogate 值为 si,ts_{i,t}si,t。则样本级先内平均再外平均(GRPO 风格)的值为:
    SampleAvg=1G∑i=1G1∣oi∣∑t=1∣oi∣si,t. \text{SampleAvg}=\frac{1}{G}\sum_{i=1}^G\frac{1}{|o_i|}\sum_{t=1}^{|o_i|} s_{i,t}. SampleAvg=G1i=1∑G∣oi∣1t=1∑∣oi∣si,t.
  • Token 级直接展平再平均(DAPO 的 token-level)的值为:
    TokenAvg=1P∑i=1G∑t=1∣oi∣si,t, \text{TokenAvg}=\frac{1}{P}\sum_{i=1}^G\sum_{t=1}^{|o_i|} s_{i,t}, TokenAvg=P1i=1∑Gt=1∑∣oi∣si,t,
    其中 P=∑i=1G∣oi∣P=\sum_{i=1}^G|o_i|P=i=1∑G∣oi∣ 是总 token 数。
  1. 看每个 token 在最终平均中实际得到的"权重"
  • 在 SampleAvg 中,第 iii 个样本的每个 token 的权重是:
    wi,per-token(sample)=1G⋅1∣oi∣. w^{\text{(sample)}}_{i,\text{per-token}}=\frac{1}{G}\cdot\frac{1}{|o_i|}. wi,per-token(sample)=G1⋅∣oi∣1.
  • 在 TokenAvg 中,每个 token 的权重是:
    wi,per-token(token)=1P. w^{\text{(token)}}_{i,\text{per-token}}=\frac{1}{P}. wi,per-token(token)=P1.
  1. 比较两者的比值(说明短样本为何被放大)
  • 计算比值:
    wi,per-token(sample)wi,per-token(token)=1G⋅1∣oi∣1P=PG ∣oi∣. \frac{w^{\text{(sample)}}{i,\text{per-token}}}{w^{\text{(token)}}{i,\text{per-token}}} =\frac{\frac{1}{G}\cdot\frac{1}{|o_i|}}{\frac{1}{P}} =\frac{P}{G\,|o_i|}. wi,per-token(token)wi,per-token(sample)=P1G1⋅∣oi∣1=G∣oi∣P.
  • 令组内平均长度为 Lˉ=PG.\bar L=\frac{P}{G}.Lˉ=GP. 则比值为:
    wi,per-token(sample)wi,per-token(token)=Lˉ∣oi∣. \frac{w^{\text{(sample)}}{i,\text{per-token}}}{w^{\text{(token)}}{i,\text{per-token}}}=\frac{\bar L}{|o_i|}. wi,per-token(token)wi,per-token(sample)=∣oi∣Lˉ.
  • 由上可见:若第 iii 个样本比平均长度短(即 ∣oi∣<Lˉ|o_i|<\bar L∣oi∣<Lˉ),则比值 >1>1>1,即该样本的每个 token 在 SampleAvg 中比在 TokenAvg 中得到更大的權重;反之若样本比平均长,则每个 token 权重被压缩(比值 <1<1<1)。
  1. 用具体数值例子直观演示
  • 设 G=2G=2G=2,样本长度为 ∣o1∣=4, ∣o2∣=1|o_1|=4,\ |o_2|=1∣o1∣=4, ∣o2∣=1,总 token 数 P=5P=5P=5,组平均长度 Lˉ=P/G=5/2=2.5.\bar L=P/G=5/2=2.5.Lˉ=P/G=5/2=2.5.
  • 设第 1 条每个 token 的 surrogate 都是 s1,t=2s_{1,t}=2s1,t=2,第 2 条唯一 token 的 surrogate 为 s2,1=6s_{2,1}=6s2,1=6。
  • 计算 SampleAvg:
    SampleAvg=12(2+2+2+24+61)=12(2+6)=4. \text{SampleAvg}=\frac{1}{2}\Big(\frac{2+2+2+2}{4}+\frac{6}{1}\Big)=\frac{1}{2}(2+6)=4. SampleAvg=21(42+2+2+2+16)=21(2+6)=4.
  • 计算 TokenAvg:
    TokenAvg=15(2+2+2+2+6)=145=2.8. \text{TokenAvg}=\frac{1}{5}(2+2+2+2+6)=\frac{14}{5}=2.8. TokenAvg=51(2+2+2+2+6)=514=2.8.
  • 解释:在 SampleAvg 中,短样本(长度 1)占了 50% 的"样本份额",因此其唯一 token 的大值 6 对最终结果影响很大;而在 TokenAvg 中,短样本只占全部 token 的 1/51/51/5,所以影响小得多。
  1. 直观结论与对 long‑CoT 的影响
  • 结论:SampleAvg(先对每个样本内平均再对样本平均)会给每个样本"等权"地贡献一次平均值,从而使得短样本的每个 token 在总体上被放大到比长样本 token 更高的相对重要性。用公式语言:第 iii 个样本每个 token 在 SampleAvg 中的相对放大系数为 Lˉ∣oi∣.\dfrac{\bar L}{|o_i|}.∣oi∣Lˉ.
  • 在 long‑CoT 场景(有很多长推理链的样本)这会产生偏差:短但高分的样本会被过度强化,而包含丰富推理路径的长样本(每 token 实际贡献可能很重要)反而被稀释,导致模型难以学到长链式推理的细粒度模式。这也是论文提出 token-level loss 的主要动机之一。
  1. 实践建议(基于上述理解)
  • 如果希望让每个 token 的学习信号均等,避免偏向短样本,应采用 TokenAvg(即将所有 token 展平后统一平均或按 token 求和再归一)。
  • 若确实希望每条样本有相同的"样本级"影响(例如每道题目都应贡献相同权重,不论模型生成长度),则 SampleAvg 是合适的,但需意识到它会放大短样本的每-token 影响。
  • 在实现中也可以用混合策略(例如先按 token 求和再做某种样本级归一)或对样本长度做 clipped weighting,以折中两者的优点。

如果你愿意,我可以:

  • 给出对应的 PyTorch / NumPy 代码片段来展示两种平均的具体实现与数值对比;或
  • 用图(例如条形图或权重热力图)可视化两种方法对每个 token 权重的差异。你更需要哪种补充?

我理解你是想"先将公式 (6) 写出来并说明/处理它"。我先把公式 (6) 以规范的 LaTeX 形式写出,随后逐行解释含义、数值实现(包括数值稳定性建议)和一个简单数值例子;最后给出可直接用到训练/实现中的伪代码片段。若你要的是别的(比如推导或在 DAPO 中的具体用途),告诉我我再接着做。

  1. 把公式 (6) 规范地写出:
    ri,t(θ)=πθ(oi,t∣q, oi,<t)πθold(oi,t∣q, oi,<t). r_{i,t}(\theta)=\frac{\pi_{\theta}\big(o_{i,t}\mid q,\,o_{i,<t}\big)}{\pi_{\theta_{\text{old}}}\big(o_{i,t}\mid q,\,o_{i,<t}\big)}. ri,t(θ)=πθold(oi,t∣q,oi,<t)πθ(oi,t∣q,oi,<t).

  2. 符号解释(逐项):

  • ri,t(θ)r_{i,t}(\theta)ri,t(θ) 表示第 iii 个样本(组内第 iii 条生成)在时间步 ttt 的重要性采样比(importance ratio)。
  • πθ(oi,t∣q, oi,<t)\pi_{\theta}\big(o_{i,t}\mid q,\,o_{i,<t}\big)πθ(oi,t∣q,oi,<t) 是当前(online)策略参数 θ\thetaθ 在给定题目 qqq 及此前生成前缀 oi,<to_{i,<t}oi,<t 条件下,生成 token oi,to_{i,t}oi,t 的条件概率。
  • πθold(oi,t∣q, oi,<t)\pi_{\theta_{\text{old}}}\big(o_{i,t}\mid q,\,o_{i,<t}\big)πθold(oi,t∣q,oi,<t) 是采样该 token 时使用的旧策略(policy) θold\theta_{\text{old}}θold 对应的条件概率。
  • 直观上,ri,t>1r_{i,t}>1ri,t>1 表示新策略相对旧策略把该 token 的概率提高了;ri,t<1r_{i,t}<1ri,t<1 表示新策略降低了该 token 的概率。
  1. 实际实现(数值稳定与常用写法)
  • 通常我们在采样时会保存旧策略的对数概率 log⁡πθold(oi,t∣⋅)\log \pi_{\theta_{\text{old}}}(o_{i,t}\mid\cdot)logπθold(oi,t∣⋅),然后在计算时用当前策略重新计算 log⁡πθ(oi,t∣⋅)\log \pi_{\theta}(o_{i,t}\mid\cdot)logπθ(oi,t∣⋅),最后用对数差来得到 ri,tr_{i,t}ri,t:
    ri,t(θ)=exp⁡(log⁡πθ(oi,t∣q, oi,<t)−log⁡πθold(oi,t∣q, oi,<t)). r_{i,t}(\theta)=\exp\Big(\log \pi_{\theta}\big(o_{i,t}\mid q,\,o_{i,<t}\big)-\log \pi_{\theta_{\text{old}}}\big(o_{i,t}\mid q,\,o_{i,<t}\big)\Big). ri,t(θ)=exp(logπθ(oi,t∣q,oi,<t)−logπθold(oi,t∣q,oi,<t)).
  • 这样做可以避免直接用概率相除带来的数值下溢问题(尤其当概率非常小的时候)。
  • 为防止极端比值导致数值不稳或梯度爆发,通常在后续步骤会对 ri,tr_{i,t}ri,t 进行裁剪(clamp)或在对数差上做截断(例如:限制对数比在一个范围内),但裁剪通常在 surrogate 目标中完成。
  1. 简单数值例子(直观)
  • 若旧策略概率为 πθold=0.01\pi_{\theta_{\text{old}}}=0.01πθold=0.01,当前策略概率为 πθ=0.02\pi_{\theta}=0.02πθ=0.02,则
    r=0.020.01=2.0, r=\frac{0.02}{0.01}=2.0, r=0.010.02=2.0,
    即新策略相对旧策略将该 token 的概率放大了 2 倍。
  • 若用对数形式:log⁡r=log⁡0.02−log⁡0.01≈−3.9120−(−4.6052)=0.6931\log r=\log 0.02 - \log 0.01 \approx -3.9120 -(-4.6052)=0.6931logr=log0.02−log0.01≈−3.9120−(−4.6052)=0.6931,然后 exp⁡(0.6931)=2.0\exp(0.6931)=2.0exp(0.6931)=2.0。
  1. PyTorch 风格的伪代码(关键步骤,注意对含数学符号的行我用 LaTeX 描述)
  • 说明:假设在采样阶段已经保存了旧策略的对数概率数组 {log⁡pi,told}\{\log p^{\text{old}}{i,t}\}{logpi,told},在训练阶段我们用当前策略计算新的对数概率 {log⁡pi,tnew}\{\log p^{\text{new}}{i,t}\}{logpi,tnew},然后得到 rrr 并传入 surrogate 计算。

    伪代码说明(非严格 python 语法)

    已有:logp_old[i,t] # 采样时保存的 log prob under θ_old

    在训练时用当前模型给出 logp_new[i,t]

    计算对数比并得到 r_{i,t}

    log_r = logp_new - logp_old # 对应 LaTeX: \log r_{i,t} = \log \pi_\theta - \log \pi_{\theta_{old}}
    r = exp(log_r) # r_{i,t} = \exp(\log r_{i,t})

    (可选)为数值稳定在使用 r 前可以 clamp 或在对数域限制:

    log_r = clamp(log_r, min_log_r, max_log_r)
    r = exp(log_r)

  1. 与后续 surrogate 的衔接(为什么要算 ri,tr_{i,t}ri,t)
  • 计算 ri,tr_{i,t}ri,t 的目的是为了把在旧策略下采样的数据当作样本来估计新策略下的期望,从而构造可计算的 surrogate 目标(例如 ri,tA^i,tr_{i,t}\hat A_{i,t}ri,tA^i,t 或裁剪后的 min⁡(⋯ )\min(\cdots)min(⋯))。
  • 因为实际梯度需要基于当前策略更新,ri,tr_{i,t}ri,t 起到把旧样本"重新权重"为当前策略分布的桥梁作用(importance sampling)。
  1. 数值稳定与工程细节提示
  • 保存旧策略时尽量保存对数概率 log⁡πθold\log \pi_{\theta_{\text{old}}}logπθold 而不是概率 πθold\pi_{\theta_{\text{old}}}πθold。
  • 在计算标准差 σ\sigmaσ 或归一化时加小常数 ε\varepsilonε 防止除零(例如 σ←max⁡(σ,ε)\sigma \leftarrow \max(\sigma, \varepsilon)σ←max(σ,ε))。
  • 长序列 / padding:在 token 级别计算 ri,tr_{i,t}ri,t 时要 mask 掉 padding 位以避免把 padding token 的概率计入损失。
  • 若使用 mixed-precision,注意 exp(log_r) 可能上溢至 inf,当对数差很大时可在对数域直接处理或先 clamp。

如果你希望,我可以接着做以下任一项(你选其一或多项):

  • 把基于 ri,tr_{i,t}ri,t 的 surrogate(即公式 (8) 中的 token-level clipped surrogate)完整写出并给出计算伪代码;或
  • 给出一个完整的 PyTorch 代码片段,展示如何在训练循环中缓存旧 log-prob、重算新 log-prob、计算 rrr 并构造 loss;或
  • 针对数值稳定性给更详细的工程实现技巧(例如对数域截断策略、clamp 的具体阈值选择建议等)。

你想继续哪一项?

好的------先给出"surrogate"的核心公式,再逐条解释它在 PPO/DAPO 里的含义、为什么要"求 surrogate 再求和",以及实现时的直觉与注意点。我把每个包含公式的句子用 LaTeX 写清楚。

  1. 什么是 surrogate(代理目标)
  • 原始的策略梯度的无约束形式(importance-sampled policy gradient surrogate)在单步 ttt 上通常写作:
    LtPG(θ)=rt(θ) A^t,L^{\text{PG}}t(\theta)=r_t(\theta)\,\hat A_t,LtPG(θ)=rt(θ)A^t,
    这里 rt(θ)=πθ(at∣st)πθold(at∣st)r_t(\theta)=\dfrac{\pi
    \theta(a_t\mid s_t)}{\pi_{\theta_{\text{old}}}(a_t\mid s_t)}rt(θ)=πθold(at∣st)πθ(at∣st),A^t\hat A_tA^t 是优势估计。
  • 这就是所谓的"surrogate"------它不是直接最大化真实的期望回报 J(θ)=Eτ∼πθ[R(τ)]J(\theta)=\mathbb{E}{\tau\sim\pi\theta}[R(\tau)]J(θ)=Eτ∼πθ[R(τ)],而是用可计算的、基于旧策略样本和重要性权重的近似目标作为"代理"(proxy)来更新策略。
  1. 为什么要用 surrogate 而不是直接最大化真实回报
  • 真实目标 J(θ)=Eτ∼πθ[R(τ)]J(\theta)=\mathbb{E}{\tau\sim\pi\theta}[R(\tau)]J(θ)=Eτ∼πθ[R(τ)] 难以直接估计和优化,所以我们用在旧策略下采样并通过重要性采样权重 rt(θ)r_t(\theta)rt(θ) 将梯度估计转为可计算的 surrogate。
  • 直观上,LtPG(θ)L^{\text{PG}}_t(\theta)LtPG(θ) 告诉我们"如果把当前动作的概率按比例放大 rtr_trt,会带来多少相对的收益(A^t\hat A_tA^t)",因此可以用它作为优化信号。
  1. PPO 中为什么要做裁剪并取 min(即 clipped surrogate)
  • PPO 的裁剪 surrogate 在单步形式写作:
    LtCLIP(θ)=min⁡ ⁣(rt(θ) A^t,  clip⁡(rt(θ),1−ϵ,1+ϵ) A^t). L^{\text{CLIP}}_t(\theta)=\min\!\Big(r_t(\theta)\,\hat A_t,\;\operatorname{clip}(r_t(\theta),1-\epsilon,1+\epsilon)\,\hat A_t\Big). LtCLIP(θ)=min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t).
    取 min 的目的是:当 rtr_trt 超出安全区间 [1−ϵ,1+ϵ][1-\epsilon,1+\epsilon][1−ϵ,1+ϵ] 时,用被裁剪的保守值替代原始值,从而防止一次更新把策略改动得过大(提高训练稳定性)。
  1. 在 DAPO / token-level 中的 surrogate 与"再求和"的含义
  • 在 token 级别,论文把每个 token 的 surrogate 都算上并汇总,目标可以写成(示意):
    J(θ)=E[∑tLtCLIP(θ)], J(\theta)=\mathbb{E}\Big[\sum_{t} L^{\text{CLIP}}_t(\theta)\Big], J(θ)=E[t∑LtCLIP(θ)],
    这里的求和是对序列中所有 token(或对一组样本中所有 token)逐步累积 surrogate。
  • 直观地讲,"求 surrogate 再求和"就是把每个 token 的貢獻都看作一项小的代理目标,然后把它们加起来得到整条序列或整个 batch 的代理目标,这样长序列里的每个 token 都能产生梯度贡献(token-level credit assignment)。
  1. 为什么要对 token 求和/平均(与 sample-level 的区别)
  • 如果按 sample 平均(即先对一条序列内的 token 求平均,再把每条序列再平均),长度较长的序列每个 token 的权重会变小;而按 token 级别直接求和/平均,则长序列拥有更多的梯度条目,从而能更强烈地影响更新,这在 long-CoT 场景下有利于把复杂的长推理路径强化出来。
  • 实际实现中常把总和除以 token 总数做归一化以得到均值,这样不同 batch 之间尺度可比。
  1. 裁剪与优势符号的交互(直观行为)
  • 当 A^t>0\hat A_t>0A^t>0 时,目标希望增大该 token 的概率,如果 rtr_trt 很大(新策略已大幅提高该 token 的概率),裁剪会把上升信号限制为 (1+ϵ)A^t(1+\epsilon)\hat A_t(1+ϵ)A^t,防止过冲。
  • 当 A^t<0\hat A_t<0A^t<0 时,目标希望降低该 token 的概率,裁剪下界 1−ϵ1-\epsilon1−ϵ 则防止把概率压得过低(避免过快丧失多样性)。
  1. 简短数值例子(帮助理解"取 min 后再求和"的效果)
  • 假设某 token 的优势 A^t=2\hat A_t=2A^t=2 且 rt=2r_t=2rt=2 并取 ϵ=0.2\epsilon=0.2ϵ=0.2,则未裁剪项为 rtA^t=4r_t\hat A_t=4rtA^t=4,裁剪后为 (1+ϵ)A^t=1.2×2=2.4(1+\epsilon)\hat A_t=1.2\times 2=2.4(1+ϵ)A^t=1.2×2=2.4,因此 LtCLIP(θ)=min⁡(4,2.4)=2.4L^{\text{CLIP}}_t(\theta)=\min(4,2.4)=2.4LtCLIP(θ)=min(4,2.4)=2.4。把所有 token 的类似贡献相加或平均后就是 batch 的代理目标(policy loss 的负号再用于反向更新)。
  1. 实现要点(工程注意)
  • 需要保存采样时的 log-prob(或概率)作为 πθold\pi_{\theta_{\text{old}}}πθold 的基准,然后用当前策略重算 log-prob 得到 rtr_trt。
  • 对组/批次里 reward 做恰当归一(比如组内均值/标准差)能稳定 A^t\hat A_tA^t 的尺度。
  • 计算 token 级别 surrogate 会增加计算和内存开销,注意批处理和 mask padding 的处理。
  • 计算标准差时要加小常数防止除以 0。

總结一句话:surrogate 就是用可计算的、基于旧策略样本和优势估计的代理目标(例如 LtPG=rtA^tL^{\text{PG}}_t=r_t\hat A_tLtPG=rtA^t),PPO 用裁剪后的 surrogate(LtCLIPL^{\text{CLIP}}_tLtCLIP)来限制每步更新幅度;在 DAPO 中把这个 surrogate 扩展到 token 级别并逐 token 求和,从而把长链式推理中每个 token 的贡献都纳入更新。

如果你想,我可以把"求 surrogate 再求和"的完整伪代码(含 log-prob 缓存、mask、归一化)给出成 PyTorch 风格的片段,你想要代码版还是再多一个带图示的直观说明?

下面先把论文中公式 (8) 原样写出(我会把下标、求和等按更规范的形式整理),然后逐项详细解释意义、直觉和实现注意点,最后给出计算该目标的伪代码与一个小数值示例以便直观理解。

公式(整理后)
JDAPO(θ)=E(q,a)∼D,  {oi}i=1G∼πθold(⋅∣q)[1P∑i=1G∑t=1∣oi∣min⁡ ⁣(ri,t(θ) A^i,t,  clip⁡(ri,t(θ), 1−ϵlow, 1+ϵhigh) A^i,t)] J_{\text{DAPO}}(\theta) = \mathbb{E}{(q,a)\sim\mathcal{D},\;\{o_i\}{i=1}^G\sim\pi_{\theta_{\text{old}}}(\cdot\mid q)}\left[ \frac{1}{P}\sum_{i=1}^G\sum_{t=1}^{|o_i|} \min\!\Big(r_{i,t}(\theta)\,\hat A_{i,t},\; \operatorname{clip}\big(r_{i,t}(\theta),\,1-\epsilon_{\text{low}},\,1+\epsilon_{\text{high}}\big)\,\hat A_{i,t}\Big) \right] JDAPO(θ)=E(q,a)∼D,{oi}i=1G∼πθold(⋅∣q) P1i=1∑Gt=1∑∣oi∣min(ri,t(θ)A^i,t,clip(ri,t(θ),1−ϵlow,1+ϵhigh)A^i,t)
s.t.0<∣{oi: is_equivalent(a,oi)}∣<G, \text{s.t.}\quad 0 < \big|\{o_i:\ \mathrm{is\_equivalent}(a,o_i)\}\big| < G, s.t.0< {oi: is_equivalent(a,oi)} <G,

其中
ri,t(θ)=πθ(oi,t∣q,oi,<t)πθold(oi,t∣q,oi,<t),A^i,t=Ri−mean⁡({Rj}j=1G)std⁡({Rj}j=1G). r_{i,t}(\theta)=\frac{\pi_\theta(o_{i,t}\mid q,o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t}\mid q,o_{i,<t})}, \qquad \hat A_{i,t} = \frac{R_i-\operatorname{mean}(\{R_j\}{j=1}^G)}{\operatorname{std}(\{R_j\}{j=1}^G)} . ri,t(θ)=πθold(oi,t∣q,oi,<t)πθ(oi,t∣q,oi,<t),A^i,t=std({Rj}j=1G)Ri−mean({Rj}j=1G).

并且常见的规范是取歸一化常数
P=∑i=1G∣oi∣ P=\sum_{i=1}^G |o_i| P=i=1∑G∣oi∣

使目标等同于"对该组所有 token 的平均 surrogate"。

逐项解释与直觉

  1. 外层期望
  • 表示先对数据集中的题目-答案对 (q,a)∼D(q,a)\sim\mathcal{D}(q,a)∼D 取样,再对每个题目用旧策略 πθold\pi_{\theta_{\text{old}}}πθold 生成一组 GGG 条响应 {oi}i=1G\{o_i\}_{i=1}^G{oi}i=1G 做平均。
  • 直观:每一步更新基于"一个问题 + 一组候选回复"的集体比较。
  1. 双重求和与归一化常数 PPP
  • 内部是按 token 逐个求和:先对组中每条序列 iii 的每个 token ttt 求 surrogate 再求和,最后除以所有 token 的总数 P=∑i∣oi∣P=\sum_i |o_i|P=∑i∣oi∣。
  • 直观:这是一个 token-level objective,意味着每个 token 的 surrogate 都被算进梯度;因此比"按 sample 平均"更细粒度地把长响应权重分给更多 token,从而让长样本对学习有更大影响(但按 token 均等贡献,不会因为样本较长而被样本平均弱化)。
  1. 重要性比 ri,t(θ)r_{i,t}(\theta)ri,t(θ)
  • 定义为新旧策略在该 token 条件概率之比:ri,t=πθ/πθoldr_{i,t}=\pi_\theta/\pi_{\theta_{\text{old}}}ri,t=πθ/πθold。
  • 直观:r>1r>1r>1 表示新策略更偏好该 token,r<1r<1r<1 表示降低该 token 概率。
  1. 优势估计 A^i,t\hat A_{i,t}A^i,t
  • 论文用的是"组内归一化奖励":先给每条完整响应一个标量奖励 RiR_iRi(例如规则化的正确/非正确/长度惩罚后结果),然后按组做均值和标准差归一化:
    A^i,t=Ri−μRσR. \hat A_{i,t}=\frac{R_i-\mu_R}{\sigma_R}. A^i,t=σRRi−μR.
  • 注意:A^i,t\hat A_{i,t}A^i,t 对同一条样本内不同 token ttt 是相同的(因为奖励是对整条生成打的),但在 token 级别重复使用该优势以实现 token-level credit assignment。
  • 直观:这种做法把奖励信号变为相对评判(该条回复相对于同组其他回复是好还是坏),从而弱化全局偏移与尺度问题,提高稳定性。
  1. min 与裁剪但"上、下界解耦"(Clip-Higher)
  • 内部形式与 PPO 类似:取未裁剪项 rA^r\hat ArA^ 与裁剪后的项 clip⁡(r,1−ϵlow,1+ϵhigh)A^\operatorname{clip}(r,1-\epsilon_{\text{low}},1+\epsilon_{\text{high}})\hat Aclip(r,1−ϵlow,1+ϵhigh)A^ 的较小者。
  • 关键差别是上下界不再对称:上界用 1+ϵhigh1+\epsilon_{\text{high}}1+ϵhigh,下界用 1−ϵlow1-\epsilon_{\text{low}}1−ϵlow,并且通常选择 ϵhigh>ϵlow\epsilon_{\text{high}}>\epsilon_{\text{low}}ϵhigh>ϵlow(即允许上升空间比下降更大)。
  • 直观动机:
    • 对于正优势 A^>0\hat A>0A^>0,上界限制可能会阻止把低概率探索 token 的概率快速提升(这在 long-CoT 中会抑制发现新的有用 token),因此放宽上界(增大 ϵhigh\epsilon_{\text{high}}ϵhigh)能促进探索;
    • 对于负优势 A^<0\hat A<0A^<0,保持较紧的下界(较小 ϵlow\epsilon_{\text{low}}ϵlow)可以防止把动作概率压缩到 0,从而避免过早丧失多样性。
  • 这就是论文所说的 Clip-Higher 策略的数学实现。
  1. 约束条件
  • 约束 0<∣{oi:is_equivalent(a,oi)}∣<G0<|\{o_i:\mathrm{is\_equivalent}(a,o_i)\}|<G0<∣{oi:is_equivalent(a,oi)}∣<G 表示:在训练时只保留"组内既有正确解也有错误解"的样本组(即既不是全错也不是全对)。
  • 直观动机(对应 Dynamic Sampling):若一组全部正确或全部错误,则归一化后的优势 A^\hat AA^ 会退化(例如全等导致 std=0 或优势为 0),会产生零梯度或高方差梯度;动态采样通过过滤此类组保证每个更新批次内都有有效梯度信号。
  1. 总体直观
  • DAPO 把 PPO 的裁剪 surrogate 平移到 token 级别、用组内 reward 归一化得到相对优势,并通过上/下界的非对称放宽探索,同时在数据层面用动态采样剔除"无效组"。这些组合就是论文中提出能在 long-CoT 场景稳健训练并避免 entropy-collapse、梯度衰减等问题的核心设计。

伪代码(计算该 objective 的关键步骤)

  • 我把数学公式尽量对应到实现步骤,注意 token 级别的循环与归一化。

    输入: 旧策略参数 θ_old, 当前参数 θ, batch of prompts B, group size G,
    clip params ε_low, ε_high

    for each prompt q in B:
    # 1) 用 θ_old 对 q 采样 G 条完整回复 {o_i}{i=1}^G(并记录每 token 的 logp_old)
    for i=1..G:
    sample o_i ~ π
    {θ_old}(·|q), store logp_old_{i,t} for t=1..|o_i|
    compute reward R_i = R(o_i, a) # 例如正确/错误 + overlong shape

    复制代码
      # 2) 过滤:如果 count_correct == 0 或 == G 则在动态采样中丢弃该 prompt(继续采样新的组)
      if not (0 < count_correct < G): continue
    
      # 3) 组内归一化 advantage
      μ_R = mean({R_i}), σ_R = std({R_i})
      for i=1..G:
          for t=1..|o_i|:
              A_hat_{i,t} = (R_i - μ_R) / σ_R
    
      # 4) 重新用 θ 计算新 log-prob 并得到 r_{i,t}
      for i=1..G:
          for t=1..|o_i|:
              logp_new = log π_θ(o_{i,t} | q, o_{i,<t})
              r_{i,t} = exp(logp_new - logp_old_{i,t})
              surr1 = r_{i,t} * A_hat_{i,t}
              r_clipped = clamp(r_{i,t}, 1-ε_low, 1+ε_high)
              surr2 = r_clipped * A_hat_{i,t}
              policy_obj_token = min(surr1, surr2)
              accumulate_sum += policy_obj_token
              token_count += 1

    5) 对所有 prompt 和 token 求平均(P = token_count)

    J_DAPO = accumulate_sum / token_count

    在实现里通常最小化 -J_DAPO 作为 policy loss

数值示例(演示 Clip-Higher 的作用)

  • 假设某 token 的优势 A^=2.0\hat A=2.0A^=2.0,旧策略使该 token 概率从 0.010.010.01 增到新策略 0.020.020.02,因此
    r=0.020.01=2.0. r=\frac{0.02}{0.01}=2.0. r=0.010.02=2.0.
  • 若采用传统对称裁剪 ϵ=0.2\epsilon=0.2ϵ=0.2,上界为 1+ϵ=1.21+\epsilon=1.21+ϵ=1.2,裁剪后值为 1.21.21.2,未裁剪项为 4.04.04.0,裁剪项为 1.2×2.0=2.41.2\times 2.0=2.41.2×2.0=2.4,最终取 min⁡=2.4\min=2.4min=2.4。
  • 若采用 DAPO 的非对称上界,例如 ϵhigh=0.28\epsilon_{\text{high}}=0.28ϵhigh=0.28,上界为 1.281.281.28,裁剪项为 1.28×2.0=2.561.28\times 2.0=2.561.28×2.0=2.56,min⁡(4.0,2.56)=2.56\min(4.0,2.56)=2.56min(4.0,2.56)=2.56。
  • 直观:增大上界允许把低概率 token 的提升信号放大一些,有助于探索;但因为仍有裁剪(不是无限放大),避免单步过冲。

实现注意点与陷阱

  • 计算 group std 时要防止 σR≈0\sigma_R\approx 0σR≈0(可加小常数 eps),否则分母不稳。
  • token 级别会显著增加计算量(需要保存并重计算每个 token 的 logp),工程上要关注内存与并行化。
  • 过滤掉全部正确/全部错误的组会增加采样开销,因此论文采用"动态采样缓冲"来保证每个训练 batch 有足够的有效组。
  • 该 objective 中未看到 KL penalty 项(论文在 Section 2.3 说明已去除 KL),因此要注意训练不会受旧策略强约束,但也需要通过其它手段(比如 clip、entropy bonus)避免训练失控。

小结(要点回顾)

  • 公式 (8) 是对 PPO 剪裁 surrogate 的三个主要改动的组合化:一是 token-level 的求和与归一(让长 CoT 有更多有效梯度);二是 group-relative advantage(组内归一化奖励用于相对评判);三是 decoupled clip(ϵlow\epsilon_{\text{low}}ϵlow 和 ϵhigh\epsilon_{\text{high}}ϵhigh 分别控制下/上界以鼓励探索同时保护多样性),外加动态采样约束以避免零梯度组。
  • 这些改动协同工作,旨在解决 long-CoT 中的 entropy-collapse、梯度退化与 reward noise 等问题。

如果你希望,我可以进一步:

  • 给出一个完整的 PyTorch 代码片段(含 log-prob 的缓存、token-level 重计算、归一化细节和数值稳定处理);或
  • 用一张 rrr vs objective 的示意图画出裁剪与非对称裁剪的区别(便于直观理解)。你更想看哪一个?

把该不等式先完整写出并直译成中文:
0<∣{oi: is_equivalent(a,oi)}∣<G. 0 < \big|\{o_i:\ \mathrm{is\_equivalent}(a,o_i)\}\big| < G. 0< {oi: is_equivalent(a,oi)} <G.

这句话的意思是"在一组由旧策略 πθold\pi_{\theta_{\text{old}}}πθold 生成的 GGG 条候选输出 {oi}i=1G\{o_i\}_{i=1}^G{oi}i=1G 中,满足判定函数 is_equivalent(a,oi)\mathrm{is\_equivalent}(a,o_i)is_equivalent(a,oi)(即输出 oio_ioi 与参考答案 aaa 等价/正确)的数量必须严格大于 000 且严格小于 GGG"。

逐项解释与动机(尽量用直观的数值示例):

  1. is_equivalent 的含义
  • 表达式中的 is_equivalent(a,oi)\mathrm{is\_equivalent}(a,o_i)is_equivalent(a,oi) 通常是一个布尔函数,表示"输出 oio_ioi 与标准答案 aaa 是否等价(或被判为正确)"。
  • 例如在数学题中它可以是"答案解析后数值相等"的判定;在编程题中可能是"通过测试用例"的判定。
  1. 不等式的两端含义
  • 左端 0<0<0< 表示"不能全部都错",即一组里至少要有一条是正确的。
  • 右端 <G<G<G 表示"不能全部都对",即一组里至少要有一条是错误的。
  • 因此该条件要求"组内既有正确样本也有错误样本(mixed group)"。
  1. 为什么要这个限制 --- 数学/训练上的原因
  • 优势计算式(论文中使用的组内归一化)是
    A^i,t=Ri−μRσR,μR=mean({Rj}j=1G), σR=std({Rj}j=1G). \hat A_{i,t}=\frac{R_i-\mu_R}{\sigma_R},\qquad \mu_R=\mathrm{mean}(\{R_j\}{j=1}^G),\ \sigma_R=\mathrm{std}(\{R_j\}{j=1}^G). A^i,t=σRRi−μR,μR=mean({Rj}j=1G), σR=std({Rj}j=1G).
  • 若一组内所有 RjR_jRj 都相同(例如全对或全错),则 σR=0\sigma_R=0σR=0,导致分母为 000(数值不稳定)或按实现被视为优势全为 000,从而该组对策略梯度贡献为零(没有学习信号)。
  • 例如当 G=16G=16G=16 且所有 Rj=1R_j=1Rj=1(全部正确)时,μR=1\mu_R=1μR=1、σR=0\sigma_R=0σR=0,则每个 A^i,t=1−10\hat A_{i,t}=\dfrac{1-1}{0}A^i,t=01−1(未处理时非法,若处理为 000 则梯度为 0);这会使该批次中有效的梯度样本数减少,造成训练效率降低或噪声增大。
  • 因此要求 0<count_correct<G0<\text{count\_correct}<G0<count_correct<G 可以避免组内方差为 0 或优势退化为零的情况,确保每次更新都有有效的相对信号。
  1. 动态采样的关系与实现策略
  • 在实践中论文采用 Dynamic Sampling:对每个 prompt 重复采样直到得到满足约束的组(即既有正确又有错误)。伪代码思路:

    repeat:
    sample {o_i}{i=1}^G ~ π{θ_old}
    compute rewards R_i and count_correct = |{ i: is_equivalent(a,o_i) }|
    until 0 < count_correct < G

    然后用该组计算 group-normalized advantages 并参与更新

  • 这样做会增加采样成本,但保证每个组都能提供非平凡(non-zero)梯度信号,从而提高样本利用效率和训练稳定性。

  1. 额外的数值/工程注意事项
  • 即便不出现完全相等的 RjR_jRj,当 σR\sigma_RσR 非常小也会导致 A^\hat AA^ 放大并带来高方差;因此实现中通常做
    σR←max⁡(σR,ε) \sigma_R \leftarrow \max(\sigma_R, \varepsilon) σR←max(σR,ε)
    并取例如 ε=10−6\varepsilon=10^{-6}ε=10−6 以避免数值不稳。
  • 对于非二值奖励(比如含有长度惩罚或软惩罚的连续奖励),即使没有严格"全等",也可能出现近似全等的情形,仍需注意 std 的下界与 clipping。
  • 过滤掉全对/全错的组会增加采样时间,工程上通常用一个动态采样缓冲区(buffer)收集合格组再做批次更新,以平衡采样与训练效率。
  1. 直观总结
  • 条件
    0<∣{oi: is_equivalent(a,oi)}∣<G 0 < \big|\{o_i:\ \mathrm{is\_equivalent}(a,o_i)\}\big| < G 0< {oi: is_equivalent(a,oi)} <G
    的含义是"只使用组内既有正确也有错误的样本组进行更新",其目的是避免组内奖励方差为零(或过小)导致无意义/不稳定的优势估计,从而保证每个梯度步都有有效的相对信号。

如果你需要,我可以接着给出:

  • 一个更完整的 PyTorch 风格实现片段(含对 σR\sigma_RσR 的稳健处理与动态采样实现);或
  • 分析当奖励不是二元(0/1)时该约束是否还足够以及有哪些替代方案(例如改用加小常数、全局归一化或混合归一化策略)。你想看哪一个?

很好的问题 ------ 我把这句话拆开来用直观语言和数值示例说明,并给出工程上常用的缓解方法与若干可选替代方案(含公式与实现建议),帮助你彻底理解「即使没有严格'全等'也会出问题」的含义及后果。

  1. 基本概念回顾(组内归一化优势)
  • 论文中组内归一化优势定义为
    A^i=Ri−μRσR, \hat A_i=\frac{R_i-\mu_R}{\sigma_R}, A^i=σRRi−μR,
    其中 μR=mean⁡({Rj})\mu_R=\operatorname{mean}(\{R_j\})μR=mean({Rj}),σR=std⁡({Rj})\sigma_R=\operatorname{std}(\{R_j\})σR=std({Rj})。
  1. "严格全等"指什么
  • "严格全等"指一组内所有奖励完全相同,例如 {Rj}={1,1,...,1}\{R_j\}=\{1,1,\dots,1\}{Rj}={1,1,...,1},此时 σR=0\sigma_R=0σR=0,导致 A^i\hat A_iA^i 无意义或被实现为 000(即无学习信号)。
  1. "即使没有严格全等也会出问题"的含义(核心)
  • 在实际训练中奖励往往不是严格二值 {0,1}\{0,1\}{0,1},而是连续值或经过惩罚后的实数(例如含长度惩罚的 RiR_iRi,或软惩罚后的值)。即便组内各 RjR_jRj 不完全相等,但如果它们非常接近(即 σR\sigma_RσR 很小),则分母很小会使得优势 A^i\hat A_iA^i 的数值非常大或非常不稳定,进而导致高方差梯度、训练不稳或数值溢出。
  • 用公式说明:当 σR→0\sigma_R\to 0σR→0,即使 Ri−μRR_i-\mu_RRi−μR 很小,A^i=(Ri−μR)/σR\hat A_i=(R_i-\mu_R)/\sigma_RA^i=(Ri−μR)/σR 仍可能变得非常大(放大噪声)。
  1. 一个数值示例(直观)
  • 假设一组 G=4G=4G=4 的奖励为
    R={0.995,  0.996,  0.995,  0.996}. R=\{0.995,\;0.996,\;0.995,\;0.996\}. R={0.995,0.996,0.995,0.996}.
  • 则组内均值大约为 μR≈0.9955\mu_R\approx 0.9955μR≈0.9955,组内标准差约为 σR≈0.0005\sigma_R\approx 0.0005σR≈0.0005。
  • 对于 Ri=0.996R_i=0.996Ri=0.996,其优势为
    A^i=0.996−0.99550.0005=1.0, \hat A_i=\frac{0.996-0.9955}{0.0005}=1.0, A^i=0.00050.996−0.9955=1.0,
    看起来还好;但如果所有值更接近,例如
    R={0.999995,  0.999996,  0.999995,  0.999996}, R=\{0.999995,\;0.999996,\;0.999995,\;0.999996\}, R={0.999995,0.999996,0.999995,0.999996},
    那么 σR≈5×10−7\sigma_R\approx 5\times10^{-7}σR≈5×10−7,即使 Ri−μR≈5×10−7R_i-\mu_R\approx 5\times10^{-7}Ri−μR≈5×10−7,仍會得到
    A^i≈5×10−75×10−7≈1, \hat A_i\approx\frac{5\times10^{-7}}{5\times10^{-7}} \approx 1, A^i≈5×10−75×10−7≈1,
    表面上仍 1,但数值上去算会受浮点精度影响;更糟糕的是若 σR\sigma_RσR 被数值截断或接近机器精度,计算会不稳定或被截断为大值/NaN。更极端若 σR\sigma_RσR 更小(例如 10−910^{-9}10−9),任何微小的差异会产生很大的 A^i\hat A_iA^i,导致训练震荡。
  1. 为什么会出现近似相等的奖励(常见来源)
  • 软惩罚/长度惩罚:原始二值正确性 0/10/10/1 与长度惩罚结合后变为 Ri∈[0,1]R_i\in[0,1]Ri∈[0,1] 的连续值,很多合理解法被同样轻微惩罚,致使组内值接近。
  • 连续评分:用评分函数给出部分正确或置信度(例如 0.9,0.920.9,0.920.9,0.92 等),同组样本在质量上差异很小。
  • 数值截断:奖励在计算/存储时被量化或截断(例如只保留小数点后 6 位),会人为降低组内方差。
  1. 工程上常用的稳健处理(建议按优先级)
  • 在计算标准差时加下界 ε\varepsilonε:
    σR←max⁡(σR, ε) \sigma_R \leftarrow \max(\sigma_R,\,\varepsilon) σR←max(σR,ε)
    通常取 ε∈[10−6,10−3]\varepsilon\in[10^{-6},10^{-3}]ε∈[10−6,10−3] 以避免除零或过大放大。
  • 对优势做截断(clipping):例如把 A^i\hat A_iA^i 限制在 [−Amax⁡,Amax⁡][-A_{\max},A_{\max}][−Amax,Amax],即
    A^i←clip⁡(A^i, −Amax⁡,Amax⁡). \hat A_i \leftarrow \operatorname{clip}(\hat A_i,\,-A_{\max},A_{\max}). A^i←clip(A^i,−Amax,Amax).
  • 使用鲁棒尺度代替标准差,例如用 MAD(median absolute deviation):
    MAD⁡=median⁡j(∣Rj−median⁡(R)∣) \operatorname{MAD}=\operatorname{median}_j\big(|R_j-\operatorname{median}(R)|\big) MAD=medianj(∣Rj−median(R)∣)
    并用 σ~=1.4826⋅MAD⁡\tilde\sigma = 1.4826\cdot\operatorname{MAD}σ~=1.4826⋅MAD 作为分母,抗异常与小方差更鲁棒。
  • 使用秩归一化(rank normalization):把 RiR_iRi 换成其组内秩 rir_iri 再归一化,从而避免绝对差值太小的问题。
  1. 动态采样 / 策略层面的补救
  • 只接受满足方差阈值的组:若 σR<τ\sigma_R<\tauσR<τ 则重新采样(Dynamic Sampling 的变体)或合并更多样本增大 GGG;即
    if σR<τ then resample group. \text{if }\sigma_R<\tau\text{ then resample group.} if σR<τ then resample group.
  • 用温度/软化函数放大差异:对原始 RRR 做变换 R′ ⁣=softmax⁡((R−μ)/τ)R'\! = \operatorname{softmax}((R-\mu)/\tau)R′=softmax((R−μ)/τ) 或 R′=tanh⁡((R−μ)/τ)R'=\tanh((R-\mu)/\tau)R′=tanh((R−μ)/τ),用较小的 τ\tauτ 放大组内差异。
  1. 替代归一化方案(研究方向与权衡)
  • 混合归一化:把 z-score(R−μσ\frac{R-\mu}{\sigma}σR−μ)与秩归一化按比例混合以兼顾绝对差异与排序信息。
  • 学习型缩放:用小网络学习一个缩放/平移映射 gϕ(R)g_\phi(R)gϕ(R) 使得组内的 std⁡(gϕ(R))\operatorname{std}(g_\phi(R))std(gϕ(R)) 达到目标分布(需要元学习与稳健性约束)。
  • 基于置信度的采样:对高置信度近乎相等的样本组降低其在训练中的权重,以避免"伪信号"过度影响梯度。
  1. 小结(一句话核心)
  • 即便奖励不是严格相等,只要组内的奖励差异很小(即 σR\sigma_RσR 很小),组内归一化 A^i=(Ri−μR)/σR\hat A_i=(R_i-\mu_R)/\sigma_RA^i=(Ri−μR)/σR 仍会放大噪声导致优势不稳定或过大;因此在非二值/连续奖励场景下必须通过数值下界、鲁棒尺度、秩归一化或动态采样等机制来保证优势估计的稳健性。

如果你愿意,我可以:

  • 给出一个带具体数值(Python/NumPy)的演示脚本,展示在不同 ε\varepsilonε、MAD、rank-normalize 下 A^\hat AA^ 的变化;或
  • 针对你要训练的具体 reward 形式(例如论文里的 Overlong Reward Shaping),帮你设计一个稳健的归一化和采样阈值策略。你想看哪个?
相关推荐
断剑zou天涯2 小时前
【算法笔记】Manacher算法
java·笔记·算法
冷yan~2 小时前
OpenAI Codex CLI 完全指南:AI 编程助手的终端革命
人工智能·ai·ai编程
菜鸟‍2 小时前
【论文学习】通过编辑习得分数函数实现扩散模型中的图像隐藏
人工智能·学习·机器学习
AKAMAI2 小时前
无服务器计算架构的优势
人工智能·云计算
阿星AI工作室2 小时前
gemini3手势互动圣诞树保姆级教程来了!附提示词
前端·人工智能
刘一说2 小时前
时空大数据与AI融合:重塑物理世界的智能中枢
大数据·人工智能·gis
月亮月亮要去太阳2 小时前
基于机器学习的糖尿病预测
人工智能·机器学习
Oflycomm2 小时前
LitePoint 2025:以 Wi-Fi 8 与光通信测试推动下一代无线创新
人工智能·wifi模块·wifi7模块
机器之心3 小时前
「豆包手机」为何能靠超级Agent火遍全网,我们听听AI学者们怎么说
人工智能·openai
monster000w3 小时前
大模型微调过程
人工智能·深度学习·算法·计算机视觉·信息与通信