知识蒸馏 · 知识点
重点 蒸馏的本质是什么?
很多人把蒸馏理解成「大模型压成小模型」。更准的说法是:知识迁移(Knowledge Transfer)——让小模型学会大模型已经掌握的知识,压缩只是常见结果,不是本质。
| 说法 | 表述 | 问题 / 优点 |
|---|---|---|
| 传统理解 | 蒸馏 = 把大模型压缩成小模型 | 只看到体积变小,没说「学什么」 |
| 更准理解 | 蒸馏 = 让小模型学习大模型的知识 | 点出本质是迁移知识,小模型可部署、可加速是副作用 |
为什么要纠这个口
- 压缩是手段/结果 — 参数少、算力省、延迟低,是工程动机。
- 迁移是本质 — Teacher 把「怎么判、类间关系、决策边界」传给 Student。
- 没有 Teacher 也能训小模型 — 直接用硬标签训小模型也是压缩思路;蒸馏多出来的价值,是用 Teacher 的输出当更丰富的监督信号。
重点 什么是硬标签,什么是软标签?
蒸馏里监督信号分两种——硬标签只告诉「正确答案是谁」;软标签告诉「每一类有多可能」。
| 硬标签(Hard Label) | 软标签(Soft Label) | |
|---|---|---|
| 形式 | One-hot:正确类为 1,其余为 0 | 概率分布:各类都有概率 |
| 例子(猫图) | [猫=1, 狗=0, 鸟=0] | Teacher 输出 [猫=0.8, 狗=0.15, 鸟=0.05] |
| 告诉你什么 | 只知道是猫 | 还知道「像狗多于像鸟」 |
| 信息量 | 低 | 高 |
硬标签的局限 — 只标对错,不体现类间相似度;学生只能学「选对那一类」,学不到 Teacher 对整个类别空间的判断。
软标签从哪来 — 一般是 Teacher(大模型)对同一输入做前向,输出 softmax 概率(常配合温度 T 把分布「软化」),再拿去训 Student。
硬标签和软标签,哪个信息量更大?
软标签信息量更大。 多出来的那部分——类与类之间的相似度、Teacher 的相对置信——叫 暗知识(Dark Knowledge)。
怎么从例子里看出来
- 硬标签:
[1, 0, 0]→ 只知道是猫。 - 软标签:
[0.8, 0.15, 0.05]→ 猫概率最高,同时 猫更像狗(0.15)而不像鸟(0.05)。 - 学生若只学硬标签,学不到「猫–狗近、猫–鸟远」;学软标签,就把 Teacher 对决策边界的理解一起迁过去。
和蒸馏本质的关系
- 蒸馏要迁的,很大一块就是这些软标签里的暗知识。
- 所以「只压缩参数、仍用硬标签训小模型」≠ 经典知识蒸馏;经典 KD 强调用 Teacher 的软分布当额外监督。
重点 温度系数 T 的作用是什么?
T 是概率分布「尖锐 ↔ 平滑」的调节器,用来让 Teacher 把更多暗知识露给学生。公式上是把 logits 除以 T 再 Softmax:softmax(z / T)。T 越大,分布越平;T=1 就是普通 Softmax。
例子:Teacher 看到模糊图,原始 logits = [猫=8, 狗=2, 鸟=1]
| T | Softmax 输出(约) | 效果 |
|---|---|---|
| T=1(常温) | [0.99, 0.01, 0.00] | 概率极度偏向猫,狗/鸟信息几乎被抹掉 → 学生只能死记「这是猫」 |
| T=5(高温) | [0.64, 0.24, 0.12] | 分布被「摊平」→ Teacher 露出「有点像狗」等细微线索 |
高温为什么有用
- 保住类间相似度 — 猫更像狗(0.24)不像鸟(0.12),暗知识还在。
- 像专家直觉 — 不只给标准答案,还给出「次选、易混项」。
- 学生学到的是知识结构 — 不只记对错,还学类与类之间的内在联系。
工程用法(训推分离)
| 阶段 | T 怎么设 | 目的 |
|---|---|---|
| 训练(蒸馏) | 高温,常用 3~10 | 充分迁移暗知识 |
| 推理 | 回到 T=1 | 恢复自信判断,保证输出准确 |
损失函数与 LLM 蒸馏
蒸馏损失是 双师教学——学生既要对标准答案,也要学 Teacher 的解题思路。总损失是两项加权:
text
L_total = α · L_hard + (1 − α) · L_soft| 项 | 算什么 | 作用 |
|---|---|---|
| L_hard | 学生输出 vs 真实标签 的 交叉熵(CE) | 保证基本正确:猫就得认成猫 |
| L_soft | 学生输出 vs Teacher 输出 的 KL 散度 | 学概率分布里的细微关系(暗知识) |
KL 散度在干什么 — 量两个概率分布「差多远」。Teacher 给 [猫=0.7, 狗=0.2, 鸟=0.1] 时:
| 学生输出 | KL | 含义 |
|---|---|---|
[0.6, 0.3, 0.1] | 小 | 抓住了「像猫但带点狗味」,模仿了 Teacher 的犹豫 |
[0.9, 0.05, 0.05] | 大 | 硬答案也对(仍是猫),但丢掉了 Teacher 对次选的细腻判断 |
硬标签只奖「答对」;KL 还罚「分布形状不像 Teacher」。LLM 蒸馏同理:在 token / vocab 分布上对齐 Teacher 的 soft logits(常配合温度 T),再加一层对真实下一 token / 指令答案的 CE。
α 一般取多少?
| 设定 | 效果 |
|---|---|
| α ≈ 0.5~0.7(常用) | 不完全盲从 Teacher(Teacher 也会错),同时吸收解题直觉 |
| α = 1 | 退化为普通监督训练,蒸馏增益没了 |
| α 过小 | 过度贴 Teacher,真标签约束变弱,可能学偏 |
LLM 时代的蒸馏挑战是什么?
经典 KD 假设 Teacher / Student 能力接近、且能拿到 Teacher 的 logits。LLM 时代两条硬坎:能力鸿沟太大、闭源只能拿文本。
1. 能力鸿沟过大 → 学不动
- 直接 72B → 1.5B,差距太大,学生往往学不好。
- 类比:小学生硬啃研究生课——不是内容不对,是跨度太大。
解法:渐进式蒸馏(Progressive Distillation)
text
72B → 32B → 7B → 1.5B每步跨度可控,学生能跟上。DeepSeek-R1 系列就采用了这类渐进思路。
2. 经典蒸馏 vs LLM / API 蒸馏
| 经典蒸馏 | API 蒸馏(闭源 Teacher) | |
|---|---|---|
| Teacher 例子 | DeepSeek 等开源,能拿到内部概率 | GPT / Claude / Gemini,内部不可见 |
| 监督信号 | Teacher 的 概率分布 / logits + KL | Teacher 的 输出文本 |
| 训练方式 | Softmax(T) + KL(+ 可选硬标签 CE) | 把 Teacher 文本当数据做 SFT |
| 暗知识 | 分布里直接有 | 主要靠文本里的推理过程 / 答案格式间接带 |
案例:S1 — 典型 API 蒸馏;常被说成「约 50 美金 复刻 R1」那条线,流程见下一节。
推理时间预算怎么估、怎么调?
不知道每类题该「想多久」,就先用数据估平均预算,再用实验调多/少;线上可用档位粗控(快 vs 细)。
1. 用训练数据估
- 按题型 / 难度看训练集里推理链平均要多长(常以 token 数 计)。
- 实验里常把推理路径按长度分组,再据此给模型设提示或预算上限。
2. 用实验评估调多/少
- 先给一个初始时间预算,跑模型。
- 按题型记录 准确率、生成答案长度。
- 准确率不够 → 加预算;已经够准但太慢/太长 → 减预算。
3. 用分类条件粗控(class-conditional control)
- API 可设
reasoning_effort:low / medium / high。 - 控的是档位,不是精确算力;按「要响应速度」还是「要细节深度」选档即可。
| 手段 | 解决什么 | 精度 |
|---|---|---|
| 训练数据分析 | 每类题大概需要多长 | 估均值 / 分桶 |
| 实验评估调参 | 预算该加还是该减 | 按指标迭代 |
| reasoning_effort | 线上快速粗调 | 档位级,不精确 |
S1 的训练过程是怎样的?
业界常说的「李飞飞团队 / Stanford 约 50 美金复刻 R1」,指的就是 s1:用 Gemini 推理文本做 API 蒸馏 + 小而精 SFT,再在测试时用 Budget Forcing 控思考长度——不是从头训 R1,是低成本把推理能力迁到开源底座上。
三步流程
| 步骤 | 做什么 | 要点 |
|---|---|---|
| 1. 数据准备 | 约 5.9 万题里精筛 → s1K(1000 条) | 每条 = 问题 + Gemini 2.0 Flash Thinking 生成的推理路径 + 答案 |
| 2. 选模 + SFT | 底座 Qwen2.5-32B-Instruct,用 s1K 做监督微调 | 只训这 1K 高质量样本,不堆海量脏数据 |
| 3. Budget Forcing(测试时) | 控推理算力 | 超预算 → 强制插入「结束思考」;想多想 → 追加 "Wait" 促使继续探索 |
成本量级(论文/公开资料)
- 硬件:16× H100
- 时间:约 26 分钟
- 对外说法:算力成本大约 50 美金 量级(随当时云价波动,别死磕精确账单)
和前面知识点的挂钩
- API 蒸馏 — Teacher 是 Gemini(闭源),只能拿文本推理链,不能做 logits/KL。
- 质量 > 数量 — 5.9 万筛到 1K,强调精选。
- 推理预算 — Budget Forcing 就是「预算限制」的工程落地:少想就截断,多想就 Wait。
蒸馏 + SFT + RLHF 在项目中如何使用?
实际项目里这三样很少单打,而是分阶段组合:先蒸馏/SFT 学会「格式 + 知识」,再用强化学习(常说成 RLHF 一族,工程上多见 GRPO)学会「推理策略」。
text
阶段一:SFT 蒸馏(学格式 + 知识)
↓
阶段二:GRPO 强化学习(学推理策略)| 阶段一:SFT 蒸馏 | 阶段二:GRPO 强化学习 | |
|---|---|---|
| 学什么 | 基本格式遵循 + 领域知识 | 在阶段一基础上再抬推理能力 |
| 数据 | Teacher 生成的高质量答案(API 蒸馏数据) | 只需「问题 + 标准答案」(如 GSM8K) |
| 训法 | 普通 SFT,Teacher 输出当标签 | GRPO,用奖励函数引导推理过程 |
| 效果 | 能答题,但推理能力仍有限 | 会展示推理过程,答案正确率提升 |
怎么串起来记
- 阶段一 — 把闭源/大 Teacher 的答法迁过来,学生先「像样」:格式对、领域词对、能答。
- 阶段二 — 不再依赖 Teacher 全文;有题有标答即可,靠奖励逼出更好的 CoT / 解题策略。
- 和 s1 / R1 的关系 — s1 偏「只做阶段一(API 蒸馏 + SFT)」;完整推理模型流水线常是 SFT(可含蒸馏)→ RL(GRPO 等)。标题里的 RLHF 是对齐/偏好大类说法,落地算法可以是 PPO / DPO / GRPO。
DeepSeek-R1-Distill 系列的训练路径是怎样的?
R1-Distill 就是上一节「阶段一 +(可选)阶段二」的官方产品化:用 R1(671B) 当 Teacher,把带推理过程的数据 SFT 蒸馏到 Qwen2.5 小规格上,部分规格再上 GRPO。
text
DeepSeek-R1 (671B Teacher)
↓ 生成含推理过程的大量数据
SFT 蒸馏 → Qwen2.5 系列
↓
DeepSeek-R1-Distill-Qwen-1.5B / 7B / 14B / 32B
↓(部分模型)
GRPO 再优化| 步骤 | 做什么 |
|---|---|
| 1. 选 Teacher | DeepSeek-R1(671B) |
| 2. 造数据 | 生成大量含 推理过程 的训练数据(不只最终答案) |
| 3. SFT 蒸馏 | 对 Qwen2.5 做监督微调 → 得到 Distill-Qwen 1.5B / 7B / 14B / 32B |
| 4. 再优化(可选) | 部分模型继续用 GRPO 抬推理 |
和 s1 对比
| s1 | R1-Distill | |
|---|---|---|
| Teacher | Gemini(API 文本) | 自家 R1 开源/可部署,数据量级更大 |
| 学生底座 | Qwen2.5-32B 一条 | Qwen2.5 多规格全家桶 |
| 后处理 | 测时 Budget Forcing | 部分规格 GRPO |
| 定位 | 低成本证明「1K SFT 也能出推理样」 | 正式发布的蒸馏产品线 |
重点 教师-学生模型选择原则是什么?
选师生三句话——Teacher 尽量强(但算 API 账);Student 按部署选规格;参数比别离谱,大约 4:1~10:1,跨太大就渐进蒸馏。
| 原则 | 口径 | 注意 |
|---|---|---|
| Teacher 越强越好 | 信号质量更高,学生上限更高 | API / 造数成本要控;闭源贵就少而精(如 s1K) |
| Student 看部署 | 端侧 / 服务器 / 高性能不同档 | 见下表 |
| 师生参数比 | 一般 4:1~10:1 | 远超(如 72B→1.5B)易学不动 → 渐进蒸馏 |
学生规格怎么选
| 部署场景 | 常用规格 |
|---|---|
| 端侧部署 | 1.5B~3B |
| 服务器部署 | 7B~14B |
| 高性能需求 | 32B+ |
和前面知识点挂钩
- R1-Distill 同时出 1.5B/7B/14B/32B,就是按部署档位铺学生规格。
- 比例如 671B→1.5B 远超 10:1,工程上仍常见——要么接受上限有限,要么中间加跳板(渐进)。
- 开源 Teacher 可自己跑;闭源 Teacher 强但贵,原则变成「够强 + 造得起」。
如何训练自己的 R1 模型?
一条常见线是 Unsloth + GRPO 的「迷你 R1」:底座 Instruct → 规定 <reasoning>/<answer> 格式 → GSM8K + 多奖励 → GRPOTrainer 训 → 多格式导出。对应前面「阶段二学推理策略」,不是从零训 671B。
text
加载底座(4bit + LoRA)
→ GSM8K + 格式约束
→ 设计奖励函数
→ GRPO 训
→ 保存导出这条线在训:结构化推理(<reasoning> / <answer>)+ GRPO + 格式/正确性奖励。自家「小 R1」多是 Instruct 底座 + GRPO;官方 Distill 另有 R1 产数据再 SFT。要分清「蒸馏路径」和「自训 GRPO 路径」。
GRPO 如何「长出」<reasoning>?数据从哪来?
GSM8K 确实只有 question / answer,没有 <reasoning> 列。 GRPO 不需要现成推理标注;靠 奖励函数 引导模型自己生成带标签的内容。<reasoning> 里的文字不是数据集抄来的,是模型在 RL 里为拿高分「写出来」的。
一句话答疑
| 疑问 | 答案 |
|---|---|
GRPO 能帮产生 <reasoning> 吗? | 能——格式奖励专门催这个结构 |
| 推理文本从哪来? | 不是标注数据;底座预训练里已有推理能力,GRPO 逼它显式写出来并包进标签 |
奖励怎么催格式(公开规格)
python
reward_funcs = [
xmlcount_reward_func, # 检查 XML 标签用得对不对
soft_format_reward_func, # 是否包含 <reasoning> 和 <answer>
strict_format_reward_func, # 严格检查格式
int_reward_func, # 答案是否为数字
correctness_reward_func, # 最终答案是否正确
]soft_format_reward_func 示例逻辑:用正则匹配
text
<reasoning>...</reasoning><answer>...</answer>格式对给 0.5,不对给 0.0——直接把「愿意写标签」写进优化目标。
训练循环(为何不需要推理标注)
- 生成:同一题采样多条候选(如
num_generations = 6)。 - 打分:每条都过全部奖励函数(格式 + 正确性等)。
- 优化:组内相对高分的轨迹拉高策略 → 模型学会「用对标签 + 在 reasoning 里解题 + answer 答对」。
蓝条结论
- Llama 等底座本来就会推理(预训练里学过)。
- GRPO 用奖励把内部推理外显,并用 XML 标签组织,利于稳住最终正确性。
- 对比:蒸馏路径的 CoT 来自 Teacher 文本;这条 GRPO 路径的 CoT 来自 RL 涌现 + 格式奖励。
GRPO 训练与 SFT 的关键差异是什么?
SFT 是 模仿标准答案(CE);GRPO 是 多候选采样 + 奖励打分 + 组内相对优势更新。工程上差在:要不要开 vLLM、数据要不要带 CoT、学率更小、靠奖励链而不是贴标签。
| 维度 | SFT | GRPO |
|---|---|---|
| 学什么 | 直接拟合标注文本 | 最大化奖励(格式 + 正确性等) |
| 每题用法 | 一条(或少量)监督目标 | 多候选(如 num_generations=6),比相对好坏 |
| 推理加速 | 一般不强制 | 常开 vLLM(fast_inference=True) |
| 数据要不要 CoT | 有推理链更好(蒸馏/SFT) | 可以没有;System Prompt + 奖励催格式 |
| 学习率 | 相对更大 | 常 小一个数量级(如 5e-6),RL 要稳 |
| 保存 | 全量 / LoRA 皆可 | 常用 LoRA 专用保存 |
GRPO 同一题要多候选,常开快推理;格式靠 System Prompt + 奖励,不靠标注里的 CoT。奖励链同时打格式和正确性,SFT 只有交叉熵贴标签。模型本身已有推理能力,奖励把「先写推理、再给正确答」逼出来。
AI 大模型趋势
和本篇蒸馏 / 推理线对齐的三条趋势——小模型靠蒸馏上位、合成数据成主力、模型自出题自校验做 RL 自迭代(类比 AlphaGo-Zero)。
1. 小模型成主流:大模型蒸馏
- 用蒸馏把大模型的推理能力迁到小模型,小模型成绩明显抬升。
- 例子:DeepSeek-R1-Distill-Qwen-7B 在 AIME 2024 上打赢 32B 量级模型——「小但会想」可碾压「大但不会想」。
2. 用合成数据训练成主流
- 蒸馏数据是公开的秘密,但有些能力单靠蒸馏解释不了。
- 例:DeepSeek-V3 中文很「接地气」,更像预训练阶段大量用了数据合成,而不只是抄 Teacher 输出。
3. 模型自迭代:新的强化学习范式
让模型自己出题、自己答、自己校验,对的留下当下一轮数据:
text
① 自生成海量题并作答(如 1 亿题)
↓
② 自校验答案对不对
↓
③ 筛出校验通过的:结果 + 思维链 → 合成新训练数据
(例:1 亿里过关 100 万,这 100 万条 CoT 进下一轮)
↓
持续迭代,探索人类尚未覆盖的区域(类比 AlphaGo-Zero)和本章挂钩
| 趋势 | 本章对应 |
|---|---|
| 小模型蒸馏 | R1-Distill、师生选型、API/logits 蒸馏 |
| 合成数据 | Teacher 造数、s1K、自校验留下的 CoT |
| RL 自迭代 | GRPO、奖励催 <reasoning>、无标注也能长出推理链 |
训练完成后,如何系统评估不同方法的效果?
别只凭感觉看几条 case。用同一套测试题,按四维指标打分,再横向比:基座 vs SFT vs GRPO。不同方法擅长不同事,综合分高不代表每项都赢。
评估对比维度
1. 微调前后定量对比
- 同一批测试题,比基座 vs 微调后回答。
- 看:格式遵循、答案准确、语言匹配。
- 常见现象:微调前中文题容易用英文答,微调后对齐目标语言。
2. 方法对比:纯 SFT vs SFT + GRPO
| 模型 | 强项 | 弱项 |
|---|---|---|
| SFT | 格式遵循、知识问答 | 推理能力有限 |
| GRPO | 推理、结构化输出(R1 向) | 可能牺牲一点对话流畅度 |
→ 不同任务选不同训法,别用一个榜打天下。
3. 四维核心指标
| 指标 | 查什么 | 例子 |
|---|---|---|
| a) 格式遵循 | 是否按要求格式输出 | 医疗:结构化;推理:是否有 <reasoning> / <answer> |
| b) 答案准确率 | 与参考答案契合度 | 可用关键词 / 字符级 F1 |
| c) 推理链质量 | 推理够不够长、分不分层、结不结论 | 长度、步骤词、结论是否落地 |
| d) 语言匹配 | 输出语言是否符合预期 | 中文题是否中文答 |
实现要点(EvalMetrics)
python
# 1. 格式遵循:xml → 查 <reasoning>/<answer>;medical → 长度或 ### 结构
# 2. 答案准确:字符集合重叠算简化 F1
# 3. 推理链质量:长度>50 + 步骤词(首先/然后/因此/1./2.)
# 4. 语言匹配:目标语种字符占比(如中文比例)
# 多模型:同一 test_cases 上跑各模型 → 综合分对比对比评估示例
| 模型 | 格式遵循 | 答案准确 | 语言匹配 | 综合评分 |
|---|---|---|---|---|
| 基座(微调前) | 0.3 | 0.15 | 0.05 | 0.17 |
| SFT 微调 | 0.9 | 0.72 | 0.95 | 0.86 |
| GRPO 强化学习 | 0.95 | 0.68 | 0.88 | 0.84 |
读表:基座全面崩;SFT 综合略高、语言/准确更稳;GRPO 格式(含 reasoning 标签)最强,准确/语言略让步——和「SFT 会答、GRPO 会想」一致。