【论文学习】ON-POLICY DISTILLATION OF LANGUAGE MODELS: LEARNING FROM SELF-GENERATED MISTAKES
Q1:详细介绍方法章节,尽可能用通俗易懂的语言,不要遗漏任何细节。
https://swift.readthedocs.io/zh-cn/latest/Instruction/GKD.html
结合提供的ms-swift训练框架的训练文档,进一步介绍这个算法,并解释训练框架中涉及到的每一个参数
已收集到足够的信息。结合论文内容、ms-swift 官方文档以及相关资料进行综合整理,以下是 GKD 方法章节的完整详细介绍,并逐一对照 ms-swift 框架中的每一个训练参数。
GKD 方法详解 × ms-swift 框架参数全解析
一、背景问题:训练与推理的分布不匹配(Exposure Bias)
自回归语言模型在推理阶段是逐词生成的:模型先生成第1个词,再根据第1个词生成第2个词……如此循环,每一步都依赖前面所有步骤的输出。
传统知识蒸馏(Supervised KD)的训练方式是:把一批"标准答案序列"(来自人类标注或教师模型预先生成)喂给学生,让学生在这些完美序列的每个位置上模仿教师的词元概率分布。
问题在哪里?
训练时学生看的是完美序列的中间状态(如 "今天天气"),但推理时学生看的是自己生成的中间状态(如 "今天非常",可能包含错误)。当学生生成了一个错误词,后续所有预测都建立在这个错误之上,导致级联错误——一步错,步步错。这就是 Exposure Bias 问题。
二、GKD 的核心解决方案
2.1 基础符号定义
| 符号 | 含义 |
|---|---|
| pTp_TpT | 教师模型(Teacher)的概率分布 |
| pθSp_\theta^SpθS | 学生模型(Student)的概率分布,θ\thetaθ 是可学习参数 |
| xxx | 输入序列 |
| y=(y1,y2,...,yLy)y = (y_1, y_2, ..., y_{L_y})y=(y1,y2,...,yLy) | 输出序列,共 LyL_yLy 个词元 |
| y<ny_{<n}y<n | 第 nnn 个词元之前的所有词元(即前缀) |
| VVV | 词汇表,共 MMM 个词元 |
词元级散度定义(即衡量两个模型在序列 yyy 上的"差距"):
D(pT∥pθS)(y∣x):=1Ly∑n=1LyD(pT(⋅∣y<n,x)∥pθS(⋅∣y<n,x))D(p_T \| p_\theta^S)(y|x) := \frac{1}{L_y} \sum_{n=1}^{L_y} D\big(p_T(\cdot|y_{<n}, x) \| p_\theta^S(\cdot|y_{<n}, x)\big)D(pT∥pθS)(y∣x):=Ly1n=1∑LyD(pT(⋅∣y<n,x)∥pθS(⋅∣y<n,x))
直观解释:对于序列中的每一个位置 nnn,在给定相同前缀 y<ny_{<n}y<n 和输入 xxx 的条件下,计算教师模型和学生模型在整个词汇表上的概率分布之差,再求平均。
2.2 三种基准方法的局限
在介绍 GKD 之前,论文梳理了三种常见基准:
① 监督微调(Supervised FT,SFT)
仅用人工标注数据训练,完全不使用教师模型:
LSFT(θ)=E(x,y)∼(X,Y)[−logpθS(y∣x)]\mathcal{L}_{SFT}(\theta) = \mathbb{E}_{(x,y) \sim (X,Y)} \left[ -\log p_\theta^S(y|x) \right]LSFT(θ)=E(x,y)∼(X,Y)[−logpθS(y∣x)]
缺点:只能从标注数据中学习,无法充分利用教师模型的知识。
② 序列级知识蒸馏(SeqKD)
让教师模型预先生成一批输出序列,然后学生在这批序列上做监督微调。成本高(需要提前用大模型生成所有数据),且同样存在分布不匹配问题。
③ 监督知识蒸馏(Supervised KD)
学生在固定数据集的序列上,模仿教师模型的词元级概率分布:
LSD(θ)=E(x,y)∼(X,Y)[DKL(pT∥pθS)(y∣x)]\mathcal{L}_{SD}(\theta) = \mathbb{E}_{(x,y) \sim (X,Y)} \left[ D_{KL}(p_T \| p_\theta^S)(y|x) \right]LSD(θ)=E(x,y)∼(X,Y)[DKL(pT∥pθS)(y∣x)]
优于 SFT(利用了教师的软标签),但核心问题仍在:训练时用的是固定的"完美"序列,推理时却是学生自己生成的"不完美"序列。
2.3 在线策略知识蒸馏(On-Policy KD)—— GKD 的核心创新
GKD 从模仿学习(Imitation Learning) 中汲取灵感,尤其是 DAgger 算法(Ross et al., 2011)的思路。
核心思路:不用固定的序列,改为让学生模型自己生成输出序列,然后让教师模型在这些学生自己写的序列上给出词元级反馈。
数学形式为(On-Policy 损失):
LOD(θ):=Ex∼X[Ey∼pS(⋅∣x)[DKL(pT∥pθS)(y∣x)]]\mathcal{L}_{OD}(\theta) := \mathbb{E}_{x \sim X} \left[ \mathbb{E}_{y \sim p_S(\cdot|x)} \left[ D_{KL}(p_T \| p_\theta^S)(y|x) \right] \right]LOD(θ):=Ex∼X[Ey∼pS(⋅∣x)[DKL(pT∥pθS)(y∣x)]]
关键技术细节:
- 外层期望:从输入数据集中采样问题 xxx
- 内层期望:用当前学生模型 pSp_SpS 自回归地采样出回答 yyy,温度 γ=1\gamma=1γ=1 以保持多样性
- 计算散度时:固定已采样的 yyy,只对学生模型参数 θ\thetaθ 求梯度
- 不通过采样过程反向传播(即把 yyy 视为固定样本),这保证了训练稳定性和计算效率
为什么有效? 学生模型在自己"容易犯错"的序列上接受教师的纠正,就像模拟考试中让学生暴露真实弱点,老师针对性辅导,而不是只在完美卷面上反复练习。
2.4 广义知识蒸馏(GKD)完整框架
GKD 在两个维度上进行了"广义"扩展:
- 可以选择不同的数据来源混合方式(λ\lambdaλ 参数)
- 可以选择不同的散度度量(DDD)
维度一:混合数据策略
LGKD(θ)=(1−λ)E(x,y)∼(X,Y)[D(pT∥pθS)(y∣x)]⏟固定数据集(Off-policy)+λEx∼X[Ey∼pS(⋅∣x)[D(pT∥pθS)(y∣x)]]⏟学生生成数据(On-policy)\mathcal{L}_{GKD}(\theta) = (1-\lambda) \underbrace{\mathbb{E}_{(x,y)\sim(X,Y)}\left[D(p_T\|p_\theta^S)(y|x)\right]}_{\text{固定数据集(Off-policy)}} + \lambda \underbrace{\mathbb{E}_{x\sim X}\left[\mathbb{E}_{y\sim p_S(\cdot|x)}\left[D(p_T\|p_\theta^S)(y|x)\right]\right]}_{\text{学生生成数据(On-policy)}}LGKD(θ)=(1−λ)固定数据集(Off-policy)E(x,y)∼(X,Y)[D(pT∥pθS)(y∣x)]+λ学生生成数据(On-policy)Ex∼X[Ey∼pS(⋅∣x)[D(pT∥pθS)(y∣x)]]
λ\lambdaλ 的三种极端配置:
| λ\lambdaλ 值 | 训练模式 | 数据来源 |
|---|---|---|
| λ=0\lambda = 0λ=0 | 纯监督 KD | 全部使用固定数据集(人工标注或教师预生成) |
| λ=1\lambda = 1λ=1 | 纯 On-Policy KD | 全部使用学生实时生成的序列 |
| $0 < \lambda < 1$ | 混合模式 | 按比例混合两种数据 |
工程实现(Algorithm 1):每个训练 step,先从 Uniform(0,1) 采样一个随机数 uuu:若 u≤λu \leq \lambdau≤λ,则用学生生成数据;否则从固定数据集采样。然后用采样到的序列计算梯度更新参数。
维度二:散度(Divergence)选择
这是 GKD 的另一大灵活性来源。论文支持以下三类散度:
① 前向 KL(Forward KL)
DKL(P∥Q)=∑cP(c)logP(c)Q(c)D_{KL}(P\|Q) = \sum_c P(c) \log \frac{P(c)}{Q(c)}DKL(P∥Q)=c∑P(c)logQ(c)P(c)
特性:Mode-covering(覆盖型)——要求学生在教师分布有概率的地方都要有概率。等价于最大似然估计。缺点:当学生容量不足时,被迫分配概率给低置信度词元,容易产生幻觉(Hallucination)。
② 反向 KL(Reverse KL)
DKL(Q∥P)=∑cQ(c)logQ(c)P(c)D_{KL}(Q\|P) = \sum_c Q(c) \log \frac{Q(c)}{P(c)}DKL(Q∥P)=c∑Q(c)logP(c)Q(c)
特性:Mode-seeking(求模型)——学生只聚焦于教师最高概率的几个词元,“宁缺毋滥”,生成质量更高,但多样性降低。适合指令跟随(Instruction Tuning)任务,因为它能让模型锁定指令的核心意图。
③ 广义 JSD(Generalized Jensen-Shannon Divergence)
JSD 是前向 KL 和反向 KL 之间的平滑插值:
DJSD(β)(P∥Q)=βDKL(P∥βP+(1−β)Q)+(1−β)DKL(Q∥βP+(1−β)Q)D_{JSD(\beta)}(P\|Q) = \beta D_{KL}\left(P \| \beta P + (1-\beta)Q\right) + (1-\beta) D_{KL}\left(Q \| \beta P + (1-\beta)Q\right)DJSD(β)(P∥Q)=βDKL(P∥βP+(1−β)Q)+(1−β)DKL(Q∥βP+(1−β)Q)
其中 β∈(0,1)\beta \in (0, 1)β∈(0,1) 是插值系数:
- β→0\beta \to 0β→0:趋近于前向 KL(Mode-covering)
- β→1\beta \to 1β→1:趋近于反向 KL(Mode-seeking)
- β=0.5\beta = 0.5β=0.5:标准对称 JSD
- JSD 的好处是有界,即使两个分布支撑集不重叠也不会爆炸,数值更稳定
任务依赖性实验结论:
- 摘要任务(XSum):JSD(0.9) 效果好,尤其在温度采样时
- 翻译任务(WMT):JSD(0.1) 效果好
- 推理任务(GSM8K):Forward KL 和 Reverse KL 都不错
- 指令微调(FLAN):Reverse KL 显著优于 Forward KL
2.5 结合强化学习微调(GKD + RL)
GKD 可以与强化学习(RLHF/RLAIF)无缝结合,联合优化目标为:
Ex∼X[(1−α)Ey∼pθS(⋅∣x)[r(y)]⏟RL 奖励目标−αEy∼pS(⋅∣x)[D(pT∥pθS)(y∣x)]⏟GKD 蒸馏正则项]\mathbb{E}_{x\sim X}\left[(1-\alpha)\underbrace{\mathbb{E}_{y\sim p_\theta^S(\cdot|x)}[r(y)]}_{\text{RL 奖励目标}} - \alpha\underbrace{\mathbb{E}_{y\sim p_S(\cdot|x)}\left[D(p_T\|p_\theta^S)(y|x)\right]}_{\text{GKD 蒸馏正则项}}\right]Ex∼X(1−α)RL 奖励目标Ey∼pθS(⋅∣x)[r(y)]−αGKD 蒸馏正则项Ey∼pS(⋅∣x)[D(pT∥pθS)(y∣x)]
- r(y)r(y)r(y):标量奖励函数(如文本蕴含分数、BLEU 分、人类偏好)
- α∈[0,1]\alpha \in [0,1]α∈[0,1]:蒸馏损失的强度,α=1\alpha=1α=1 时退化为纯蒸馏
- 相比传统 RLHF 中将策略正则化到初始 SFT 模型,GKD 将其正则化到教师模型,使模型在追求高奖励的同时保持通用能力,减轻"对齐税(Alignment Tax)"
实验结果(Figure 5):在摘要任务上,GKD+RLAIF 同时提高了摘要质量(ROUGE-2)和事实一致性(Entailment Score),优于仅使用 RLAIF 的基线。
三、ms-swift 框架中的 GKD 参数全解析
ms-swift 将上述理论封装成开箱即用的训练框架。以下是所有涉及 GKD 的参数,结合论文对应原理逐一说明:
3.1 教师模型配置参数
| 参数名 | 类型 | 说明 |
|---|---|---|
--teacher_model | str | 教师模型的路径或 ModelScope/HuggingFace 模型 ID,即 pTp_TpT 的来源 |
3.2 核心算法参数
| 参数名 | 类型 | 默认值 | 对应论文概念 | 说明 |
|---|---|---|---|---|
--lmbda | float | 0.5 | λ\lambdaλ(学生数据比例) | 控制 On-Policy 学习的触发概率。每个 step 随机采样 u∼U(0,1)u \sim U(0,1)u∼U(0,1),若 u≤λu \leq \lambdau≤λ 则使用学生生成数据,否则使用固定数据集 |
--beta | float | 0.5 | β\betaβ(JSD 插值系数) | 控制广义 JSD 散度的插值位置:0.0 → Forward KL;0.5 → 对称 JSD;1.0 → Reverse KL |
--seq_kd | bool | False | SeqKD 模式 | 若设为 True,在 Off-policy 阶段使用教师模型实时生成的序列(而非固定数据集中的 ground truth),相当于在线版 SeqKD |
lmbda 参数控制三种训练模式:
Mode 1 - On-Policy(lmbda > 随机数):
用学生模型 p_S 实时采样序列 y,教师对 y 打分 → 解决分布不匹配
Mode 2 - Off-Policy with SeqKD(lmbda ≤ 随机数 且 seq_kd=True):
用教师模型 p_T 实时生成序列 y,教师对 y 打分 → 在线版 SeqKD
Mode 3 - Off-Policy Supervised KD(lmbda ≤ 随机数 且 seq_kd=False):
直接从数据集取固定序列 y,教师对 y 打分 → 传统监督 KD
beta 参数对应散度选择:
DJSD(β)(pT∥pθS)(y∣x)=1Ly∑n=1Ly[βDKL(pT(⋅∣y<n,x)∥Mn)+(1−β)DKL(pθS(⋅∣y<n,x)∥Mn)]D_{JSD(\beta)}(p_T \| p_\theta^S)(y|x) = \frac{1}{L_y}\sum_{n=1}^{L_y} \left[\beta D_{KL}\left(p_T(\cdot|y_{<n},x) \| M_n\right) + (1-\beta)D_{KL}\left(p_\theta^S(\cdot|y_{<n},x) \| M_n\right)\right]DJSD(β)(pT∥pθS)(y∣x)=Ly1n=1∑Ly[βDKL(pT(⋅∣y<n,x)∥Mn)+(1−β)DKL(pθS(⋅∣y<n,x)∥Mn)]
其中 Mn=β⋅pT(⋅∣y<n,x)+(1−β)⋅pθS(⋅∣y<n,x)M_n = \beta \cdot p_T(\cdot|y_{<n},x) + (1-\beta) \cdot p_\theta^S(\cdot|y_{<n},x)Mn=β⋅pT(⋅∣y<n,x)+(1−β)⋅pθS(⋅∣y<n,x) 是混合分布。
3.3 显存优化参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--gkd_logits_topk | int | None | 仅保留教师模型输出中概率最高的 top-k 个 logits 来计算 KL 散度,其余位置的概率视为 0。大幅降低显存占用,因为不需要存储完整词表大小的 logits 张量 |
原理:词汇表通常有 3 万~15 万词,每个词元位置都存储教师的完整 logits 非常耗内存。而 KL 散度的大部分"信息量"都集中在高概率的少数词元上,因此只保留 top-k(如 k=200)几乎不损失精度,但显存节省显著。
当设置 gkd_logits_topk 时,可以使用外部教师模型 API 服务(teacher_model_server参数)来获取 logprobs,这样可以避免在训练进程中加载教师模型。
3.4 教师模型并行与加速参数
| 参数名 | 类型 | 说明 |
|---|---|---|
--teacher_deepspeed | str/dict | 单独为教师模型指定 DeepSpeed 配置文件(JSON 路径或字典)。允许教师和学生使用不同的 ZeRO 等级:例如教师用 ZeRO-3(极度省显存)、学生用 ZeRO-2(较快速度) |
背景:在 GKD 中,教师模型只需前向推理(不需要反向传播),因此可以用更激进的显存压缩策略。
teacher_deepspeed的分离配置允许开发者为两个模型量身定制并行策略,是解决大模型蒸馏显存瓶颈的重要工程手段。
Q2:我有以下问题:
- "训练时用的是固定的"完美"序列"是什么意思?生成每一个token都是依据标准答案序列吗?
- 基准方法中的”监督知识蒸馏(Supervised KD)“是什么意思没太明白。什么叫”学生在固定数据集的序列上,模仿教师模型的词元级概率分布“,到底是用的”固定数据集“还是”教师模型的输出“呢?怎么能两者同时用呢?教师模型经过训练吗?怎么保证教师的输出和标准答案很相近呢?万一教师回答得一塌糊涂怎么办?
- 在线策略知识蒸馏(On-Policy KD)中,"教师模型在这些学生自己写的序列上给出词元级反馈"教师怎么反馈?教师为什么能反馈?教师参考标准答案吗?还是教师被标准答案微调过?
- 前向 KL(Forward KL)中”要求学生在教师分布有概率的地方都要有概率“什么叫”教师分布有概率的地方“?
- 反向 KL(Reverse KL)中”学生只聚焦于教师最高概率的几个词元“的”教师最高概率的几个词元“是什么意思,请举例说明
- 前向KL和反向KL在我看来只是有没有取topK的区别,为什么名称一个叫”前向“一个叫”反向“
非常好的问题!这6个问题都触及了 GKD 方法中最容易混淆的核心概念。我来逐一详细解答。
问题1:[训练时用的是固定的"完美"序列]是什么意思?
先理解自回归生成
语言模型生成文本是一个词一个词顺序生成的。每生成一个词,都需要把之前所有已生成的词作为上下文输入:
输入问题 x:[今天天气怎么样?]
第1步:模型看到 [x],生成 → "今"
第2步:模型看到 [x, "今"],生成 → "天"
第3步:模型看到 [x, "今", "天"],生成 → "很"
第4步:模型看到 [x, "今", "天", "很"],生成 → "好"
...
什么是[固定的完美序列]
固定的完美序列就是来自数据集的人工标注的标准答案,比如 y = ["今", "天", "天", "气", "很", "好"]。
训练时,模型在每一步看到的前缀,永远都是来自这个标准答案序列本身,而不是模型自己上一步生成的词:
训练第1步:输入 [x, <start>],让模型预测"今"(标准答案第1词)
训练第2步:输入 [x, "今"],让模型预测"天"(标准答案第2词,"今"来自标准答案!)
训练第3步:输入 [x, "今", "天"],让模型预测"天"("今天"来自标准答案!)
推理时,模型每一步看到的前缀,是自己上一步真实生成的词:
推理第1步:输入 [x],模型生成 → "今"(OK,和标准答案一样)
推理第2步:输入 [x, "今"],模型生成 → "儿"(出错了!)
推理第3步:输入 [x, "今", "儿"],模型慌了——
训练时从未见过"今儿"这个前缀!→ 接下来可能一塌糊涂
这就是训练-推理分布不匹配(Exposure Bias):训练时永远喂[完美前缀],推理时却要面对[自己造成的不完美前缀]。
问题2:[监督知识蒸馏(Supervised KD)]到底用的是什么?
这是最容易混淆的地方。我们把它拆开来看:
核心思想
Supervised KD 的目标是:让学生模型在每个位置上,输出的词汇概率分布尽量接近教师模型的概率分布。
两者各扮演什么角色
| 来源 | 作用 |
|---|---|
| 固定数据集(标准答案序列 yyy) | 决定[在哪些位置]做对比,即前缀 y<ny_{<n}y<n |
| 教师模型(Teacher) | 在这些位置上给出软标签(每个词的概率分布) |
具体流程举例
假设标准答案是 y = ["今", "天", "天", "气", "很", "好"],问题是[今天天气怎么样]:
第2步:前缀 = [x, "今"](来自标准答案)
→ 教师模型输出:{"天":0.8, "日":0.1, "年":0.05, ...}(软标签)
→ 学生模型输出:{"天":0.5, "晚":0.3, "日":0.1, ...}
→ 损失 = KL(教师分布 || 学生分布),让学生靠近教师
第3步:前缀 = [x, "今", "天"](来自标准答案)
→ 教师给出下一词的概率分布
→ 学生模仿教师的概率分布
回答你的追问
[到底用固定数据集还是教师输出?]
两者同时用,但各司其职:
- 固定数据集提供**“在哪里对齐”**(前缀路径)
- 教师模型提供**“对齐到什么”**(每个位置的概率分布目标)
[教师经过训练吗?]
是的,教师已经过充分的监督微调(SFT),是一个性能很好的大模型(如论文中用 T5-XL 3B 参数作为教师)。
[怎么保证教师和标准答案很相近?]
因为教师本身已经在同一任务上微调得很好,教师在[标准答案前缀]下给出的概率分布,自然会在正确答案词上赋予高概率。Supervised KD 不依赖教师输出和标准答案完全一样的文字,而是利用教师在逐词位置上的软概率分布作为知识源,这比硬标签(只有0/1)信息更丰富。
[万一教师很烂怎么办?]
如果教师本身就性能很差,那确实蒸馏不出好的学生。GKD 的前提是教师必须是一个已经训练良好的高性能模型。
问题3:On-Policy KD 中[教师怎么反馈]?
教师不参考标准答案!
这是 On-Policy KD 最关键的地方。教师的反馈完全来自其自身的语言模型能力,不看标准答案。
具体过程
第一步:让学生自由发挥生成序列
问题 x:[今天天气怎么样?]
学生自己生成(可能有错):y = ["今", "儿", "天", "气", "还", "行"]
第二步:把学生生成的序列喂给教师,让教师在每个位置给出概率分布
位置1:教师看到 [x],给出所有词的概率 → {"今":0.7, "明":0.1, ...}
位置2:教师看到 [x, "今"],给出所有词的概率 → {"天":0.85, "儿":0.03, ...}
↑ 注意教师看到学生写的"今",并在这个基础上给出下一词分布
位置3:教师看到 [x, "今", "儿"],给出所有词的概率 → {"天":0.4, "早":0.3, ...}
↑ 教师看到了学生的错误"儿",并在此基础上给出分布
...
第三步:学生的输出和教师的分布做对比,计算损失并更新
位置2:学生输出"儿"的概率高,但教师说"天"概率最高(0.85)
→ 损失大 → 学生在[x,"今"]这个前缀下,未来会更倾向于生成"天"
教师为什么能反馈?
因为教师是一个语言模型,给它任意前缀,它都能计算出[接下来每个词的概率分布]。这就是它的本质能力——它不需要对照标准答案,它只需要根据上下文判断[什么词最合理]。
教师确实经过了充分的监督微调(SFT),因此它的概率分布本身就代表了[高质量语言生成的知识]。
问题4:[教师分布有概率的地方]是什么意思?
先理解概率分布
教师在每个位置都会对词汇表里所有词给出概率:
教师在前缀 [x, "今"] 之后的概率分布(词汇表假设只有5个词):
词: "天" "晚" "年" "儿" "日"
概率: 0.80 0.08 0.06 0.03 0.03
所有词都有概率,只是大小不同。 这就是[教师分布在每个词上都有一定的概率质量(probability mass)]。
Forward KL [要求学生覆盖教师有概率的地方]
Forward KL 的公式是:
DKL(Pteacher∥Qstudent)=∑vPT(v)logPT(v)QS(v)D_{KL}(P_{teacher} \| Q_{student}) = \sum_{v} P_T(v) \log \frac{P_T(v)}{Q_S(v)}DKL(Pteacher∥Qstudent)=v∑PT(v)logQS(v)PT(v)
当 PT(v)>0P_T(v) > 0PT(v)>0 但 QS(v)≈0Q_S(v) \approx 0QS(v)≈0 时,logPT(v)QS(v)→∞\log \frac{P_T(v)}{Q_S(v)} \to \inftylogQS(v)PT(v)→∞,损失爆炸!
这意味着:只要教师在某个词上有任何概率,学生就必须也在那个词上分配概率,否则惩罚无限大。
教师:{"天":0.80, "晚":0.08, "年":0.06, "儿":0.03, "日":0.03}
↑ ↑
这两个词概率虽小,但学生必须覆盖!
Forward KL 下,学生被迫:
{"天":0.70, "晚":0.07, "年":0.10, "儿":0.08, "日":0.05}
↑ 为了不让损失爆炸,学生给低概率词也分配了不少概率
结果:学生的"天"概率从0.80降到了0.70,反而在错误词上分配了更多概率 → 容易生成低质量词
这就是 Forward KL 容易导致[幻觉]的原因。
问题5:[教师最高概率的几个词元]是什么意思?
还是用上面的例子:
教师在前缀 [x, "今"] 后的分布:
词: "天" "晚" "年" "儿" "日"
概率: 0.80 0.08 0.06 0.03 0.03
Reverse KL 的特性(Mode-seeking):只关注教师概率高的区域,对教师概率低的区域不敏感。
其公式为:
DKL(Qstudent∥Pteacher)=∑vQS(v)logQS(v)PT(v)D_{KL}(Q_{student} \| P_{teacher}) = \sum_{v} Q_S(v) \log \frac{Q_S(v)}{P_T(v)}DKL(Qstudent∥Pteacher)=v∑QS(v)logPT(v)QS(v)
当 QS(v)≈0Q_S(v) \approx 0QS(v)≈0 时,整项趋近于0,不产生惩罚。
因此学生会把自己的概率全部集中在教师高概率的词上,完全忽视教师低概率的词:
Reverse KL 下,学生学到的分布:
{"天":0.95, "晚":0.04, "年":0.01, "儿":0.00, "日":0.00}
↑ 更集中于"天",忽略低概率词
优点:生成质量高(几乎不生成低概率词,不产生幻觉)
缺点:多样性低(学生几乎只生成一种答案)
再用一个更直观的例子:
假设教师对[这道菜]的下一词分布如下:
词: "好吃" "美味" "难吃" "一般" "很差"
教师概率: 0.45 0.40 0.05 0.05 0.05
- Forward KL:学生必须在[难吃][一般][很差]上也分配概率,被迫产生负面词汇
- Reverse KL:学生只需关注[好吃]和[美味](概率高的词),输出更集中,生成质量更高
问题6:为什么一个叫[前向],一个叫[反向]?
这是一个非常好的问题!名称来自公式中 P 和 Q 的顺序,和[是否取 topK]毫无关系。
命名规则
KL 散度是不对称的:
DKL(P∥Q)≠DKL(Q∥P)D_{KL}(P \| Q) \neq D_{KL}(Q \| P)DKL(P∥Q)=DKL(Q∥P)
在知识蒸馏中:
- PPP = 教师分布(Teacher)= 目标
- QQQ = 学生分布(Student)= 要优化的对象
| 名称 | 公式 | 含义 |
|---|---|---|
| 前向 KL(Forward KL) | DKL(Pteacher∣Qstudent)D_{KL}(\mathbf{P}_{teacher} | Q_{student})DKL(Pteacher∣Qstudent) | 教师在前,学生在后,[以教师为基准衡量学生的差距] |
| 反向 KL(Reverse KL) | DKL(Qstudent∣Pteacher)D_{KL}(Q_{student} | \mathbf{P}_{teacher})DKL(Qstudent∣Pteacher) | 学生在前,教师在后,[以学生为基准衡量和教师的差距] |
[前向]的[前]指的是教师分布 PPP 在 DKL(⋅∥⋅)D_{KL}(\cdot\|\cdot)DKL(⋅∥⋅) 的第一个(前面)位置。
为什么顺序不同会导致如此不同的行为?
两个公式对[学生在某个词上概率为0]的惩罚方式完全不同:
Forward KL =∑vPT(v)logPT(v)QS(v)= \sum_v P_T(v) \log \frac{P_T(v)}{Q_S(v)}=∑vPT(v)logQS(v)PT(v):
- 若教师说 PT(v)=0.03P_T(v) = 0.03PT(v)=0.03(低但非零),而学生 QS(v)→0Q_S(v) \to 0QS(v)→0
- 则这一项 =0.03×log(0.030→∞)→∞= 0.03 \times \log(\frac{0.03}{0}\to\infty) \to \infty=0.03×log(00.03→∞)→∞
- 惩罚无限大! → 学生被迫覆盖所有教师有概率的词(Mode-covering)
Reverse KL =∑vQS(v)logQS(v)PT(v)= \sum_v Q_S(v) \log \frac{Q_S(v)}{P_T(v)}=∑vQS(v)logPT(v)QS(v):
- 若学生 QS(v)→0Q_S(v) \to 0QS(v)→0(学生在某词上不分配概率)
- 则这一项 →0×log(0/PT(v))→0\to 0 \times \log(0/P_T(v)) \to 0→0×log(0/PT(v))→0(数学上极限为0)
- 惩罚为零! → 学生可以随意忽略低概率词,只聚焦高概率词(Mode-seeking)
一句话总结
- Forward KL(前向):教师在前,学生必须[处处有概率],全面但容易分散
- Reverse KL(反向):学生在前,学生只需[在对的地方有概率],精准但多样性低
这两种散度的差异与[是否取 topK]无关,是从公式结构上天然决定的行为差异。
更多推荐


所有评论(0)