最近在调研大模型知识蒸馏时,有一类讨论非常有意思:On-Policy 蒸馏是否真的在蒸馏?这个问题听起来像绕口令,但背后牵扯的其实是知识蒸馏训练范式中一个容易被忽略的逻辑漏洞。如果学生模型用来请教老师的样本全部来自自己当前的输出分布,那么训练结束后,学生究竟学到了教师的知识边界,还是仅仅在自己的能力范围内变得更加自信?更进一步的追问是,当一条 On-Policy 样本被教师给出高分时,我们能不能确定这个高分是来自真实的语义对齐,还是来自学生恰好选了一条保守且平庸的路径?
这些问题最终指向一类无需额外监督信号的修正思路。本文将围绕一项相关工作——OPSA 方法展开精读,梳理 On-Policy 蒸馏的范式定义、潜在风险、核心解决思路,以及它对我们在工程中设计蒸馏任务有哪些直接启发。不管你是做 LLM 训练、微调,还是只对知识蒸馏方向感兴趣,这篇文章都会给你一套完整的分析框架。文中涉及的伪代码仅为工程化示意,用于帮助理解论文操作逻辑,并非官方源码。
1. 背景:知识蒸馏中一个容易忽略的逻辑问题
1.1 知识蒸馏的最小定义
知识蒸馏(Knowledge Distillation)最初在图像分类领域被广泛使用。一个已经训练好的大模型作为教师(Teacher),把预测分布中的“软信息”传递给小模型学生(Student),从而让学生不仅学会正确答案,还学会正确答案之外的类间相似度。例如,一张猫的图片,教师模型可能输出“猫 0.85、老虎 0.10、狗 0.05”,这 0.10 的老虎概率就包含了“猫和老虎在视觉特征上有一定相似性”的知识。
在大语言模型时代,蒸馏的形式更偏向序列级知识迁移。教师模型针对某个提示生成回答,学生模型学习这段回答的文本分布。常见的做法是构造一个包含提示和响应的数据集,然后让学生模型在教师响应上做最大似然估计或 KL 散度最小化。这样的做法可以理解为:用一批固定的、来自教师分布的数据去约束学生。
这个过程中,数据的分布是相对静态的。提示集固定,教师响应固定,学生只是在这个固定分布上做模仿逼近。它的优点是稳定,缺点也同样明显:学生能力的上限受限于离线数据覆盖的范围,很难学到数据中没有覆盖到的教师行为。
1.2 On-Policy 蒸馏为什么会出现
离线蒸馏的问题在强化学习社区看来非常熟悉。如果学生只在一个固定数据集上学习,那么它一旦遇到分布外输入,行为可能完全失控。于是,一个很自然的改进方案是让学生先自己尝试生成,再把学生生成的内容交给教师打分或纠正,进而利用教师反馈继续训练学生。
这种思路在形式上非常接近强化学习中的 On-Policy 采样。训练过程中,学生模型当前策略采样出响应,再使用教师信号评估该响应,最后反过来更新学生。于是就有了“On-Policy 蒸馏”这个说法。具体的训练目标可能是一系列设计的组合,比如让教师对学生生成的响应计算 KL 散度,或者让教师判断学生生成内容的优劣,再以这些信号作为训练权重。
表面上看,这个闭环比离线蒸馏更高效:学生每更新一步,采样分布就更接近当前策略,训练数据也更有针对性。但仔细想会发现一个潜在问题:学生问教师的每一个问题,都是学生自己已经知道怎么回答的问题。即使回答得不对,也只是在“自己熟悉的地方犯错”。那教师提供的纠正信息,本质上是局部的、受限的,并不等于覆盖了教师真正擅长的知识边界。
1.3 为什么“是否真在蒸馏”是一个严肃问题
蒸馏不是简单的模型压缩,它的本质是让学生从教师的决策逻辑中获得泛化能力。如果训练数据只来自学生当前的输出分布,那么学生很容易陷入一种状态:在自己已经能够较好处理的区域内,输出变得更平滑、更自信;但在自己原本不会的区域,因为根本没有机会采样到相关样本,所以始终没有得到教师的指导。
这会产生一个反直觉的结局——训练损失持续下降,评测指标看起来相当不错,但学生并没有变得更像教师,只是更像“一个经过平滑处理后的自己”。论文标题中“是否真在蒸馏”的疑问,本质上就是在质疑这种训练范式的有效性边界。
2. 标准蒸馏与 On-Policy 蒸馏的核心差异
2.1 标准响应蒸馏:固定分布上的模仿
为了把问题说清楚,我们先定义一个相对标准的蒸馏流程。给定提示集 X,教师模型 T 对每个提示生成响应 y_T。学生模型 S 的训练目标通常是:
L = E_{x ~ X} [ KL( S(· | x) || T(· | x) ) ]
或者更常见的是,在教师生成的离散文本 y_T 上做 teacher-forcing 训练:
L = - E_{x ~ X} Σ_t log S(y_T,t | x, y_T,<t)
这里 y_T 在训练前或者训练过程中以较低频率刷新,但整体上不依赖学生当前策略。教师是学生学习的“绝对标尺”,学生需要去够到一个外部给定的目标分布。这种方式的优点是训练稳定,学生不会因为自己当前策略的缺陷而无法获得某个区域的监督。
缺点是数据覆盖受限。如果教师在某些提示上的回答风格非常多样,但离线样本只保留了其中一种,学生就只会学到这一种,无法主动探索教师的其他合理行为。
2.2 On-Policy 蒸馏:学生采样,教师评判
On-Policy 蒸馏的核心变化是,监督信号来自学生自己的采样结果。具体训练循环可以写成这样:
- 给定提示 x,学生模型 S 按照当前策略采样一段响应 y_S。
- 将完整序列 (x, y_S) 交给教师模型 T。
- 教师模型基于这段学生输出给出某种反馈信号。
- 学生模型根据该反馈更新参数。
这种模式的优点非常明显,它可以在线产生和当前策略分布匹配的训练数据。学生哪里容易犯错,就从哪里采样,然后教师针对性地纠正。这种“哪里不会点哪里”的思路,理论上应该比静态数据更高效。
但问题也随之而来。由于 y_S 来自学生自己的分布,学生没有采样到的区域永远不会获得教师反馈。如果学生早期就对某个领域完全无知,导致采样概率极低,那么整个训练过程中,这个领域几乎不会进入监督范围。
| 对比维度 | 标准响应蒸馏(偏 Off-Policy) | On-Policy 蒸馏 |
|---|---|---|
| 数据来源 | 教师或固定数据集生成 | 学生当前策略采样 |
| 覆盖范围 | 取决于离线数据覆盖度 | 取决于学生策略探索范围 |
| 训练稳定性 | 较高 | 存在自增强风险 |
| 教师反馈含义 | 对固定目标分布的描述 | 对当前学生输出的局部修正 |
| 分布偏移 | 不太容易体现学生能力变化 | 数据分布随学生能力动态漂移 |
2.3 两者的训练信号差异
如果我们进一步拆解训练信号,差异会更加明显。在标准蒸馏中,教师给出的 token 级分布是独立于学生状态的。教师说“下一个词应该是 A 而不是 B”,这个判断不会因为学生当前是否倾向于生成 A 而改变。这种信号更接近“绝对知识”。
在 On-Policy 蒸馏中,教师看到的输入序列是学生生成的。教师给出的“A 比 B 好”的判断,不仅要考虑 x 本身,还要考虑学生已经生成的错误上下文。如果学生生成的上下文偏离了正常分布,教师的反馈更多是在“修正一个已经跑偏的对话”,而不是“示范正确的对话应该长什么样”。这种信号更适合称为局部纠正,而不是全局蒸馏。
理解这一点,是理解 OPSA 方法的关键前提。
3. On-Policy 蒸馏的隐忧:模型到底在学什么
3.1 教师给出高分,不代表学生学到了知识
在 On-Policy 蒸馏的训练循环里,学生采样响应后,教师会对该响应给出一个评分或分布反馈。当教师给出较高分数时,训练流程会认为“学生这次输出不错,应该强化”。但这个判断存在一个微妙的盲区:教师的高分可能是语义层面的认可,也可能是“虽然这句话表达一般,但毕竟是在当前上下文中比较安全的回答”。
举例来说,如果我们让教师评价一个代码修复建议,学生给出了一段语法完全正确但没有解决根本问题的代码。教师可能因为代码本身没有明显错误而给出不低的分数。学生收到正向强化后,会更倾向于生成类似模式的代码。它确实变流畅了,却没有更接近教师的深层推理能力。这就是典型的“伪对齐”:教师点头,并不等于学生学到了知识,只说明学生这次没有踩到教师明显不喜欢的区域。
3.2 分布偏移与自我巩固风险
On-Policy 采样会带来一个动态闭环。学生如果早期对某个风格有偏好,它的采样结果也会倾向于该风格,教师基于这些样本给出的反馈会继续强化这种风格。表面上学生是在向教师学习,实际上它在自己的局部最优区域里越走越深。这种效应类似于自训练(Self-Training)中的确认偏差,也和强化学习中过度利用、探索不足的问题同源。
尤其需要警惕的是,学生的错误模式可能会相互叠加。当学生连续生成多个在教师看来“勉强可用但不够好”的 token 后,教师不得不基于一个逐步偏离理想分布的序列做评判。教师给出的反馈因此越来越像“补丁”,而不是“蓝图”。补丁打得多了,学生自身生成分布的缺陷反而被掩盖,最终培养出一个充满内部妥协的模型。
论文中常提到的一个现象是,On-Policy 蒸馏在训练分布上的指标通常会不错。因为采样分布和训练分布同源,模型当然更擅长应对自己采样出来的数据。真正的问题暴露在分布外评测中:一旦提示风格、任务领域发生偏移,模型的真实泛化能力就会现出原形。
3.3 教师的纠正能力也是有限的
另一个容易被忽略的因素是教师模型本身的能力边界。教师虽然比学生强,但并非全知全能。当学生给出一个非常离谱的输出时,教师可能会尝试纠正最明显的错误,但不会顺带把更优的解题思路完整示范一遍。一次纠正的收益是有限的,多次纠正的累积效果也不一定等于一段高质量示范。
OPSA 相关工作最核心的出发点,就是意识到不加筛选的 On-Policy 监督信号中包含大量低质量、低信息量的样本。与其让这些样本平等地参与梯度更新,不如先对采样得到的监督信号做一次“质量甄别”,再把真正有助于学生接近教师决策边界的样本凸显出来。
4. 无需监督的 OPSA 方法核心原理
4.1 从“监督信号加权”到“采样调整”
OPSA 的全称可以理解为 On-Policy Sampling Adjustment,也就是对 On-Policy 采样得到的训练信号进行自适应调整。它和普通样本加权最大的区别在于不需要额外训练一个奖励模型或质量判别器。很多蒸馏方案会训练一个评估模型对样本打分,然后过滤低分样本。这样的做法需要额外的监督数据,而且评估模型自身的偏差也会引入新的噪声。OPSA 希望只利用学生和教师在前向传播过程中本身就存在的分布信息,就能判断哪些监督信号是有效的。
这种思路对训练管线非常友好。因为蒸馏训练中,学生和教师的 forward 计算本来就是必需的。我们不需要单独维护一个奖励模型,也不需要人工标注数据,只需要设计合适的指标,从学生采样序列与教师反馈序列的一致性中抽取信号。
这个“无需监督”的设定,是 OPSA 方法最具工程吸引力的地方。
4.2 从采样序列中发现“伪教学信号”
要理解 OPSA 的调整逻辑,需要先理解什么样的 On-Policy 样本是“低价值”的。一类典型的低价值样本是:学生生成的序列已经严重偏离任务目标,教师虽然可以纠正局部错误,但整段序列并没有展现出更优的推理路径。另一类低价值样本是:学生输出虽然流畅,但和教师偏好之间的分歧很小。如果学生已经会了,继续给高分只会让训练信号变得冗余。
反过来说,真正高价值的 On-Policy 样本,应该处在学生“稍微够一下就能达到教师水准”的区间内。学生在这个区间里犯错,但教师的纠正能把学生推向一个更优的局部区域。这个区间对应机器学习里常说的“合适难度”样本,不容易,但也没有难到完全无法学习。
问题在于,我们如何不用额外监督就识别出这类样本?
OPSA 的思路是观察学生当前输出与教师解码路径之间的对齐关系。这可以分为两个层面。第一个层面是分布层面:学生某个 token 位置上的预测分布和教师在同一位置的预测分布差异有多大。差异过小说明样本太简单,差异过大说明这个位置已经超出了学生当前的可学习范围。第二个层面是语义层面:一段学生输出中,哪些连续的 token 组成了一个完整的语义单元,在这个单元内部的对齐情况如何。
4.3 对齐分数计算与调整目标
用工程化的语言描述,我们可以为学生的每个采样序列计算一个对齐分数向量。对序列中的每个 token 位置 t,假设学生模型在当前上下文下输出的概率分布为 P_S(· | x, y_S,<t),教师模型对同一前缀输出的概率分布为 P_T(· | x, y_S,<t)。两个分布之间的差异可以用 KL 散度或 Jensen-Shannon 散度衡量。但直接用 token 级差异会过于碎片化,OPSA 类方法通常会先识别出语义块,再在语义块内汇总对齐信息。
高对齐的语义块意味着学生的局部决策和教师一致,较低但对齐趋势稳定的语义块则可能是值得学习的“最近发展区”。完全不对齐或剧烈震荡的语义块,则可能来自学生已经进入某种错误生成模式,此时继续强化或硬拉都会降低训练收益。
调整阶段可以有两种操作。一种是软加权:给不同语义块分配一个 0 到 1 之间的权重,让低质量监督信号对梯度的贡献变小。另一种是重采样:根据对齐分数调整后续采样策略,比如在低质量区域增加探索温度,或者重新从教师引导的上下文开始生成。两种操作并不互斥,实际中更常见的是先做软加权过滤,再对少数困难样本进行重采样补全。
4.4 无需监督的“监督信号”到底从哪来
看到这里,你可能会好奇:既然不需要额外的监督模型,那 OPSA 用什么来判断“当前语义块是否值得学习”?答案是,它用的仍然是训练过程中已有的信号,但把信号的组织方式从“绝对值”改成了“相对一致性”。
关键转变在于:我们不再问“教师喜不喜欢这段输出”,而是问“这段输出中学生与教师的分歧模式,是否被学生自身当前的能力分布所支持”。如果学生的高置信度区域与教师的高置信度区域高度重合,说明学生正在依赖可靠的内部知识;如果学生高置信度但教师低置信度,并且分歧方向不清晰,这类样本更可能来自过度自信的错误猜测。此时并不需要额外标注,只需要对比两套分布就能发现矛盾。
这种逻辑有点像利用模型自身的不确定性做样本修正,只是 OPSA 把它从图像分类、半监督学习迁移到了序列蒸馏场景,并且把粒度从整个样本细化到了语义作用域。
5. 代码视角:把 OPSA 思路写成可执行的伪代码
5.1 逐 Token 对齐状态计算
虽然论文不一定会公开可以直接复现的代码细节,但我们可以把 OPSA 的核心思想拆解成清晰的模块。第一个模块是逐 Token 的状态收集。我们需要同时跑学生和教师的前向传播,并记录每个 token 位置上的概率分布和隐状态。
下面是一段 PyTorch 风格的伪代码,只用于表达计算逻辑:
import torch import torch.nn.functional as F def collect_alignment_stats(student, teacher, input_ids): """ input_ids: 学生当前策略采样出的 token 序列 返回每个 token 位置的分布差异和隐状态相似度 """ with torch.no_grad(): s_logits, s_hidden = student(input_ids, output_hidden_states=True) t_logits, t_hidden = teacher(input_ids, output_hidden_states=True) s_probs = F.softmax(s_logits, dim=-1) t_probs = F.softmax(t_logits, dim=-1) # 用 KL 散度衡量分布差异:数值越大,分歧越明显 kl_div = F.kl_div( s_probs.log(), t_probs, reduction="none", log_target=False ).sum(dim=-1) # 用最后一层隐状态的余弦相似度衡量语义方向接近程度 s_vec = s_hidden.last_hidden_state t_vec = t_hidden.last_hidden_state cos_sim = F.cosine_similarity(s_vec, t_vec, dim=-1) return kl_div, cos_sim这段代码并不复杂,重点在于我们同时获得了分布层面和表示层面的对齐指标。分布层面的 KL 散度适合反映学生是否在“预测下一个词”这件事上和教师保持一致;表示层面的余弦相似度则能更细腻地反映两个模型在当前上下文中的内部理解是否同向。
5.2 在语义作用域上做自适应重加权
拿到逐 token 的对齐指标后,下一步是找出语义作用域并计算权重。逐 token 操作太碎,一个句子里可能有某个虚词导致 KL 散度异常,但整体语义仍然是高质量的。更合理的做法是先用简单规则把序列切成若干片段,比如按停顿词、标点、句子边界切分,再在每个片段上聚合对齐指标。
如果想要更精细,也可以用文本分割工具提取短语级别的语义单元。为了演示,下面用标点和换行作为粗略切分规则:
import re def segment_by_punctuation(text): # 按句子终止符切分,保留原始顺序 parts = re.split(r'(?<=[。!?.!?])\s*', text.strip()) return [p for p in parts if p] def compute_segment_weights(kl_div, cos_sim, token_ids, tokenizer, temperature=1.0): # 将 token 还原为文本后切分 decode_str = tokenizer.decode(token_ids, skip_special_tokens=True) sentences = segment_by_punctuation(decode_str) # 建立 token 到句子的粗略映射 weights = [] for sent in sentences: # 实际代码需要根据 token 偏移精确聚合 sent_len = max(len(tokenizer.encode(sent)), 1) seg_kl = kl_div[start: start + sent_len].mean() seg_cos = cos_sim[start: start + sent_len].mean() start += sent_len # 核心调整逻辑: # 1. KL 过大说明分歧噪声大,不应给太高权重 # 2. 余弦相似度低说明语义方向不一致,应降权 # 3. 两者都适中时,才是“可学习”样本 score = seg_cos / (1.0 + seg_kl) weight = torch.sigmoid((score - 0.5) / temperature) weights.append(weight.item()) return weights这里的 weight 计算只是一个示意思路。真实论文中的调整函数可能有更精细的设计,例如使用非线性映射、动态归一化、甚至逐层聚合隐状态信息。但核心逻辑是通用的:把“学生与教师的分歧程度”转化为“当前监督信号可信度”,然后用可信度去调制 Loss。
5.3 训练循环集成
最后,把上述逻辑放入一个训练循环。学生在每个 step 先采样一段响应,计算教师反馈时同步得到对齐指标,最后用 OPSA 权重重新缩放每个片段的 KL 损失:
def opsa_training_step(student, teacher, optimizer, prompt_ids, tokenizer): optimizer.zero_grad() # 1. 学生当前策略采样响应 student.eval() with torch.no_grad(): sampled_ids = student.generate( prompt_ids, max_new_tokens=128, do_sample=True, temperature=0.8 ) student.train() # 2. 联合前向,获得对齐统计量 kl_div, cos_sim = collect_alignment_stats(student, teacher, sampled_ids) # 3. 在语义片段上计算权重 seg_weights = compute_segment_weights( kl_div, cos_sim, sampled_ids, tokenizer ) # 4. 重构加权后的蒸馏损失 s_logits, _ = student(sampled_ids, output_hidden_states=True) t_logits, _ = teacher(sampled_ids, output_hidden_states=True) loss = weighted_kd_loss( s_logits, t_logits, sample_ids=sampled_ids, segment_weights=seg_weights, tokenizer=tokenizer ) loss.backward() optimizer.step() return loss.item()需要注意,采样和梯度传播之间必须做好状态隔离。学生在采样时应处于 eval 模式并使用 no_grad,避免采样过程中的随机性反向传播到模型参数中,导致训练不稳定。
5.4 一份实验配置示例
为了让工程复现更方便,我们还可以把关键超参数整理成一份 YAML 配置:
model: student_name: "Qwen/Qwen2.5-0.5B-Instruct" teacher_name: "Qwen/Qwen2.5-7B-Instruct" max_length: 1024 sampling: temperature: 0.8 top_p: 0.95 do_sample: true max_new_tokens: 256 opsa: enabled: true segment_mode: "sentence" # sentence / phrase / token weight_temperature: 1.0 min_weight: 0.05 low_kl_threshold: 0.1 high_kl_threshold: 5.0 training: batch_size: 4 grad_accumulation_steps: 8 learning_rate: 5e-6 lr_scheduler: cosine log_interval: 10 save_interval: 200配置参数需要根据你的模型和任务自行调整,上面只是演示 OPSA 思路落地时需要哪些控制项。核心思想是:不仅记录教师反馈,还要记录反馈与当前策略采样的对齐状态,再根据对齐状态调制学习目标。
6. 论文实验观察:哪些结论值得关注
6.1 局部 Token 对齐与全局语义效果的分离
论文在实验部分一个值得关注的发现是,直接基于逐 Token 的对齐指标做加权,并不一定带来整体收益。原因是 token 级分布中的噪声太大。某些停用词、语法连接词会让 KL 散度产生较大波动,但这些波动对语义迁移没有实际意义。只有把对齐信息汇总到更粗的语义粒度,比如句子、短语或完整的推理步骤后,调整信号才变得稳定。
这个现象和我们在文本生成中常见的经验一致。语言模型训练 loss 是一个逐 token 的负对数似然累加,但真正体现模型智能水平的是更宏观的语义规划能力。OPSA 在语义作用域上做调整,本质上就是在帮助训练过程把目光从“局部词预测”拉高到“整体语义推进”上。
6.2 训练稳定性和泛化能力的变化
另一个值得关注的方向是训练稳定性。从论文的表述逻辑来看,On-Policy 蒸馏之所以需要修正,是因为它会放大学生模型的早期偏好,形成一种内在的正反馈。OPSA 通过对低质量监督信号降权,相当于切断了这条自我强化的回路。学生不再盲目相信教师给出的每一个 positive feedback,而是有选择地吸收那些真正朝教师分布靠拢的信号。
在泛化能力方面,论文的核心观点是:经过 OPSA 调整后的学生模型,在分布外评测中会更稳定。这个结论的方向是符合直觉的。因为我们没有强迫学生把所有自身采样出的内容都向教师看齐,而是把学习压力集中在那些学生已经表现出一定潜力、只是尚未完全对齐的语义区域。
6.3 实验设置的启示
从工程复现的角度看,论文中的实验设置也给我们的训练管线提出了几个启示。第一,数据集中需要包含足够的提示多样性,否则无论采样策略如何调整,学生能探索的区域仍然有限。第二,温度参数会影响 On-Policy 采样的探索程度,温度过低会导致采样的响应高度集中,难以触发高价值的学习信号;温度过高则会产生太多噪声,让教师反馈失去语义重心。第三,模型的中间层对齐状态可能比最后一层更容易反映可学习性,尤其是对于层数差异较大的师生模型对。
当然,论文中的具体实验提升幅度会因模型规模、任务类型、蒸馏数据规模不同而有所差异。如果你在复现中发现效果不如预期,建议先检查采样配置和对齐指标的计算粒度,这两个模块通常是影响 OPSA 成效的关键因素。
7. 从论文到工程实践:给训练同学的参考
7.1 不要盲信 On-Policy 反馈
读这篇论文给我一个很直接的工程提醒:在任何蒸馏或自训练流程中,都不应该把“教师给了高分”当作样本一定有价值的充分条件。更稳妥的做法是,在训练日志中额外记录一组“样本对齐度”指标,比如学生与教师在语义片段上的 KL 散度、隐状态相似度,以及教师反馈分数的变动趋势。把这三者放在一起观察,才能区分模型是在稳步靠近教师,还是在某些局部区域里自嗨。
这种监控成本很低,只需要在 forward 时多保留几份中间结果,但对判断训练是否健康非常有帮助。
7.2 采样策略和蒸馏目标应该联动
很多训练流程把采样策略和蒸馏目标当成两个独立模块。采样端只负责生成候选响应,蒸馏目标端负责计算 Loss。OPSA 提醒我们,这两个模块应该共享对齐信息。采样时温度太高就会导致大量低质量监督信号进入 Loss,此时即便有 OPSA 降权,训练效率也依然不高。反过来,如果我们能在采样前就根据当前对齐状态动态调节温度或上下文前缀,那么采样质量会显著改善,需要降权的样本比例也会下降。
工程上可以设计一个简单的调节规则:当最近 N 个 batch 的片段平均对齐分数持续走低时,降低采样温度;当对齐分数一直很高,说明学生已经接近教师分布,可以提高温度以探索新的语义区域。这本质上是在训练过程中引入了针对“学习难度”的自适应控制。
7.3 OPSA 与 RLHF/DPO 的关系
熟悉大模型对齐训练的读者可能会联想到 RLHF 或 DPO。它们之间确实有交集,但目标不同。RLHF 使用奖励模型来反映人类偏好,强化学习算法更新学生策略,目标是让奖励最大化。DPO 则直接利用偏好对构造隐式奖励。OPSA 针对的目标是“学生和教师分布之间的对齐”,它更像是监督蒸馏阶段的一种样本修正方案,不一定要和奖励模型绑定。
在真实的训练管线中,OPSA 可以作为一个前置模块,先让学生更好地逼近教师分布,再进入 RLHF 阶段做人类偏好对齐。这样可以减少 RL 阶段对探索噪声的依赖,提高整个训练流程的稳定性。反过来,OPSA 也可以作为一种辅助信号融入 RLHF,作为奖励模型之外的正则项,避免策略在奖励最大化过程中跑偏。
7.4 轻量的可用替代方案
即使暂时没有资源完整复现 OPSA,也可以借鉴它的思想做一个轻量版本。最简单的做法是,在每次 On-Policy 采样后,用教师模型从同一起始上下文重新采样一条响应,然后与学生采样响应做一次序列级 BLEURT 或余弦相似度对比。相似度低的学生响应直接过滤。这样做虽然多了一路教师采样成本,但实现简单,也能部分缓解伪对齐问题。
另一个更省资源的方法是使用 perplexity 差异作为粗略代理。如果教师对学生响应的困惑度很低,但学生自身对该响应的困惑度也很低,说明两者高度一致,样本冗余;如果教师困惑度低而学生困惑度高,这类样本最值得学习。这个规则虽然粗糙,却能帮你快速筛选出 On-Policy 采样中真正有教学价值的子集。
7.5 警惕对齐指标本身的噪声
最后要强调的是,任何对齐指标都不是完美无缺的。KL 散度对分布差异敏感,但如果两个模型的词表不一致,计算前需要先统一词表或使用映射。余弦相似度依赖隐层维度,不同模型层的语义空间不一定可比。如果你使用的是异构师生模型,比如 LLaMA 教师 + Qwen 学生,直接比较中间层特征可能并不合理。此时可以退回到只比较输出分布层面的指标,或者先训练一个轻量映射层再做相似度计算。
OPSA 中“无需监督”听起来很美好,但在异构模型场景下,对齐指标的可靠性会打折扣。工程落地时,需要先验证指标本身的稳定性,再把它用于 Loss 调制,否则等于把噪声引入了训练目标。
8. 常见疑问复盘
| 疑问 | 通俗回答 | 工程建议 |
|---|---|---|
| On-Policy 蒸馏是否完全不可用 | 不是,它有很高的数据效率,但存在伪对齐风险 | 配合对齐指标使用,不要无条件信任教师反馈 |
| OPSA 是否需要额外训练一个判别器 | 不需要,信号完全来自学生和教师前向结果 | 实现时注意保存中间隐状态和逐 token 概率 |
| 是否只能在同源师生模型上使用 | 不限于同源,但异构模型需要处理特征空间不可比问题 | 优先使用分布层面的指标,而不是隐状态相似度 |
| 权重设置会不会让训练更不稳定 | 有这种可能,需要设置合理上下限 | 给权重加 min/max 限制,并用 EMA 平滑 |
| 这篇论文适合哪类读者 | 适合做大模型蒸馏、自训练和对齐训练的算法同学 | 也可以作为排查训练不收敛问题时的参考 |
结合以上内容,如果后续要做更深入的实验,可以优先复现两个对比:一是固定随机种子的情况下,普通 On-Policy 蒸馏与 OPSA 式调整在分布外数据集上的差距;二是不同语义切分粒度对最终效果的影响。这两组实验能帮助你更直观地理解论文中提出的问题,也能判断这种思路在你的业务场景里是否有效。
9. 写在最后:一次对训练目标的重新审视
9.1 蒸馏的本质是让模型学会边界,而不仅仅是拟合分布
知识蒸馏真正有价值的部分,不是让学生复现教师在某些样本上的输出,而是让学生理解教师决策背后的边界条件。什么时候应该自信,什么时候应该承认不确定,什么时候需要更长链路的推理。On-Policy 蒸馏之所以会遭受质疑,是因为它很容易把训练引导到一条只关注“当前策略下的局部修正”的窄路上。
OPSA 提供了一种无需额外监督的调整思路,通过学生采样序列与教师反馈之间的内在对齐信息,来区分哪些监督信号真正有助于学生逼近教师的知识边界。这个思路并不复杂,但它直击了 On-Policy 训练中一个非常本质的方法论问题:你要教学生的,到底是学生自己已经会做的事情,还是学生需要踮脚才能触及的教师能力。
9.2 为什么这个概念对工程落地很重要
在大模型训练成本高昂的环境下,很多团队会优先选择 On-Policy 类方法,因为它不依赖大规模离线标注,数据效率高。但如果学生只是在自我巩固,训练资源的浪费会比想象中更严重。引入对齐感知的样本调整机制,不需要额外标注,不需要额外训练模型,只需要修改训练循环中的 Loss 加权逻辑,就能在一定程度上避免这种浪费。
这种低成本的修正,恰恰是论文工作最有借鉴意义的地方。它提醒我们,在追逐更高指标的同时,要定期审视训练目标本身是否仍然成立。学生模型真正需要的不是教师在每个位置上的肯定,而是那些能把自身推出舒适区的有效监督。
希望这篇精读笔记能给你带来一些启发。如果你正在做知识蒸馏或 On-Policy 类训练,不妨试试在训练日志中加入对齐状态监控,再逐步过渡到更复杂的样本加权策略。理论上的“是否真在蒸馏”之问,最终需要靠实践中的指标和泛化表现来回答。