知识蒸馏: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 学的是标准答案。
知识蒸馏学的是老师的判断分布。
三、为什么需要知识蒸馏?
语言模型通常会经历几个阶段:
| 阶段 | 作用 |
|---|---|
| 预训练 | 学语言、世界知识、基础推理能力 |
| 中训练 | 注入领域知识,比如代码、医学、公司内部文档 |
| 后训练 | 让模型更会听指令、更会对话、更会推理 |
知识蒸馏主要发生在后训练阶段。
它的核心作用是:
把一个已经比较强的大模型的行为习惯、推理方式、回答风格,迁移给一个更小、更便宜、更容易部署的小模型。
你可以理解成:
大模型:能力强,但成本高、延迟高、部署难 小模型:成本低、速度快、部署容易,但能力弱 蒸馏:尽量把大模型能力迁移给小模型所以蒸馏的目的就是:
尽量保留大模型能力,同时降低成本、延迟和部署难度。
四、训练小模型时,老师到底是怎么教学生的?
可以从两个角度看:
题目和答案从哪里来?
老师怎么给反馈?
这就涉及两个关键维度:
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. 高分回答增强,低分回答削弱比如:
| 回答 | 分数 |
|---|---|
| 回答 A | 90 |
| 回答 B | 60 |
| 回答 C | 30 |
模型知道:
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:模型用“看过参考答案的自己”去教“没看参考答案的自己”。知识蒸馏的核心不是“压缩模型”这么简单,而是:
把强模型的判断方式、推理习惯和输出风格,尽可能迁移到更小、更便宜、更容易部署的模型上。
