文章

从SFT、RL到OPD。。。以及中间选择?

从SFT、RL到OPD。。。以及中间选择?

背景

监督微调和强化学习解决的是同一个问题:让模型更倾向于生成我们认为更好的输出:

  • SFT 直接给出标准输出,让模型在固定样本上模仿
  • RL 让模型先生成,再用奖励函数评价结果,然后提高高奖励输出出现的概率。

在大模型后训练里,SFT 通常更稳定。给定输入 $q$ 和标准回答 $o$,训练目标就是提高 $\pi_\theta(o\mid q)$。梯度稳定,适合作为冷启动,但是模型只在数据里的轨迹上学习。如果标准回答来自 teacher,那么 student 学到的是 teacher 已经写好的路径;一旦推理时走到数据里没有覆盖的中间状态,SFT 本身并不会告诉模型该怎么修正。

RL,尤其是 GRPO 这类方法,换了一个角度。模型对同一个输入采样多个输出,奖励函数根据最终答案、格式或工具执行结果给分,再用组内相对分数构造优势。它不要求预先给出完整标准轨迹,更适合“结果可以检查,但过程不唯一”的任务。不过语言模型里的奖励常常是序列级的:模型生成了几十个、几百个 token,最后才知道整体得分。这样的信号比较稀疏,训练方差也更高。

OPD(On-Policy Distillation)可以放在 SFT 和 RL 中间理解。它让 student 自己生成轨迹,因此 prefix 来自当前 student,是 on-policy 的;但每一步的监督又来自 teacher 的 token-level 分布,因此比只看最终结果的 RL 更稠密。换句话说,SFT 是“在 teacher 写好的轨迹上模仿 teacher”,GRPO 是“自己生成后接受结果奖励”,OPD 则是“自己走到某个状态,再问 teacher 这个状态下的 token 分布应该是什么”。

KL 方向

KL 散度(Kullback-Leibler divergence)用来衡量两个概率分布之间的差异。对于离散分布 $p$ 和 $q$,它的定义是:

\[D_{\mathrm{KL}}(p\|q) = \sum_y p(y) \log \frac{p(y)}{q(y)}\]

这个式子可以理解为:如果真实分布是 $p$,但我们用 $q$ 来近似它,会多付出多少信息代价。它不是对称的,一般来说 $D_{\mathrm{KL}}(p|q)\neq D_{\mathrm{KL}}(q|p)$。因此 KL 里的方向会改变优化行为。

在机器学习里,KL 常被用来让一个分布靠近另一个分布。假设 $p$ 是目标分布,$q_\theta$ 是模型分布,最常见的目标是最小化:

\[D_{\mathrm{KL}}(p\|q_\theta) = \sum_y p(y) \log \frac{p(y)}{q_\theta(y)}\]

因为 $\sum_y p(y)\log p(y)$ 和模型参数 $\theta$ 无关,优化这个式子等价于最小化交叉熵:

\[-\sum_y p(y) \log q_\theta(y)\]

这就是 forward KL 和监督学习之间的关系。如果 $p$ 是 one-hot 标签,它退化成普通的负对数似然;如果 $p$ 是 teacher 给出的 soft label,它就是知识蒸馏里常见的 soft-target matching。

在 LLM 里,模型每一步都会输出一个词表上的概率分布。给定当前上下文 $s_t=(q,o_{<t})$,teacher 分布记为 $p_T(\cdot\mid s_t)$,student 分布记为 $q_\theta(\cdot\mid s_t)$。token-level forward KL 就是让 student 在这个 prefix 上覆盖 teacher 认为可能的 token:

\[D_{\mathrm{KL}} \left( p_T(\cdot\mid s_t) \| q_\theta(\cdot\mid s_t) \right)\]

这个方向更接近 SFT 或常规蒸馏。teacher 觉得概率高的 token,student 都需要给出足够概率,因此它通常更保守,也更能保持分布的覆盖面。

反过来,token-level reverse KL 是:

\[D_{\mathrm{KL}} \left( q_\theta(\cdot\mid s_t) \| p_T(\cdot\mid s_t) \right)\]

这个方向的期望在 student 自己的分布下。student 当前更可能生成哪些 token,训练就主要在这些 token 上比较 teacher 和 student 的差异。它常被称为更偏向 mode seeking:如果 teacher 在多个候选路径上都有概率,reverse KL 更容易把概率集中到 student 当前能走通、且 teacher 也认可的区域。这样可能带来更强的单次输出质量,但也可能降低熵,让模型变得更窄。

token-level KL

上面写的是某个固定 prefix $s_t$ 上的 KL。真实训练时,模型生成的是完整序列,所以还需要说明:sequence-level 的分布差异,为什么可以拆成每一步 token 上的分布差异。

设输入为 $q$,输出序列为 $o=(o_1,o_2,\ldots,o_T)$。teacher 和 student 都是自回归模型,因此完整序列概率可以写成:

\[p_T(o\mid q) = \prod_{t=1}^{T} p_T(o_t\mid q,o_{<t}) ,\quad q_\theta(o\mid q) = \prod_{t=1}^{T} q_\theta(o_t\mid q,o_{<t})\]

为了写起来方便,记:

\[s_t=(q,o_{<t})\]

$s_t$ 就是第 $t$ 步生成前模型已经看到的上下文。此时 $p_T(\cdot\mid s_t)$ 和 $q_\theta(\cdot\mid s_t)$ 都是词表上的分布,token-level KL 比较的就是这两个分布。

先看 sequence-level forward KL:

\[D_{\mathrm{KL}}(p_T\|q_\theta)(q) = \mathbb{E}_{o\sim p_T(\cdot\mid q)} \left[ \log \frac{p_T(o\mid q)}{q_\theta(o\mid q)} \right]\]

把自回归分解代入进去,序列的 log-ratio 会变成每一步 token log-ratio 的求和:

\[\log \frac{p_T(o\mid q)}{q_\theta(o\mid q)} = \sum_{t=1}^{T} \log \frac{p_T(o_t\mid s_t)}{q_\theta(o_t\mid s_t)}\]

因此 forward KL 可以写成:

\[D_{\mathrm{KL}}(p_T\|q_\theta)(q) = \sum_{t=1}^{T} \mathbb{E}_{s_t\sim d_T^t} \left[ D_{\mathrm{KL}} \left( p_T(\cdot\mid s_t) \| q_\theta(\cdot\mid s_t) \right) \right]\]

这里 $d_T^t$ 表示 teacher 生成到第 $t$ 步时诱导出的 prefix 分布。也就是说,sequence-level forward KL 自然对应“在 teacher 走到的 prefix 上,做 token-level forward KL”。

同理,sequence-level reverse KL 是:

\[D_{\mathrm{KL}}(q_\theta\|p_T)(q) = \mathbb{E}_{o\sim q_\theta(\cdot\mid q)} \left[ \log \frac{q_\theta(o\mid q)}{p_T(o\mid q)} \right]\]

它会分解成:

\[D_{\mathrm{KL}}(q_\theta\|p_T)(q) = \sum_{t=1}^{T} \mathbb{E}_{s_t\sim d_S^t} \left[ D_{\mathrm{KL}} \left( q_\theta(\cdot\mid s_t) \| p_T(\cdot\mid s_t) \right) \right]\]

其中 $d_S^t$ 表示 student 自己生成到第 $t$ 步时诱导出的 prefix 分布。也就是说,sequence-level reverse KL 自然对应“在 student 走到的 prefix 上,做 token-level reverse KL”。

拆开链条

从 sequence-level KL 看,序列级 forward KL 的期望在 teacher 轨迹上,序列级 reverse KL 的期望在 student 轨迹上,看起来给出了两条固定链条:forward KL 对应 teacher prefix,reverse KL 对应 student prefix。

但到了 token-level 以后,事情会变得更灵活。只要给定一个 prefix $s_t$,我们总能分别计算 teacher 分布 $p_T(\cdot\mid s_t)$ 和 student 分布 $q_\theta(\cdot\mid s_t)$。这个 prefix 可以来自 teacher,也可以来自 student;在这个 prefix 上,可以算 forward KL,也可以算 reverse KL。因此,prefix 来源和 KL 方向可以被看成两个独立选择:

  • prefix 来源决定在哪些状态上训练,即 $s_t\sim d_T^t$ 还是 $s_t\sim d_S^t$
  • KL 方向决定如何比较 teacher 和 student,即 $D_{\mathrm{KL}}(p_T|q_\theta)$ 还是 $D_{\mathrm{KL}}(q_\theta|p_T)$

把这两个选择组合起来,就得到四种 token-level 训练目标。

prefix 来源forward KLreverse KL
teacher prefix $d_T^t$off-policy SFT / soft distillationoffline-RL-style distillation
student prefix $d_S^t$DAgger-style on-policy SFTOPD

第一种是 teacher prefix + forward KL:

\[\mathcal{L}_{T,F}(\theta) = \sum_{t=1}^{T} \mathbb{E}_{s_t\sim d_T^t} \left[ D_{\mathrm{KL}} \left( p_T(\cdot\mid s_t) \| q_\theta(\cdot\mid s_t) \right) \right]\]

这就是最接近常规 SFT 的目标。训练状态来自 teacher 生成的轨迹,优化方向是让 student 覆盖 teacher 的 token 分布。如果只使用 teacher 采样出的 token 作为 hard label,它就退化成常见的 teacher trace SFT。

第二种是 student prefix + forward KL:

\[\mathcal{L}_{S,F}(\theta) = \sum_{t=1}^{T} \mathbb{E}_{s_t\sim d_S^t} \left[ D_{\mathrm{KL}} \left( p_T(\cdot\mid s_t) \| q_\theta(\cdot\mid s_t) \right) \right]\]

它仍然是 forward KL,所以监督形式还是 soft-label cross entropy;但 prefix 来自 student 自己的 rollout。直观上,这是让 student 先暴露自己会走到哪些状态,再让 teacher 在这些状态上给出监督。这个结构和 DAgger 很接近:learner 负责产生状态,expert 负责给这些状态标注动作或分布。

第三种是 teacher prefix + reverse KL:

\[\mathcal{L}_{T,R}(\theta) = \sum_{t=1}^{T} \mathbb{E}_{s_t\sim d_T^t} \left[ D_{\mathrm{KL}} \left( q_\theta(\cdot\mid s_t) \| p_T(\cdot\mid s_t) \right) \right]\]

这里训练状态仍然是离线的 teacher 轨迹,但目标换成了 reverse KL。它可以被理解为一种 offline-RL-style distillation:状态分布是固定数据集,student 在这些状态上选择 token,而 teacher 的 log probability 给出稠密反馈。它不像标准 offline RL 那样学习价值函数或做 Bellman backup,只是在固定 prefix 分布上做 policy-gradient 形式的分布匹配。

第四种是 student prefix + reverse KL:

\[\mathcal{L}_{S,R}(\theta) = \sum_{t=1}^{T} \mathbb{E}_{s_t\sim d_S^t} \left[ D_{\mathrm{KL}} \left( q_\theta(\cdot\mid s_t) \| p_T(\cdot\mid s_t) \right) \right]\]

这就是通常说的 OPD。student 自己生成 prefix,teacher 在这些 prefix 上提供 token-level 分布,reverse KL 则把 teacher-student log-ratio 变成类似稠密奖励的信号。它比离线 SFT 更贴近 student 推理时真实会遇到的状态,也比只看最终答案的 RL 多了逐 token 的监督。

参考:Decoupling KL and Trajectories: A Unified Perspective for SFT, DAgger, Offline RL, and OPD in LLM Distillation,arXiv: https://arxiv.org/abs/2605.16826 。

SFT 与 RL

为什么 forward KL 会落到 SFT 式交叉熵,reverse KL 又为什么会长得像 RL?这里先固定一个 prefix $s_t$,把 $p_T(\cdot\mid s_t)$ 简写为 $p_T$,把 $q_\theta(\cdot\mid s_t)$ 简写为 $q_\theta$。

先看 forward KL:

\[D_{\mathrm{KL}}(p_T\|q_\theta) = \sum_y p_T(y) \log \frac{p_T(y)}{q_\theta(y)}\]

展开后可以写成两项:

\[D_{\mathrm{KL}}(p_T\|q_\theta) = \sum_y p_T(y)\log p_T(y) - \sum_y p_T(y)\log q_\theta(y)\]

第一项只和 teacher 分布有关,不依赖 student 参数 $\theta$。因此对 $\theta$ 求梯度时,只剩下第二项:

\[\nabla_\theta D_{\mathrm{KL}}(p_T\|q_\theta) = - \sum_y p_T(y) \nabla_\theta \log q_\theta(y)\]

写成期望形式就是:

\[\nabla_\theta D_{\mathrm{KL}}(p_T\|q_\theta) = - \mathbb{E}_{y\sim p_T} \left[ \nabla_\theta \log q_\theta(y) \right]\]

这就是 SFT 式交叉熵的梯度。teacher 分布里概率高的 token,会更强地推动 student 提高对应的 log probability。如果 teacher 分布退化成 one-hot,那么这个目标就是普通 SFT:提高标准 token 的概率;如果 teacher 给的是完整 soft distribution,那么它就是 soft-label distillation。

再看 reverse KL:

\[D_{\mathrm{KL}}(q_\theta\|p_T) = \sum_y q_\theta(y) \log \frac{q_\theta(y)}{p_T(y)}\]

这次求梯度时,权重 $q_\theta(y)$ 本身也依赖 $\theta$。用 score function identity:

\[\nabla_\theta q_\theta(y) = q_\theta(y)\nabla_\theta\log q_\theta(y)\]

可以得到:

\[\nabla_\theta D_{\mathrm{KL}}(q_\theta\|p_T) = \mathbb{E}_{y\sim q_\theta} \left[ \left( \log q_\theta(y)-\log p_T(y) \right) \nabla_\theta\log q_\theta(y) \right]\]

最小化 reverse KL 时,我们沿着负梯度更新:

\[-\nabla_\theta D_{\mathrm{KL}}(q_\theta\|p_T) = \mathbb{E}_{y\sim q_\theta} \left[ \left( \log p_T(y)-\log q_\theta(y) \right) \nabla_\theta\log q_\theta(y) \right]\]

这个形式和策略梯度很接近。策略梯度通常写成:

\[\nabla_\theta J(\theta) = \mathbb{E}_{y\sim q_\theta} \left[ r(y) \nabla_\theta\log q_\theta(y) \right]\]

对比两式,可以把 reverse KL 的 dense reward 写成:

\[r_{\mathrm{KL}}(s_t,y) = \log p_T(y\mid s_t)-\log q_\theta(y\mid s_t)\]

这里说 reverse KL “像 RL”,指的是梯度形式像 policy gradient,并且可以解释成 teacher 给了一个逐 token 的奖励。直观上,如果某个 token 是 student 采样出来的,并且 teacher 给它的概率高于 student 自己给的概率,那么这个 token 的 $r_{\mathrm{KL}}$ 为正,训练会提高它的概率;如果 teacher 给的概率更低,训练会压低它。这个信号发生在每个 token 上,所以它比只看最终答案的 RL 奖励更密(GRPO 的奖励通常来自答案正确性、工具执行结果或外部 verifier)。

从这个角度看,SFT、RL 和各类蒸馏都可以理解成对策略分布的重新加权。SFT 的梯度期望在 teacher 或 data 分布上,更像是在补齐低频但正确的 token,因而更偏 mode covering;reverse-KL OPD 和 policy-gradient-style RL 的期望在 student 当前分布上,更倾向于放大已经被采到、且奖励更高的 token,因而更偏 mode seeking。它们都在推动模型从当前分布向某个目标分布移动,但监督信号、采样分布、方差、熵变化和训练稳定性都不同。参数量足够、数据足够、目标一致时,不同算法可能收敛到接近的解;在实际大模型后训练里,这些动力学差异通常会决定能不能稳定到达那个解。

Thinking Machines Lab 的 OPD 博客更常用 RL 语言描述这件事:student 采样 rollout,teacher 给每个 token 计算 log probability,二者的 log-ratio 就成为逐 token 的 dense reward。本文采用更一般的 KL 视角,把它放回 prefix source 与 KL direction 的二维选择里。参考:On-Policy Distillation,https://thinkingmachines.ai/blog/on-policy-distillation/ 。

GKD、JSD 与中间目标

上面把 forward KL 和 reverse KL 分别连到了 SFT 与 RL,但是如果 forward 太保守,reverse 又太激进,有没有中间选择?GKD(Generalized Knowledge Distillation)保留 on-policy 的思想:让 student 生成自己的序列,再让 teacher 在这些 student prefix 上给 token-level 分布监督。

记第 $t$ 步的状态为 $s_t=(x,y_{<t})$,teacher 分布为 $p_T(\cdot\mid s_t)$,student 分布为 $q_\theta(\cdot\mid s_t)$。先用 $\mu_\alpha$ 表示训练序列来源:

\[\mu_\alpha(y\mid x) = (1-\alpha)\mu_{\mathrm{data}}(y\mid x) + \alpha q_\theta^{\mathrm{sg}}(y\mid x)\]

其中 $\mu_{\mathrm{data}}$ 可以是 ground-truth 或 teacher-generated sequence,$q_\theta^{\mathrm{sg}}$ 表示 student 自己生成的序列,并且采样过程通常 stop-gradient。$\alpha$ 越大,student-generated sequence 的比例越高。GKD 的 token-level loss 可以抽象成:

\[\mathcal L_{\mathrm{GKD}}(\theta) = \mathbb E_{x\sim\mathcal D,\ y\sim\mu_\alpha(\cdot\mid x)} \left[ \frac{1}{|y|} \sum_{t=1}^{|y|} D \left( p_T(\cdot\mid s_t) \| q_\theta(\cdot\mid s_t) \right) \right]\]

这里 $D$ 是可选 divergence,可以用 forward KL、reverse KL,也可以用 generalized JSD。这里的关系是:GKD 是训练框架,JSD 是 GKD 可以选用的一种分布对齐目标。

参考:On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes,arXiv: https://arxiv.org/abs/2306.13649 。

generalized JSD 的定义是先在每个 prefix 上构造一个中间分布:

\[m_\beta(\cdot\mid s_t) = \beta p_T(\cdot\mid s_t) + (1-\beta)q_\theta(\cdot\mid s_t)\]

GKD 里的混合序列来源和 JSD 的中间分布不是一回事。

  • $\mu_\alpha$ 混合的是 sequence source,决定训练时看到哪些 prefix:来自固定数据,还是来自 student 自己的 rollout
  • JSD 的 $m_\beta$ 混合的是同一个 prefix 上的 token distribution,决定在已经给定 $s_t$ 后,teacher 和 student 的概率分布怎样对齐。

然后让 teacher 和 student 分别靠近这个中间分布:

\[D_{\mathrm{JSD}(\beta)} \left( p_T \| q_\theta \right) = \beta D_{\mathrm{KL}} \left( p_T \| m_\beta \right) + (1-\beta) D_{\mathrm{KL}} \left( q_\theta \| m_\beta \right)\]

展开到 vocabulary 上,就是:

\[\begin{aligned} D_{\mathrm{JSD}(\beta)} &= \beta \sum_{v\in\mathcal V} p_T(v\mid s_t) \log \frac{ p_T(v\mid s_t) }{ m_\beta(v\mid s_t) } \\ &\quad+ (1-\beta) \sum_{v\in\mathcal V} q_\theta(v\mid s_t) \log \frac{ q_\theta(v\mid s_t) }{ m_\beta(v\mid s_t) } \end{aligned}\]

forward KL 是让 student 覆盖 teacher,reverse KL 是让 student 集中到 teacher 认可的模式;JSD 则通过 $m_\beta$ 引入一个中间目标。$\beta$ 越小,行为越接近 forward KL;$\beta$ 越大,行为越接近 reverse KL。因为 JSD 是有界 divergence,它通常比直接优化 KL 更不容易被极端概率比支配,训练过程也更稳。

另一种中间选择是 KL mixing。它不像 JSD 引入 $m_\beta$ 这样的中间分布,直接在同一个 prefix 上线性混合两种 KL:

\[\mathcal{L}_{\mathrm{mix},\rho}(s_t) = \rho D_{\mathrm{KL}} \left( q_\theta(\cdot\mid s_t) \| p_T(\cdot\mid s_t) \right) + (1-\rho) D_{\mathrm{KL}} \left( p_T(\cdot\mid s_t) \| q_\theta(\cdot\mid s_t) \right)\]

这里 $\rho$ 是 reverse-KL 权重。$\rho$ 越大,目标越偏向 mode seeking;$\rho$ 越小,目标越偏向稳定覆盖。KL mixing 和 JSD 的差别在这里:KL mixing 是“两个 KL loss 相加”,JSD 是“先构造中间分布,再让两边靠近它”。因此 JSD 更像一个独立的、平滑的 divergence;KL mixing 更像一个工程上直接可控的加权目标。

工程判断

回到 OPD,如何根据场景和任务选择不同的方法?

第一组是真实状态覆盖和计算成本的权衡。

  • teacher prefix 可以提前生成、缓存,训练便宜,也适合冷启动;问题是这些 prefix 来自 teacher,student 推理时走到自己的错误状态后,训练数据未必覆盖。
  • student prefix 更贴近部署时的真实分布,因为状态来自当前 student 的 rollout;代价是每轮都要采样 student,还要让 teacher 在这些 prefix 上给监督,链路更重。

在 128-token 设置下,一步 student-prefix reverse-KL 更新大约相当于 3.6 步 cached-logit teacher-prefix reverse-KL 更新。另一方面,student prefix 在效果上确实更贴近目标分布:matched comparison 下,student prefix 平均带来约 +1.80 Avg@$k$、+2.11 Pass@$k$;4096-token distillation 时增益扩大到约 +3.55 Avg@$k$、+2.95 Pass@$k$。

第二组是精度和熵的权衡。

  • reverse KL 更偏向 mode seeking,容易把概率集中到 teacher 认可、student 当前也能走到的区域,standalone accuracy 往往更强;代价是 predictive entropy 会下降,输出多样性和后续探索空间都会变窄。
  • forward KL 更偏向覆盖 teacher 分布,短期精度可能低一些,但更稳定,也更适合作为后续 RL 的起点。

4096-token distillation、Qwen3-4B teacher 下,student-prefix reverse KL 在 GRPO 前大约有 45% MATH500 accuracy,但继续 GRPO 后降到约 36%;student-prefix forward KL 起点约 40%,GRPO 后升到约 45%。这说明“蒸馏后最强的 checkpoint”不一定是“后续 RL 最好的 warmup”。

上节的 JSD 和 KL mixing 都是针对这个权衡的中间目标。经验结论是,在 long-sequence distillation 里,forward-heavy mixing 更稳:reverse KL 提供转移信号,forward KL 负责保住 entropy 和长度。JSD 更适合放进研究型 ablation 里,尤其是 student 能力偏弱、reverse KL 未必带来增益的场景。

第三组是信号完整性和资源成本的权衡。

  • 全词表 KL 最贴近公式目标,因为它比较整个 vocabulary 上的 teacher/student 分布,方差更低;问题是中间张量会随 \(B\times L\times |\mathcal V|\) 增长,长序列训练很容易变成显存瓶颈。
  • Top-k 或 sampled-token 方案便宜很多,但它们是近似,会引入偏差;k 太小时,训练还可能不稳定。

论文选择 full-vocabulary KL,并用 fused kernel 避免显式保存 vocabulary-sized 中间张量。这个实现不改变 loss,只是把 per-token intermediate 从 \(O(|\mathcal V|)\) 降到 tile-level/constant-size running statistics。工程含义是:full-vocab KL 更干净,但需要专门 infra;Top-k 更适合小规模验证或资源受限实验,结论里要标清近似。

第四组是局部稠密监督和长程结果监督的权衡。

  • token-level OPD 每一步都有 teacher 分布作为信号,方差低,适合稳定训练。
  • sequence-level reward 更接近“整段输出好不好”,但长链路任务里方差会变大,尤其是 agent 任务中,一次工具调用错误会影响后续很多步。换句话说,长程场景下,sequence-level 信号未必带来稳定收益,token-level 的偏差-方差折中更实用。

数学题短推理、标准答案明确时,sequence-level reward 可以配合 GRPO 使用;长程 agent、工具调用、多轮状态更新这类任务里,token-level distillation 更适合提供局部稳定信号,最终正确性仍然需要 verifier 或环境奖励校正。

第五组是 teacher proxy 和真实环境反馈的权衡。

  • OPD 的监督来自 teacher 分布,信号稠密、收敛快,但它优化的是“更像 teacher 认可的输出”。如果 teacher 的偏好和真实环境反馈高度一致,OPD 会很有效;如果 teacher 本身有缺陷,student 会把这些缺陷一起学进去。
  • RL 的奖励通常来自答案正确性、工具执行结果或 benchmark verifier,更接近任务环境本身。它的信号更稀疏、训练更慢、方差更大,但在跨环境泛化上可能更强,因为它直接优化的是最终任务反馈。

换句话说,各领域经过 RL 产出 Teacher 后,OPD 学习的是稠密化的中间思维范式信号,并非 RL 那种基于最终结果的稀疏奖惩。OPD 优化目标只复刻教师的思维范式,不直接优化下游最终效果;思维范式优质则学生能力提升,范式存在缺陷就会被模型钻空子投机拟合。

弱 student 投机拟合:reverse KL 把 teacher log probability 当作奖励,student 会倾向生成 teacher 偏好的内容;如果 teacher 对重复文本、低 PPL 片段给出过高概率,弱 student 可能放大这个短板,生成重复段落。这个现象说明 OPD 的 dense reward 并不等于真实任务 reward,必要时仍需要 verifier、离散真值奖励或 RL 阶段校正。

第六组是推理覆盖和训练稳定性的权衡。

  • 长序列 distillation 能覆盖更完整的推理过程,但也会放大 reverse KL 的 entropy collapse 和 length inflation。论文里固定 4096-token reverse KL 会把输出长度推到接近生成上限。
  • entropy-gated length curriculum 从短长度开始,只有 held-out entropy 还健康时才增加训练长度。

关于entropy-gated length curriculum,具体地说,设当前训练长度为 $L_m$,held-out set 上的平均 token entropy 为 $H_m$,预设稳定阈值为 $H_{\min}$。只有当:

\[H_m \geq H_{\min}\]

才把训练长度从 $L_m$ 提升到 $L_{m+1}$;如果 entropy 已经低于阈值,就停止继续加长,或停在当前长度继续训练。这个 curriculum 把“能不能训练更长”交给 entropy 这个稳定性信号判断。

在 Qwen3-4B teacher 下,固定 4096-token student-prefix reverse KL 的 mean Avg@$k$ 是 36.4,Pass@$k$ 是 48.3,平均长度约 8185;length curriculum 后 mean Avg@$k$ 到 40.0,Pass@$k$ 到 54.1,平均长度降到 2688。这里的重点在于:长度要受 entropy 和输出行为约束。

可以把选择规则整理成下面这样:

场景更合适的选择理由
冷启动、先学会格式和基本任务teacher-prefix forward KL / SFT便宜、稳定、数据可缓存
student 经常在自己的中间状态走偏student-prefix training训练状态更接近部署分布
训练后直接部署,重视单次输出质量reverse KL / OPD更偏向 mode seeking,standalone accuracy 可能更强
训练后还要接 GRPO/RLVRforward KL 或 forward-heavy KL mixing保留 entropy 和探索空间
不确定 forward/reverse 哪个更稳JSD 或 KL mixing ablation中间目标能更清楚暴露精度、熵和稳定性的取舍
资源充足、师生 tokenizer 对齐full-vocabulary KL目标更精确,方差更低
资源受限或先做小实验Top-k / sampled approximation成本低,但需要标注近似偏差
多领域能力融合,担心 mixed RL 遗忘MOPD / RL teacher + OPD 回灌OPD 收敛更快,用较少步数吸收领域能力,降低遗忘风险
长程 agent 或工具任务token-level distillation + verifier/RL rewardOPD 提供局部稠密信号,最终结果由环境反馈约束
长序列训练不稳定entropy-gated length curriculum避免 entropy collapse 和 length inflation

常见变体

MOPD

MOPD(Multi-Teacher On-Policy Distillation)把单 teacher OPD 扩展到多领域 teacher。它的目标是把多个领域专家合并到同一个 student 里,而不只学习单个 teacher 的能力。典型流程是:先在不同领域分别训练 teacher,例如数学、代码、工具使用、安全等;再让 student 按自己的当前策略生成 rollout;最后根据样本所属领域选择对应 teacher,用该 teacher 的 token-level log probability 构造 OPD 信号。

如果第 $d$ 个领域的 teacher 记为 $\pi_T^{(d)}$,那么在该领域样本上,MOPD 可以沿用普通 OPD 的 log-ratio reward:

\[r_t^{(d)} = \log \pi_T^{(d)}(y_t\mid s_t) - \log \pi_\theta(y_t\mid s_t)\]

MOPD 把“训练领域专家”和“融合领域能力”解耦,让不同领域 teacher 可以独立训练,再通过 on-policy distillation 合并到一个 student;同时保留 OPD 的 student-prefix 状态对齐和 token-level dense supervision,缓解多领域后训练里的能力冲突和遗忘。

从 MIX-RL 的角度看,MOPD 的吸引力不只在于多 teacher 融合,还在于 OPD 的收敛速度和工程组织方式。单独对多个领域做 mixed RLVR 时,训练轮次往往更长,领域之间的奖励目标也更容易冲突;串行分领域 RL 又会带来链路瓶颈,前序任务训练出错可能拖累后续任务,跨团队协作成本也更高。MOPD 则允许各领域团队独立迭代自己的数据、reward 和 teacher,再用少量 OPD steps 把这些能力回灌到 student。它利用的是 OPD 的 dense token-level supervision,因此可以用更短训练吸收 teacher 的能力,降低训练成本和灾难性遗忘。

参考:MOPD: Multi-Teacher On-Policy Distillation for Capability Integration in LLM Post-Training,arXiv: https://arxiv.org/abs/2606.30406 。MiMo-V2-Flash 技术报告也把 MOPD 作为 post-training 核心阶段之一:https://arxiv.org/html/2601.02780v1 。

CoPD

CoPD(Co-Evolving Policy Distillation)进一步改变了 MOPD 的训练节奏。MOPD 通常先把多个领域 expert 训练好,再把它们蒸馏到 student;CoPD 则让多个 expert branch 在训练过程中共同进化。它按 cycle 训练,每个 cycle 包含两个阶段:第一阶段是 branch-specific RLVR,第二阶段是 mutual OPD。前者让每个 branch 继续增强自己的领域能力,后者把这些新能力同步给其他 branch。

第一阶段是 branch-specific RLVR。第 $k$ 个 branch 在自己的数据 $\mathcal D_k$ 和奖励函数 $r_k$ 上训练 $S_{\mathrm{RL}}$ 步,得到:

\[\theta_k^{(n,\mathrm{I})} = \texttt{RLVR} \left( \theta_k^{(n-1)}; \mathcal D_k, r_k, S_{\mathrm{RL}} \right)\]

第二阶段是 mutual OPD。以两个 branch $j,k$ 为例,branch $k$ 在 branch $j$ 的数据 $x’\sim\mathcal D_j$ 上生成 rollout。branch $j$ 对这些 token 提供监督,cross-branch token signal 写成:

\[\delta_{i,t}^{(k\leftarrow j)} = \log \pi_{\theta_j}(y_{i,t}^{(k)}\mid x',y_{i,<t}^{(k)}) - \log \pi_{\theta_k}(y_{i,t}^{(k)}\mid x',y_{i,<t}^{(k)})\]

更新 branch $k$ 时,把这个信号按权重放进 token-level advantage:

\[\hat A_{i,t}^{(k)} = \beta_k \delta_{i,t}^{(k\leftarrow j)}\]

这个阶段训练 $S_{\mathrm{OPD}}$ 步,可以概括为:

\[\theta_k^{(n)} = \texttt{OPD} \left( \theta_k^{(n,\mathrm{I})}; \mathcal D_j, \pi_{\theta_j}, S_{\mathrm{OPD}} \right)\]

把两步放在一起,第 $n$ 个 cycle 可以写成:

\[\theta_k^{(n-1)} \xrightarrow{\ \mathrm{RLVR\ on\ }\mathcal D_k\ } \theta_k^{(n,\mathrm{I})} \xrightarrow{\ \mathrm{OPD\ from\ branch\ }j\ } \theta_k^{(n)}\]

训练过程会不断重复这个 cycle。这样可以避免等 expert 完全收敛后再蒸馏时 teacher-student 行为差距过大。因为所有 branch 从同一个 base 出发,并且训练中持续互相蒸馏,最终可以用简单参数 merge 得到统一模型。论文实验里,CoPD 在 text/image/video reasoning 的多能力融合上优于 mixed RLVR 和 MOPD。

参考:Co-Evolving Policy Distillation,arXiv: https://arxiv.org/abs/2604.27083 。

ROPD

ROPD(Rubric-based On-policy Distillation)处理的是 black-box teacher 场景。普通 OPD 需要 teacher logits 或 token-level probability,ROPD 只使用 teacher 的文本 response:先让 teacher 和 student 都在同一个 prompt 上生成答案,再让 Rubricator 从二者差异中归纳 prompt-specific rubrics,最后用 Verifier 按 rubrics 给 student rollout 打分,把分数作为 GRPO reward。

对一个 prompt $x$,先采样 $m$ 个 teacher responses 和 $n$ 个 student rollouts:

\[y_j^T \sim \pi_T(\cdot\mid x), \quad y_i^S \sim \pi_\theta(\cdot\mid x)\]

然后生成该 prompt 对应的 rubric set:

\[\mathcal C_x = \mathrm{Rubricator} \left( x, \mathcal Y_x^T, \mathcal Y_x^S \right) = \{c_k\}_{k=1}^{K}\]

其中每个 rubric item 写成:

\[c_k=(\rho_k,w_k)\]

$\rho_k$ 是文字标准,$w_k$ 是权重。Verifier 对第 $i$ 个 student rollout 和第 $k$ 条 rubric 做二值判断:

\[v_{i,k} = \mathrm{Verifier} \left( x, y_i^S, c_k \right), \quad v_{i,k}\in\{0,1\}\]

最后把加权通过率作为 response-level reward:

\[r_i = \frac{ \sum_{k=1}^{K} w_k v_{i,k} }{ \sum_{k=1}^{K} w_k+\epsilon }\]

ROPD 和 OPD 的关系在于:它保留 student on-policy rollout 这一点,但把 teacher logits 换成了 rubric-derived reward。这样可以接入闭源 teacher,也能避免跨 tokenizer、跨架构时的 token-level logit 对齐问题;代价是信号从 token-level dense supervision 变成 response-level reward,效果更依赖 rubric 和 verifier 的质量。论文实验通常让 teacher 同时担任 Rubricator 和 Verifier,并用 GRPO 更新 student。

参考:Rubric-based On-policy Distillation,arXiv: https://arxiv.org/abs/2605.07396 。代码:https://github.com/Peregrine123/ROPD_official 。

OPRD

OPRD(On-Policy Representation Distillation)把 OPD 的监督对象从 output space 移到 hidden-state space。两个主要动机:

  1. sampled-token OPD 的梯度有采样方差,top-$k$ 或 full-vocabulary KL 又会带来计算和显存压力;OPRD 的 hidden-state MSE 在给定 rollout 后是确定监督,不需要在词表上采样或截断。
  2. LM head 会压缩 teacher 的中间表征,output-space loss 看不到许多隐藏状态方向;OPRD 直接约束中间层,能利用 teacher 的 per-layer structural information。

设 student rollout 为:

\[\hat y\sim\pi_\theta(\cdot\mid x)\]

记 $h_{\theta,t}^{(l)}$ 为 student 在第 $l$ 层、第 $t$ 个位置的 hidden state,$h_{T,t}^{(l)}$ 为 teacher 在同一条 rollout 上的 hidden state。给定蒸馏层集合 $\mathcal L_{\mathrm{layer}}$ 和位置 mask $m_t$,OPRD 的基本目标是:

\[\mathcal{L}_{\mathrm{OPRD}}(\theta) = \mathbb{E}_{x\sim\mathcal D_x,\ \hat y\sim\pi_\theta(\cdot\mid x)} \left[ \frac{1}{|\mathcal L_{\mathrm{layer}}|} \sum_{l\in\mathcal L_{\mathrm{layer}}} \frac{1}{\sum_{t=1}^T m_t} \sum_{t=1}^T m_t \frac{1}{d} \left\| h_{\theta,t}^{(l)} - \operatorname{sg} \left( h_{T,t}^{(l)} \right) \right\|_2^2 \right]\]

其中 $\operatorname{sg}$ 表示 stop-gradient,只更新 student;$d$ 是 hidden dimension。论文通常在长 CoT 场景下选择最后 $k$ 个 response token,并可选择单层、多层或所有层做监督。直觉是:output-space OPD 只看 LM head 之后的 token distribution,OPRD 直接利用 teacher 已经算出的中间层结构信息。

OPRD 也可以和普通 OPD 相加:

\[\mathcal L(\theta) = \mathcal L_{\mathrm{OPD}}(\theta) + \mu \mathcal L_{\mathrm{OPRD}}(\theta), \quad \mu\ge 0\]

参考:OPRD: On-Policy Representation Distillation,arXiv: https://arxiv.org/abs/2606.06021 。代码:https://github.com/ShenzhiYang2000/OPRD 。

OPSD

OPSD(On-Policy Self-Distillation)把 OPD 里的 teacher 换成同一个模型在 privileged context 下的版本。给定问题 $x$ 和参考解 $y^\star$,同一个参数模型被放在两个上下文里使用:

\[p_T(\cdot\mid x,y^\star) = p_\theta(\cdot\mid x,y^\star), \quad p_S(\cdot\mid x) = p_\theta(\cdot\mid x)\]

$p_T$ 能看到参考解或标准推理,$p_S$ 只能看到推理时真正可见的问题。训练时先从 student 分布采样 on-policy rollout:

\[\hat y\sim p_S(\cdot\mid x)\]

然后在同一条 rollout prefix 上,让 privileged teacher 给出更细的 token-level 分布监督。若第 $n$ 个 token 前缀记作 $\hat y_{<n}$,OPSD 的逐 token 对齐可以写成:

\[D(p_T\|p_S)(\hat y\mid x) = \frac{1}{|\hat y|} \sum_{n=1}^{|\hat y|} D \left( p_T(\cdot\mid x,y^\star,\hat y_{<n}) \parallel p_S(\cdot\mid x,\hat y_{<n}) \right)\]

整体目标为:

\[\mathcal L(\theta) = \mathbb E_{(x,y^\star)\sim\mathcal S} \mathbb E_{\hat y\sim p_S(\cdot\mid x)} \left[ D(p_T\|p_S)(\hat y\mid x) \right]\]

直觉是,同一个模型在“看过答案”的条件下,往往能给出更可靠的下一 token 分布;把这个分布蒸馏回只能看问题的 student,可以在不引入外部 teacher 和 reward model 的情况下得到 dense supervision。风险是,privileged context 里的信息线上不可见。如果任务的参考解包含实例特有的信息,student 可能学到依赖特权信息的模式,表现为信息泄露或对训练分布的投机拟合。后续 RLSD 正是围绕这个问题重新组织 OPD 与 RLVR 的关系。

参考:On-Policy Self-Distillation for Large Language Models,arXiv: https://arxiv.org/abs/2601.18734 。

OPCD

OPCD(On-Policy Context Distillation)把 context distillation 和 OPD 接在一起:student 在不看额外上下文的情况下生成自己的 on-policy rollout,teacher 则在同一条 rollout prefix 上读取上下文 $c$,给出 context-conditioned token distribution。

给定输入 $x$ 和待内化的上下文 $c$,student 先生成:

\[y\sim\pi_\theta(\cdot\mid x)\]

teacher 在每个 prefix 上读取 $[c;x;y_{<t}]$,student 只读取 $[x;y_{<t}]$。OPCD 最小化 student rollout 上的 token-level reverse KL:

\[\mathcal{L}(\theta) = \mathbb{E}_{(x,c)\sim\mathcal D,\ y\sim\pi_\theta(\cdot\mid x)} \left[ \frac{1}{|y|} \sum_{t=1}^{|y|} D_{\mathrm{KL}} \left( \pi_\theta(\cdot\mid x,y_{<t}) \parallel \pi_{\mathrm{teacher}}(\cdot\mid c,x,y_{<t}) \right) \right]\]

它的目标是把临时上下文里的知识、经验、系统 prompt 或行为规范压进模型参数,让 student 推理时不再需要显式携带这段上下文。

论文实验里有两个典型应用:

  1. experiential knowledge distillation,把历史解题轨迹抽象成经验条目后蒸馏进模型;
  2. system prompt distillation,把优化后的系统提示词内化为模型行为。

反例:直接把 raw trace 放进上下文可能降低效果,Qwen3-8B 数学验证集上 Base 为 75.1,Raw Trace 为 70.5,抽象后的 Knowledge 为 77.4,继续做 OPCD 后到 79.7。换句话说,上下文需要提炼。

关于 OPCD 的讨论:

  • OPCD 更适合难以拿到 0/1 离散奖励的场景。任务结果无法核验、用户反馈以自然语言给出、工具报错或环境反馈不容易写成 verifier 时,可以把这些信息放进上下文,让 context-conditioned teacher 转成 dense token supervision。
  • 它适合参数迭代式持续学习:模型上线后持续收到用户轨迹、OOD 输入、工具失败、偏好变化,再周期性通过上下文蒸馏把这些经验压进参数。这个方向和 Claude Code 依靠外部技能库的免参数路线不同,OPCD 更偏向把经验固化进模型权重。
  • 上下文质量是核心瓶颈。随意拼接原始轨迹会让 teacher distribution 变得不可靠,小模型尤其容易被长日志、重复答案、工具轨迹分散注意力。更稳的做法是把原始轨迹提炼成高层、条目式、可复用的经验知识。
  • prompt 不能过度贴合单个样本。高度抽象、条目式的 seed prompt 往往比细碎的定制 prompt 更好;原因是模型预训练和指令微调更熟悉“高层规则/规范”这种输入形式。
  • teacher 也可能需要专门校准。标准 OPD 的 teacher prompt 通常更稳定,OPCD 的上下文来源复杂,可能包含错误轨迹、工具报错和模糊反馈。收集 teacher 纠错样本、微调 teacher,能提高 context-conditioned teacher distribution 的可靠性。
  • 对长程 agent,OPCD 的优势在于不必等完整 rollout 结束后拿最终 reward。只要有 partial rollout 和可用上下文,teacher 就能在中间 prefix 上给 token-level 学习信号。

参考:On-Policy Context Distillation for Language Models,arXiv: https://arxiv.org/abs/2602.12275 。

RLSD

RLSD(Self-Distilled RLVR / RLVR with Self-Distillation)保留 OPSD 的 privileged teacher,但改变它在优化里的角色:环境或 verifier 给出的 RLVR reward 决定更新方向,teacher-student 的分布差只调节每个 token 的更新幅度。

先把 RLVR 给一条 response 的序列级优势记作 $A$。在普通 GRPO 里,这个 $A$ 通常会被同一条 response 的所有 token 共享。RLSD 额外计算 privileged teacher 与 student 在第 $t$ 个 token 上的 log-ratio:

\[\Delta_t = \operatorname{sg} \left( \log P_T(y_t) - \log P_S(y_t) \right)\]

其中 $\operatorname{sg}$ 表示 stop-gradient。这个值衡量 privileged teacher 相比 student 是否更支持当前 token。RLSD 再把它变成 evidence ratio:

\[w_t = \exp \left( \operatorname{sign}(A)\Delta_t \right) = \left( \frac{P_T(y_t)}{P_S(y_t)} \right)^{\operatorname{sign}(A)}\]

如果整条 response 的 verifier reward 是正的,teacher 更支持的 token 会得到更大的更新幅度;如果 verifier reward 是负的,teacher 更支持的 token 会被更强地压低。实践中还会对 $w_t$ 做裁剪,并用系数 $\lambda$ 控制 self-distillation 信号强度:

\[\hat A_t = A\cdot \left( (1-\lambda) + \lambda\cdot \operatorname{clip} (w_t,1-\epsilon_w,1+\epsilon_w) \right)\]

于是原本共享的序列级优势 $A$ 被替换成 token-level 的 $\hat A_t$:

\[\Delta\theta \propto \mathbb E_{y\sim P_S(\cdot\mid x)} \left[ \sum_t \hat A_t \nabla_\theta \log P_S(y_t\mid x,y_{<t}) \right]\]

因为裁剪后的 $w_t$ 仍为正数,$\hat A_t$ 的符号由 $A$ 决定,teacher 不能直接反转 verifier 给出的好坏方向。这样一来,RLSD 可以把 OPSD 的 dense token signal 用作 credit assignment 的细化,同时保留 RLVR 对最终答案正确性的约束。若 $\lambda$ 衰减到 $0$,或者 $w_t$ 接近 $1$,这个目标会退化回普通 GRPO。

参考:Self-Distilled RLVR,arXiv: https://arxiv.org/abs/2604.03128 。

相关讨论

折扣因子

把 OPD 写成 policy-gradient-style 目标时,teacher 和 student 在第 $t$ 个 token 上的 log-ratio 可以看成一个 dense reward:

\[r_t = \log p_T(y_t\mid s_t) - \log q_\theta(y_t\mid s_t)\]

如果沿用 RL 里的 return 写法,第 $t$ 步的回报可以写成:

\[G_t = \sum_{u=t}^{T} \gamma^{u-t}r_u\]

这里 $\gamma$ 就是折扣因子。若 $\gamma=0$,则:

\[G_t=r_t\]

这时第 $t$ 个 token 的梯度只看当前 token 自己的 teacher feedback,不把后续 token 的 reward 传回来。对应的 loss 可以写成:

\[\mathcal L_{\gamma=0} = - \sum_{t=1}^{T} \operatorname{sg}(r_t) \log q_\theta(y_t\mid s_t)\]

其中 $\operatorname{sg}$ 表示 stop-gradient。这个形式就是 token-level OPD:每个 token 独立接收 teacher 的反馈。若 $\gamma>0$,则早期 token 会接收到未来 token 的 reward:

\[\mathcal L_{\gamma} = - \sum_{t=1}^{T} \operatorname{sg}(G_t) \log q_\theta(y_t\mid s_t)\]

这更接近 sequence-level credit assignment,因为当前 token 会为后续轨迹质量承担一部分责任。

经验判断是:

  • $\gamma=0$ 有偏,但方差低,工程上稳定
  • $\gamma>0$ 更完整地考虑未来 reward,但长程轨迹下方差会明显变大。

已有讨论和实验里,把折扣因子设成非零通常没有带来稳定收益,尤其在长文本、长 CoT 或 agent 任务中,未来 token 的 reward 很容易变成高方差信号。因此当前更常用的 OPD 实现仍然偏向 token-level 形式,把最终正确性留给 verifier、GRPO 或环境奖励处理。

Loss 写法与 Reward 写法

OPD 的实现里常见两种写法。

  1. 第一种可以叫 GKD / Loss Style:先让 student rollout 得到 prefix,再在每个 prefix 上计算 teacher 分布和 student 分布之间的 KL,把这个 KL 当作普通训练 loss 反传。
  2. 第二种可以叫 PG Style:仍然让 student rollout,但不把完整 KL 当作 loss,而是只看 student 实际采样出的 token,把 teacher 和 student 对这个 token 的 log probability 差值写成 reward,再用 policy gradient 更新 student。

换句话说,“把 KL 写成普通 loss 反传”,对应的是直接优化:

\[D_{\mathrm{KL}} \left( q_\theta(\cdot\mid s_t) \| p(\cdot\mid s_t) \right)\]

“把 teacher-student log-ratio 写成 reward 再走 policy gradient”,对应的是先定义:

\[r(a,s_t) = \log p(a\mid s_t) - \log q_\theta(a\mid s_t)\]

然后用:

\[r(a,s_t) \nabla_\theta \log q_\theta(a\mid s_t)\]

作为采样 token $a$ 上的更新信号。问题是:这两种写法究竟是在做两件事,还是同一件事的两种实现?

仍然只看一个 token 位置。记当前 prefix 为 $s_t=(x,y_{<t})$,student 分布为:

\[q_\theta(a\mid s_t)\]

teacher 分布为:

\[p(a\mid s_t)\]

其中 $a$ 是下一个 token。reverse KL 的 loss 写法是:

\[\mathcal L_{\mathrm{rev}}(\theta) = D_{\mathrm{KL}} \left( q_\theta(\cdot\mid s_t) \| p(\cdot\mid s_t) \right) = \sum_{a\in\mathcal V} q_\theta(a\mid s_t) \left[ \log q_\theta(a\mid s_t) - \log p(a\mid s_t) \right]\]

对 $\theta$ 求梯度。为了减轻符号负担,下面省略条件 $s_t$:

\[\nabla_\theta \mathcal L_{\mathrm{rev}} = \sum_a \nabla_\theta q_\theta(a) \left[ \log q_\theta(a)-\log p(a)+1 \right]\]

利用:

\[\nabla_\theta q_\theta(a) = q_\theta(a)\nabla_\theta\log q_\theta(a)\]

可以写成:

\[\nabla_\theta \mathcal L_{\mathrm{rev}} = \mathbb E_{a\sim q_\theta} \left[ \nabla_\theta\log q_\theta(a) \left( \log q_\theta(a)-\log p(a)+1 \right) \right]\]

其中 $+1$ 这一项在期望里为零:

\[\mathbb E_{a\sim q_\theta} \left[ \nabla_\theta\log q_\theta(a) \right] = \sum_a q_\theta(a)\nabla_\theta\log q_\theta(a) = \sum_a \nabla_\theta q_\theta(a) = \nabla_\theta 1 = 0\]

因此:

\[-\nabla_\theta \mathcal L_{\mathrm{rev}} = \mathbb E_{a\sim q_\theta} \left[ \left( \log p(a)-\log q_\theta(a) \right) \nabla_\theta\log q_\theta(a) \right]\]

这就是 policy gradient 的形式。也就是说,如果定义 dense reward:

\[r(a,s_t) = \log p(a\mid s_t) - \log q_\theta(a\mid s_t)\]

那么最大化 reward 的 PG 更新方向就是最小化 reverse KL 的更新方向:

\[\nabla_\theta J = \mathbb E_{a\sim q_\theta} \left[ r(a,s_t) \nabla_\theta\log q_\theta(a\mid s_t) \right]\]

full-vocabulary reverse KL 是对整个词表求和,方差低,但计算和显存开销高;reward 写法是在 $a\sim q_\theta$ 下用采样 token 估计这个期望,计算更轻,也更容易接入 PPO、GRPO 这类 RL 框架,但方差更高。此外,“top-1 采样形式”,指的就是每个 token 位置只用实际采样出来的一个 token 来估计 full-vocabulary 目标。

对比而言,forward KL 的结构不同:

\[\mathcal L_{\mathrm{fwd}}(\theta) = D_{\mathrm{KL}} \left( p(\cdot\mid s_t) \| q_\theta(\cdot\mid s_t) \right) = \sum_a p(a\mid s_t) \left[ \log p(a\mid s_t) - \log q_\theta(a\mid s_t) \right]\]

由于 $p$ 不依赖 $\theta$,梯度为:

\[\nabla_\theta \mathcal L_{\mathrm{fwd}} = - \mathbb E_{a\sim p} \left[ \nabla_\theta\log q_\theta(a\mid s_t) \right]\]

这个期望来自 teacher 分布 $p$,更像 SFT / cross-entropy;上面的 reverse KL 则来自 student 当前分布 $q_\theta$,天然对应 on-policy policy gradient。JSD、GSD 这类目标还会引入中间分布或额外混合项,梯度结构更复杂,不能直接化成一个干净的 “teacher log-ratio reward $\times$ policy gradient”。

换句话说,在 reverse KL 下,loss 写法和 reward 写法对应同一个 OPD 目标,只是一个用 full-vocabulary / top-k KL 直接反传,一个用采样 token 做 policy-gradient 估计。选择哪一种,主要取决于工程条件:是否能承受 full-vocabulary / top-k KL 的开销,是否已有 PPO/GRPO 训练栈,能接受多少采样方差,以及是否需要和外部 verifier reward 放在同一个 RL 框架里。

发展与落地

参考:https://mp.weixin.qq.com/s/dgZ9Iy2ercIrynrdsXFOMA

OPD 已经从“一个新算法”变成后训练 pipeline 里的配套工具。它最稳定的价值是把已有 teacher、已有上下文、已有经验里的能力迁移给 student;是否能像 RLVR 一样持续突破模型原有能力边界,还没有统一结论。

  • 工业后训练 pipeline。 OPD 更像 RL/RLVR 之后的能力回灌和能力修复工具。RLVR 通过结果奖励训练出领域能力,OPD 再用 dense token-level supervision 把这些能力快速迁移给目标模型。它的优势是收敛快、训练步数少、对灾难性遗忘更友好;局限是它主要复刻 teacher 行为,难以凭空创造 teacher 没有的能力。
  • 小模型蒸馏与端侧部署。 大模型蒸馏小模型是当前最清楚的落地场景之一。SFT 提供基础行为,OPD 让小模型在自己的 on-policy 轨迹上吸收 teacher 的局部决策信号,减少 off-policy 蒸馏里的曝光偏差。SFT+OPD 很可能成为小模型、端侧模型的标准后训练组合。
  • 多领域合版。 混合 RLVR 容易出现 reward 冲突和训练遗忘,串行分领域训练又有链路瓶颈。MOPD、CoPD 这类多 teacher / 多 branch 方案把各领域 teacher 的能力用 OPD 融合到统一 student 中,工程上更适合多团队并行迭代。
  • 持续学习与 OPCD。 Self-OPD、OPCD 被认为更贴近 online / continual learning:模型上线后持续收到真实用户交互、OOD 任务、工具报错、文本反馈,再通过上下文蒸馏回灌。即把模糊反馈整理成可用上下文,让 context-conditioned teacher 在 partial rollout 上提供学习信号。
  • 长程 agent 与 partial rollout。 长上下文 OPD 有明显风险:student 前缀越长,轨迹越可能偏离 teacher 分布,teacher 在偏移 prefix 上给出的监督会变噪。可以有局部 Self-OPD、截断生成区间、只训练前段 token 等做法;实验中只对回复靠前 10% 做 OPD,效果接近全量文本。这说明长程 agent 不一定要完整 rollout 到末尾,前段行为模式可能已经决定后续走向。
  • 黑盒、跨词表和通用反馈。 算法层面的微调越来越多,但真正贴近工业基座模型团队的难点是黑盒 teacher、跨 tokenizer / 跨词表蒸馏、文本反馈和生成式 reward。ROPD、OPCD、RLSD 都是在绕开“必须拿到 full logits 或明确 0/1 reward”这个限制。
  • 评测与数据瓶颈。 OPD 在 coding、agent、真实用户交互里很有潜力,但这些任务长、成本高、难批量复现;大厂有内部数据和模型闭环,学术界缺少标准 continue-learning benchmark。另一个现实问题是开源小模型和闭源强模型的 context utilization 能力差距很大,小模型上得到的结论未必能直接迁移到前沿大模型。
本文由作者按照 CC BY 4.0 进行授权