知识蒸馏:SFT、RL、GKD等核心区别解析

一文讲懂知识蒸馏:SFT、RL、GKD、OPD-RL、OPSD 到底有什么区别?

前言

知识蒸馏,简单来说就是:

让一个强模型当老师,一个小模型当学生。
学生不是只背老师的最终答案,而是学习老师在每一步生成 token 时的“判断倾向”。

很多人第一次接触知识蒸馏时,会把它理解成“让小模型模仿大模型的答案”。

这个理解不算错,但不够准确。

真正的知识蒸馏,不只是让学生模型输出和老师模型一样的答案,而是让学生模型学习老师模型在每一步生成时的概率判断结构。

也就是说,学生学的不是一个死答案,而是老师在生成过程中的“判断方式”。


一、最简单的类比:老师不是只给答案,而是告诉你为什么这个答案更像对的

普通 SFT 更像这样:

老师直接给你标准答案。
你只需要照着答案背。

比如:

问题:请解释知识蒸馏 标准答案:知识蒸馏是一种让小模型学习大模型能力的方法。

训练时,学生模型只知道:

下一个 token 应该是“知识” 再下一个 token 应该是“蒸馏” 再下一个 token 应该是“是”

但是它不知道老师为什么这么选。


知识蒸馏更像这样:

老师不仅告诉你答案,还告诉你:
这个位置为什么更适合用“模型”,不太适合用“数据”,更不适合用“参数”。

比如老师模型在某个位置的判断可能是:

token老师认为的概率
模型60%
知识20%
参数10%
数据5%
其他5%

学生模型当前可能是:

token学生认为的概率
数据40%
模型25%
参数15%
知识10%
其他10%

蒸馏训练的目标,就是让学生的概率分布逐渐接近老师的概率分布。

所以知识蒸馏学到的不是一个死答案,而是老师的概率判断结构。

这就是所谓的:

软标签 / soft distribution


二、SFT 其实可以看成知识蒸馏的特殊版本

SFT 也可以看成一种特殊的蒸馏。

区别在于:

SFT 的老师只给 one-hot 答案。

也就是:

正确 token = 1 其他 token = 0

比如下一个 token 应该是“知识”,那 SFT 只告诉学生:

“知识”是正确答案,其他都别管。

但是在真实的教师模型里,它可能是这样想的:

token概率
知识70%
模型10%
训练8%
机器3%
其他9%

SFT 只保留了“知识”这个最终答案,却丢掉了老师完整的判断过程。

所以可以这样理解:

SFT 学的是标准答案。
知识蒸馏学的是老师的判断分布。


三、为什么需要知识蒸馏?

语言模型通常会经历几个阶段:

阶段作用
预训练学语言、世界知识、基础推理能力
中训练注入领域知识,比如代码、医学、公司内部文档
后训练让模型更会听指令、更会对话、更会推理

知识蒸馏主要发生在后训练阶段。

它的核心作用是:

把一个已经比较强的大模型的行为习惯、推理方式、回答风格,迁移给一个更小、更便宜、更容易部署的小模型。

你可以理解成:

大模型:能力强,但成本高、延迟高、部署难 小模型:成本低、速度快、部署容易,但能力弱 蒸馏:尽量把大模型能力迁移给小模型

所以蒸馏的目的就是:

尽量保留大模型能力,同时降低成本、延迟和部署难度。


四、训练小模型时,老师到底是怎么教学生的?

可以从两个角度看:

  1. 题目和答案从哪里来?

  2. 老师怎么给反馈?

这就涉及两个关键维度:

  • off-policy 和 on-policy

  • per-sequence 和 per-token


五、off-policy 和 on-policy:数据从哪里来?

1. off-policy:用别人已经准备好的答案训练

比如你有一批固定数据:

问题:请解释知识蒸馏 标准答案:知识蒸馏是让小模型学习大模型输出分布的方法……

学生模型拿这批现成数据去学。

这就叫 off-policy。

你可以理解成:

学生看教材、背例题、学固定答案。

SFT 就是典型的 off-policy。


2. on-policy:学生自己先生成答案,再拿去评价

比如学生模型自己回答:

问题:请解释知识蒸馏 学生回答:知识蒸馏就是把大模型压缩成小模型……

然后老师模型或者奖励模型来评价这个回答好不好。

这叫 on-policy。

你可以理解成:

学生自己先做题,然后老师再批改。

RL、GRPO、on-policy 蒸馏都属于这个方向。


六、per-sequence 和 per-token:反馈有多细?

1. per-sequence:整段回答只给一个总分

比如学生写了一整段答案,老师只说:

这条回答 80 分。

老师没有告诉你哪句话好,哪一步错,只给了整体分数。

这就叫 per-sequence,也就是按整段回答给反馈。

RL 通常就是这种形式。

它的特点是:

能优化最终结果,但反馈比较粗。


2. per-token:每一个 token 都给反馈

大模型生成文本不是一次生成整段,而是一个 token 一个 token 往外生成。

比如:

知识 / 蒸馏 / 是 / 一种 / 模型 / 压缩 / 方法

老师可以在每个位置告诉学生:

这个位置应该更倾向于输出“蒸馏”,不是“训练” 这个位置应该更倾向于输出“模型”,不是“数据” 这个位置应该更倾向于输出“压缩”,不是“部署”

这叫 per-token。

你可以理解成:

老师不是只看最终答案,而是逐字逐步地告诉学生哪里更接近正确方向。

知识蒸馏的强大之处就在这里:

它的反馈比 RL 更细。


七、把 SFT、RL、蒸馏放到一张表里

方法数据来源反馈粒度像什么
SFT固定数据集每个 token,但只有标准答案背标准答案
RL / GRPO学生自己生成整段回答一个分数做题后看总分
离线蒸馏固定数据集每个 token 学老师概率看老师逐字讲解
在线蒸馏学生自己生成每个 token 学老师概率学生先做,老师逐步改

真正要记住的是:

SFT 是学标准答案。
RL 是学奖励分数。
蒸馏是学老师每一步的判断分布。


八、为什么说 SFT 是“背答案”?

SFT 的训练数据通常长这样:

输入:解释一下知识蒸馏 输出:知识蒸馏是一种让小模型学习大模型能力的方法……

训练时,模型只知道:

下一个 token 应该是“知识” 再下一个 token 应该是“蒸馏” 再下一个 token 应该是“是”

它不知道老师心里其实是这样想的:

“知识”概率 70% “模型”概率 10% “训练”概率 8% “机器”概率 3% 其他词概率更低

SFT 只告诉学生:

正确答案就是“知识”,其他都别管。

所以 SFT 的信号比较硬,也就是 one-hot 标签。


九、为什么蒸馏比 SFT 更像“老师教学生”?

蒸馏不只是告诉学生正确答案是什么,还告诉学生:

老师在这个位置上,认为哪些 token 也有可能,哪些 token 完全不应该出现。

举个例子。

问题:

什么是知识蒸馏?

老师模型在某个位置可能认为:

token老师认为的概率
模型60%
知识20%
参数10%
数据5%
其他5%

学生模型当前可能是:

token学生认为的概率
数据40%
模型25%
参数15%
知识10%
其他10%

蒸馏训练的目标就是:

让学生的分布越来越接近老师的分布。

所以蒸馏不是简单地让学生输出同一个答案,而是让学生学习老师的判断结构。


十、GKD 是什么?

GKD 可以理解成一种非常直接的知识蒸馏方式。

它的逻辑是:

老师给出每个 token 的概率分布 学生也给出每个 token 的概率分布 然后计算两者之间的差距 差距越大,loss 越大 训练目标:让学生越来越像老师

所以 GKD 的核心就是:

老师怎么判断,学生就尽量怎么判断。

在 Swift 训练配置里:

--rlhf_type gkd

意思就是:

使用 GKD 这种蒸馏训练方式。


十一、GKD 里的 lmbda 是什么意思?

lmbda控制的是:

训练时到底更多使用固定数据集,还是更多使用学生自己生成的数据。


1. lmbda = 0:完全使用固定数据集

这意味着完全用已有数据训练。

比如数据中已经有:

问题 A -> 答案 A 问题 B -> 答案 B 问题 C -> 答案 C

学生就在这些固定答案上学习老师的分布。

这叫离线蒸馏。

可以理解成:

学生完全看教材学习。


2. lmbda = 1:完全使用学生自己生成的数据

流程变成:

1. 给学生一个问题 2. 学生自己生成回答 3. 老师看学生这个回答 4. 老师逐 token 给学生指导 5. 学生根据老师反馈改进

这叫在线蒸馏,也叫 on-policy 蒸馏。

可以理解成:

学生自己做题,老师现场批改。


3. 0 < lmbda < 1:固定数据和学生生成数据混合

比如:

lmbda = 0.5

可以粗略理解成:

一半看教材,一半自己做题。


十二、GKD 里的 beta 是什么意思?

beta比较抽象,涉及 KL / JSD 这类分布距离。

先不用急着看公式,可以先这样理解:

beta 控制学生学习老师分布时,是学得更“宽”,还是更“尖”。


1. beta = 0:Forward KL

偏向于:

老师觉得可能的东西,学生都尽量覆盖。

也就是说,学生会比较“宽”。

比如老师认为:

A 有可能 B 也有可能 C 也有一点可能

学生就尽量都学一点。

适合的情况:

希望学生回答更丰富,不要太死板。


2. beta = 1:Reverse KL

偏向于:

学生重点抓老师最确定的答案。

也就是说,学生会比较“尖”。

比如老师认为:

A 最可能 B 也可以 C 勉强可以

学生可能更集中学习 A。

适合的情况:

希望学生输出更确定、更收敛。


3. beta = 0.5:JSD

这是一个折中。

可以理解成:

既不要太散,也不要太窄。

所以一般默认用 0.5 会比较稳。


十三、OPD-RL 是什么?

前面的 GKD 是:

老师直接教学生。

而 OPD-RL 是:

在 RL 训练里面额外加一个老师。


普通 GRPO / RL 是这样:

1. 学生生成几个回答 2. 奖励函数给每个回答打分 3. 高分回答增强,低分回答削弱

比如:

回答分数
回答 A90
回答 B60
回答 C30

模型知道:

A 比 B 好 B 比 C 好

但是问题是:

它不知道 A 到底好在哪里 它也不知道 C 到底哪一步错了

所以 RL 的反馈比较粗。


OPD-RL 加了老师之后,变成:

1. 学生生成回答 2. 奖励函数给整段回答打分 3. 老师模型逐 token 看学生输出 4. 老师告诉学生每一步是否接近高手答案 5. 最后把奖励分数和老师信号一起用于训练

所以 OPD-RL 可以理解成:

既有 RL 的整体奖励,又有老师的逐 token 指导。


十四、Swift 里怎么触发 OPD-RL?

原本 GRPO 是:

--rlhf_type grpo

如果加上老师模型:

--rlhf_type grpo --teacher_model xxx

或者使用老师模型服务:

--rlhf_type grpo --teacher_model_server xxx

就可以理解成带老师指导的 OPD-RL。

其中:

--teacher_kl_coef

控制的是老师影响力有多大。

teacher_kl_coef含义
主要听奖励函数,老师只是轻微参考
更强制学生靠近老师
太大学生可能过度模仿老师,RL 自己的探索空间变小

十五、OPSD 是什么?

OPSD 更特别,它是自蒸馏。

也就是说:

不是一个外部大老师教小学生,而是同一个模型分成“老师身份”和“学生身份”。

区别在于:

身份能看到什么
学生身份只能看到题目
老师身份能看到题目 + 参考答案 / 解析 / 特权信息

然后让学生去学习老师的输出。


举个数学题例子。

学生看到:

问题:小明有 3 个苹果,又买了 5 个,一共有几个?

学生只能根据题目回答。

老师看到:

问题:小明有 3 个苹果,又买了 5 个,一共有几个? 参考答案:3 + 5 = 8,所以答案是 8。

老师因为看到了参考答案,所以输出更稳定、更准确。

然后训练目标是:

让学生在没有参考答案的情况下,也尽量学到老师那种解题方式。

这就是 OPSD。


十六、GKD、OPD-RL、OPSD 三种方法对比

方法老师是谁学生怎么学适合场景
GKD外部教师模型学老师每个 token 的概率分布大模型教小模型
OPD-RL外部教师模型 + 奖励函数既看奖励分数,也看老师逐 token 指导GRPO / RLHF 训练中加老师
OPSD同一个模型的教师身份学带参考答案的自己有参考答案、解析、标准过程的数据

十七、用一个“学生考试”的故事串起来

1. SFT:背标准答案

老师直接给标准答案:

题目:解释知识蒸馏 答案:知识蒸馏是……

学生背。

特点:

稳定、简单,但学生只知道标准答案,不知道老师的完整判断。


2. RL:做题后看总分

学生自己写答案。

老师只给分:

这篇 80 分。 那篇 40 分。

学生知道哪篇好,但不知道具体哪一步错。

特点:

能优化最终效果,但反馈粗。


3. GKD:老师逐字讲解

老师逐字告诉学生:

这里应该用“模型”,不用“数据”。 这里“压缩”比“训练”更合适。 这里“迁移能力”比“复制参数”更准确。

学生模仿老师每一步的判断。

特点:

反馈细,适合把大模型能力迁移到小模型。


4. OPD-RL:总分 + 老师点评

学生先做卷子。

奖励函数给总分:

80 分。

老师再逐步点评:

这一步推理不错。 这里 token 选择偏了。 这里应该更像老师模型的输出。

特点:

既有 RL 的整体优化,又有老师的细粒度指导。


5. OPSD:自己教自己

同一个模型分成两个身份。

学生身份:

只看题目。

老师身份:

看题目 + 标准答案 + 解析。

训练目标:

让学生身份学会老师身份的推理方式。

特点:

不一定需要外部大模型,但需要参考答案或特权信息。


十八、最后总结

把这篇文章浓缩成一句话:

SFT 是学标准答案,RL 是学奖励分数,蒸馏是学老师每一步的判断分布。
GKD 是直接蒸馏,OPD-RL 是在 RL 里加老师,OPSD 是让模型用参考答案教自己。

再简单一点:

SFT:老师给答案,学生背。 RL:学生做题,老师给总分。 GKD:老师逐 token 教学生。 OPD-RL:奖励函数给总分,老师逐 token 点评。 OPSD:模型用“看过参考答案的自己”去教“没看参考答案的自己”。

知识蒸馏的核心不是“压缩模型”这么简单,而是:

把强模型的判断方式、推理习惯和输出风格,尽可能迁移到更小、更便宜、更容易部署的模型上。