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<nnnn 个词元之前的所有词元(即前缀)
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(pTpθS)(yx):=Ly1n=1LyD(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)[−log⁡pθ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(yx)]
缺点:只能从标注数据中学习,无法充分利用教师模型的知识。

② 序列级知识蒸馏(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(pTpθS)(yx)]
优于 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(θ):=ExX[EypS(x)[DKL(pTpθS)(yx)]]

关键技术细节

  • 外层期望:从输入数据集中采样问题 xxx
  • 内层期望:用当前学生模型 pSp_SpS 自回归地采样出回答 yyy,温度 γ=1\gamma=1γ=1 以保持多样性
  • 计算散度时:固定已采样的 yyy,只对学生模型参数 θ\thetaθ 求梯度
  • 不通过采样过程反向传播(即把 yyy 视为固定样本),这保证了训练稳定性和计算效率

为什么有效? 学生模型在自己"容易犯错"的序列上接受教师的纠正,就像模拟考试中让学生暴露真实弱点,老师针对性辅导,而不是只在完美卷面上反复练习。


2.4 广义知识蒸馏(GKD)完整框架

GKD 在两个维度上进行了"广义"扩展

  1. 可以选择不同的数据来源混合方式λ\lambdaλ 参数)
  2. 可以选择不同的散度度量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-policyE(x,y)(X,Y)[D(pTpθS)(yx)]+λ学生生成数据(On-policyExX[EypS(x)[D(pTpθS)(yx)]]

λ\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)log⁡P(c)Q(c)D_{KL}(P\|Q) = \sum_c P(c) \log \frac{P(c)}{Q(c)}DKL(PQ)=cP(c)logQ(c)P(c)
特性:Mode-covering(覆盖型)——要求学生在教师分布有概率的地方都要有概率。等价于最大似然估计。缺点:当学生容量不足时,被迫分配概率给低置信度词元,容易产生幻觉(Hallucination)

② 反向 KL(Reverse KL)
DKL(Q∥P)=∑cQ(c)log⁡Q(c)P(c)D_{KL}(Q\|P) = \sum_c Q(c) \log \frac{Q(c)}{P(c)}DKL(QP)=cQ(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(β)(PQ)=β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]ExX(1α)RL 奖励目标EypθS(x)[r(y)]αGKD 蒸馏正则项EypS(x)[D(pTpθS)(yx)]

  • 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_modelstr教师模型的路径或 ModelScope/HuggingFace 模型 ID,即 pTp_TpT 的来源

3.2 核心算法参数

参数名类型默认值对应论文概念说明
--lmbdafloat0.5λ\lambdaλ(学生数据比例)控制 On-Policy 学习的触发概率。每个 step 随机采样 u∼U(0,1)u \sim U(0,1)uU(0,1),若 u≤λu \leq \lambdauλ 则使用学生生成数据,否则使用固定数据集
--betafloat0.5β\betaβ(JSD 插值系数)控制广义 JSD 散度的插值位置:0.0 → Forward KL;0.5 → 对称 JSD;1.0 → Reverse KL
--seq_kdboolFalseSeqKD 模式若设为 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(β)(pTpθS)(yx)=Ly1n=1Ly[β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_topkintNone仅保留教师模型输出中概率最高的 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_deepspeedstr/dict单独为教师模型指定 DeepSpeed 配置文件(JSON 路径或字典)。允许教师和学生使用不同的 ZeRO 等级:例如教师用 ZeRO-3(极度省显存)、学生用 ZeRO-2(较快速度)

背景:在 GKD 中,教师模型只需前向推理(不需要反向传播),因此可以用更激进的显存压缩策略。teacher_deepspeed 的分离配置允许开发者为两个模型量身定制并行策略,是解决大模型蒸馏显存瓶颈的重要工程手段。


Q2:我有以下问题:

  1. "训练时用的是固定的"完美"序列"是什么意思?生成每一个token都是依据标准答案序列吗?
  2. 基准方法中的”监督知识蒸馏(Supervised KD)“是什么意思没太明白。什么叫”学生在固定数据集的序列上,模仿教师模型的词元级概率分布“,到底是用的”固定数据集“还是”教师模型的输出“呢?怎么能两者同时用呢?教师模型经过训练吗?怎么保证教师的输出和标准答案很相近呢?万一教师回答得一塌糊涂怎么办?
  3. 在线策略知识蒸馏(On-Policy KD)中,"教师模型在这些学生自己写的序列上给出词元级反馈"教师怎么反馈?教师为什么能反馈?教师参考标准答案吗?还是教师被标准答案微调过?
  4. 前向 KL(Forward KL)中”要求学生在教师分布有概率的地方都要有概率“什么叫”教师分布有概率的地方“?
  5. 反向 KL(Reverse KL)中”学生只聚焦于教师最高概率的几个词元“的”教师最高概率的几个词元“是什么意思,请举例说明
  6. 前向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)log⁡PT(v)QS(v)D_{KL}(P_{teacher} \| Q_{student}) = \sum_{v} P_T(v) \log \frac{P_T(v)}{Q_S(v)}DKL(PteacherQstudent)=vPT(v)logQS(v)PT(v)

PT(v)>0P_T(v) > 0PT(v)>0QS(v)≈0Q_S(v) \approx 0QS(v)0log⁡PT(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)log⁡QS(v)PT(v)D_{KL}(Q_{student} \| P_{teacher}) = \sum_{v} Q_S(v) \log \frac{Q_S(v)}{P_T(v)}DKL(QstudentPteacher)=vQS(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(PQ)=DKL(QP)

在知识蒸馏中:

  • PPP = 教师分布(Teacher)= 目标
  • QQQ = 学生分布(Student)= 要优化的对象
名称公式含义
前向 KL(Forward KL)DKL(Pteacher∣Qstudent)D_{KL}(\mathbf{P}_{teacher} | Q_{student})DKL(PteacherQstudent)教师在前,学生在后,[以教师为基准衡量学生的差距]
反向 KL(Reverse KL)DKL(Qstudent∣Pteacher)D_{KL}(Q_{student} | \mathbf{P}_{teacher})DKL(QstudentPteacher)学生在前,教师在后,[以学生为基准衡量和教师的差距]

[前向]的[前]指的是教师分布 PPPDKL(⋅∥⋅)D_{KL}(\cdot\|\cdot)DKL()第一个(前面)位置

为什么顺序不同会导致如此不同的行为?

两个公式对[学生在某个词上概率为0]的惩罚方式完全不同:

Forward KL =∑vPT(v)log⁡PT(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)log⁡QS(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 00×log(0/PT(v))0(数学上极限为0)
  • 惩罚为零! → 学生可以随意忽略低概率词,只聚焦高概率词(Mode-seeking)

一句话总结

  • Forward KL(前向):教师在前,学生必须[处处有概率],全面但容易分散
  • Reverse KL(反向):学生在前,学生只需[在对的地方有概率],精准但多样性低

这两种散度的差异与[是否取 topK]无关,是从公式结构上天然决定的行为差异。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐