📌 本文亮点:从黑盒到白盒,从理论到代码,全面解析 MiniMind 项目中知识蒸馏的设计思想与实现细节。覆盖蒸馏的每个阶段------预训练、SFT、白盒蒸馏、LoRA 适配、RL 对齐------阐述各自的意义、目标与数学原理,帮助读者真正理解"为什么要蒸馏"以及"蒸馏到底在做什么"。
前言
在当前大语言模型(LLM)的工程实践中,"蒸馏"一词几乎无处不在。从 DeepSeek-R1 的推理能力蒸馏,到 Qwen3 的高质量合成数据,再到各类小模型对大模型行为的模仿,知识蒸馏已经从 Hinton 2015 年的一篇经典论文,演变成 LLM 后训练流程中不可或缺的核心手段。
然而,"蒸馏"在实践中往往含义模糊:有时它指的是拿大模型的输出当训练数据做监督微调(黑盒蒸馏),有时它指的是让学生模型直接拟合教师模型的 token 分布(白盒蒸馏),有时甚至泛指一切从小模型利用大模型信息的行为。
本文以 MiniMind 开源项目为蓝本,系统梳理知识蒸馏在整个 LLM 训练链路中的角色与实现。MiniMind 是一个从零训练的超小语言模型(约 64M 参数),其训练流程覆盖预训练、SFT、知识蒸馏、LoRA、DPO、PPO/GRPO/CISPO、Agentic RL 等全过程,所有核心算法均基于 PyTorch 原生实现------这使得它成为理解蒸馏流程的理想参考。
本文核心要解决的两个问题:
- 每个训练阶段,蒸馏扮演什么角色?意义是什么?
- 每个阶段的具体目标是什么?如何判断蒸馏是否成功?
一、知识蒸馏总览:从黑盒到白盒
1.1 什么是知识蒸馏
知识蒸馏(Knowledge Distillation, KD)是一种模型压缩与知识迁移技术,其核心思想是让一个轻量级的"学生模型"(Student)从一个更强的"教师模型"(Teacher)中学习知识,以更小的参数量获得接近教师模型的表现。
在 LLM 领域,知识蒸馏大体可分为两类:
| 类型 | 核心思路 | 学生能看到的 | 典型场景 |
|---|---|---|---|
| 黑盒蒸馏 | 用教师模型的输出作为监督信号训练学生 | 教师的最终回答、风格、推理链 | SFT 数据中混入的合成数据 |
| 白盒蒸馏 | 拟合教师模型的 token 分布(logits 层面) | 教师在每个 token 上的概率分布 | train_distillation.py 实现 |
1.2 两种蒸馏的数学表达
黑盒蒸馏本质等价于对教师生成答案做监督微调:
L blackbox = C E ( y teacher , p student ) \mathcal{L}{\text{blackbox}} = \mathrm{CE}(y{\text{teacher}}, p_{\text{student}}) Lblackbox=CE(yteacher,pstudent)
学生模型只能看到"老师说了什么",却看不到老师内部是如何做出判断的。
白盒蒸馏在监督损失之外,额外拟合教师分布:
L whitebox = α ⋅ L CE + ( 1 − α ) ⋅ T 2 ⋅ K L ( p t T ∥ p s T ) \mathcal{L}{\text{whitebox}} = \alpha \cdot \mathcal{L}{\text{CE}} + (1 - \alpha) \cdot T^2 \cdot \mathrm{KL}(p_t^T \parallel p_s^T) Lwhitebox=α⋅LCE+(1−α)⋅T2⋅KL(ptT∥psT)
其中 T T T 是温度参数, α \alpha α 是 CE 损失的权重。学生不仅学到了"标准答案",还学到了教师在候选 token 之间的相对倾向。
1.3 MiniMind 训练全流程中的蒸馏位置
┌─────────────┐ ┌─────────┐ ┌──────────────┐ ┌─────────┐ ┌──────────┐
│ 预训练 │───▶│ SFT │───▶│ 白盒蒸馏 │───▶│ LoRA │───▶│ RL 对齐 │
│ Pretrain │ │ 微调 │ │ Distillation │ │ 垂直适配 │ │ DPO/PPO │
│ │ │(含黑盒 │ │ (logits级) │ │ │ │ /GRPO │
│ │ │ 蒸馏数据)│ │ │ │ │ │ │
└─────────────┘ └─────────┘ └──────────────┘ └─────────┘ └──────────┘
│
│ 数据来源
▼
┌──────────────────┐
│ 教师模型合成数据 │
│ (Qwen3 / R1 等) │
└──────────────────┘
💡 蒸馏并非只发生在一个独立阶段------它贯穿于整个训练链路。黑盒蒸馏隐含在 SFT 数据中,白盒蒸馏是显式的 logits 级拟合,而 RL 阶段的 Reward Model 本身也是一种"AI 反馈"蒸馏。
二、预训练阶段:为蒸馏打下知识基础
2.1 阶段意义
预训练是 LLM 训练链路的第一步,也是一切后续阶段(包括蒸馏)的基础。没有预训练的模型,就像一个不会读书的学生------即使有再好的老师(教师模型),也无法从教师的知识中获益,因为学生连基本的"阅读理解"能力都没有。
预训练的核心目标可以概括为:让模型先埋头读大量文本,学会高质量地词语接龙。
从蒸馏的角度看,预训练阶段的意义在于:
- 建立基础语言能力:模型需要先掌握语言的基本规律、事实知识和上下文关系,才能在后续蒸馏阶段理解教师模型传递的"暗知识"(Dark Knowledge)
- 为蒸馏提供可迁移的参数基底:白盒蒸馏通常在已完成 SFT 的权重基础上进行,而 SFT 又依赖预训练权重------预训练质量直接决定了蒸馏的起点
2.2 阶段目标
| 目标维度 | 具体目标 | 验证方式 |
|---|---|---|
| 语言建模 | 学会 next token prediction,损失持续下降 | 观察 pretrain loss 曲线 |
| 事实知识 | 对常见事实能给出合理续写 | 输入"秦始皇",应续写"是中国历史上第一位皇帝" |
| 上下文理解 | 能根据前文合理预测后文 | 输入"天空是蓝色的,因为",应续写"阳光散射"相关内容 |
2.3 关键实现
MiniMind 预训练使用 train_pretrain.py,核心训练逻辑:
python
# 前向传播 + 计算损失
res = model(input_ids, labels=labels)
loss = res.loss + res.aux_loss # aux_loss 为 MoE 负载均衡损失
# 梯度累积 + 梯度裁剪
scaler.scale(loss).backward()
scaler.unscale_(optimizer)
torch.nn.utils.clip_grad_norm_(model.parameters(), args.grad_clip)
scaler.step(optimizer)
训练数据为 pretrain_t2t_mini.jsonl(轻量版约 1.2GB),格式为纯文本:
jsonl
{"text": "如何才能摆脱拖延症?治愈拖延症并不容易,但以下建议可能有所帮助。"}
{"text": "Transformer 通过自注意力机制建模上下文关系,是现代大语言模型的重要基础结构。"}
2.4 预训练对蒸馏的影响
预训练质量直接决定了后续蒸馏的有效性:
- 预训练不充分 → 学生模型的语言能力不足,无法有效吸收教师模型的分布信息,KL 散度拟合会变成"噪声拟合"
- 预训练充分 → 学生模型已有较好的语言基底,蒸馏可以精细地调整其在"不确定"token 上的分布,从教师那里学到更细腻的知识
⚠️ 预训练阶段本身不直接涉及蒸馏,但它是蒸馏得以生效的前提条件。就像让一个刚学会认字的小学生去听大学物理课------预训练就是在让学生先学会"认字"。
三、SFT 阶段:黑盒蒸馏的主战场
3.1 阶段意义
SFT(Supervised Fine-Tuning)是 MiniMind 训练链路中黑盒蒸馏的核心载体。在这一阶段,模型不仅学习多轮对话格式,还大量吸收来自教师模型(如 Qwen3-4B、DeepSeek-R1 等)的合成数据。
SFT 并不只是把模型调成"更会聊天"。MiniMind 当前主线 SFT 数据量达 14GB,其中包含:
- 高质量指令跟随数据
- 公开对话数据
- 模型蒸馏合成数据 (约 10w 条 tool call 数据,由
qwen3-4b合成) - Qwen3 系列的 reasoning 数据
- R1-Distill-SFT 等开源蒸馏数据
从蒸馏的视角看,SFT 阶段的意义是:
- 黑盒蒸馏的本质实现:学生在这一步学习教师的"输出行为"------不是教师的内部概率分布,而是教师面对问题时"会怎么回答"
- 知识传递的广度覆盖:通过混合来自不同教师模型的合成数据,SFT 阶段可以让小模型在多个维度(对话、推理、工具调用)上同时受益
3.2 阶段目标
| 目标维度 | 具体目标 | 验证方式 |
|---|---|---|
| 对话格式 | 适应 user / assistant / system / tool 等角色结构 |
模型能正确区分不同角色的回复边界 |
| 指令跟随 | 对用户指令给出有意义的回复 | 输入"推荐杭州美食",应列出具体美食 |
| 黑盒知识迁移 | 从教师合成数据中学习推理风格与工具调用能力 | 输入"帮我算 256*37",应生成正确的 tool_call |
| 思维链能力 | 学会在 think 标签内显式推理 |
开启 open_thinking=1 时,模型能输出思考过程 |
3.3 黑盒蒸馏的数据格式
SFT 阶段使用的蒸馏数据以标准对话格式组织:
jsonl
{
"conversations": [
{"role": "system", "content": "# Tools ...", "tools": "[...]"},
{"role": "user", "content": "帮我算一下 256 乘以 37 等于多少"},
{"role": "assistant", "content": "", "tool_calls": "[{\"name\":\"calculate_math\",\"arguments\":{\"expression\":\"256 * 37\"}}]"},
{"role": "tool", "content": "{\"result\":\"9472\"}"},
{"role": "assistant", "content": "256 乘以 37 等于 9472。"}
]
}
💡 黑盒蒸馏的数据通常比白盒蒸馏更容易获取------只需要教师模型的推理输出即可,无需访问其内部 logits。这也是当前工业界最主流的蒸馏范式。
3.4 SFT 训练实现
bash
# 单卡 SFT 训练
cd trainer && python train_full_sft.py
# 多卡 SFT 训练
torchrun --nproc_per_node N train_full_sft.py
核心训练逻辑与预训练一致,区别在于:
- 数据格式从纯文本变为多轮对话
- 学习率从
5e-4降为1e-5(更精细的调整) max_seq_len从340提升至768(支持更长对话)
3.5 黑盒蒸馏的局限
黑盒蒸馏的核心局限在于:学生只能看到"老师说了什么",却看不到"老师为什么这么说"。
这导致:
- 学生无法学习教师的不确定性------当教师在两个候选 token 之间犹豫时,黑盒蒸馏只传递了最终选择,丢弃了概率分布信息
- 对于"暗知识"(教师对错误选项的相对偏好程度),黑盒蒸馏完全无法捕捉
这正是白盒蒸馏需要解决的问题。
四、白盒蒸馏阶段:logits 级的知识传递
4.1 阶段意义
白盒蒸馏是 MiniMind 中最接近 Hinton 经典蒸馏范式的一步。与黑盒蒸馏不同,它不只学习教师的最终输出,还直接拟合教师在每个 token 位置上的概率分布。
白盒蒸馏的意义在于:
- 传递"暗知识":教师在 top-1 token 上给出 90% 概率,同时在 top-2 token 上给出 8% 概率------这种"8%"的信息在黑盒蒸馏中完全丢失,但在白盒蒸馏中被保留
- 更细腻的知识迁移:学生学到的不仅是"正确答案",还有教师对"错误答案"的相对偏好程度,这有助于学生更好地泛化
4.2 阶段目标
| 目标维度 | 具体目标 | 验证方式 |
|---|---|---|
| 分布拟合 | 学生分布尽量逼近教师分布 | 观察 KL 散度持续下降 |
| 硬标签保持 | 同时不丢失 ground-truth 的监督信号 | CE 损失不反弹 |
| 混合损失平衡 | α 和 (1-α) 的权重合理 | 观察总损失、CE 损失、distill 损失三者的下降趋势 |
| 跨架构蒸馏 | 支持 MoE→Dense 的跨架构蒸馏 | 教师用 MoE,学生用 Dense,训练正常收敛 |
4.3 白盒蒸馏的数学原理
白盒蒸馏的损失函数为:
L = α ⋅ L CE + ( 1 − α ) ⋅ T 2 ⋅ K L ( p t T ∥ p s T ) \mathcal{L} = \alpha \cdot \mathcal{L}_{\text{CE}} + (1 - \alpha) \cdot T^2 \cdot \mathrm{KL}(p_t^T \parallel p_s^T) L=α⋅LCE+(1−α)⋅T2⋅KL(ptT∥psT)
各参数含义:
| 符号 | 含义 | 作用 |
|---|---|---|
| α \alpha α | CE 损失权重 | 控制"硬标签监督"与"软分布拟合"的比例,默认 0.5 |
| T T T | 温度参数 | 软化分布,让教师的"暗知识"更显著,默认 1.5 |
| p t T p_t^T ptT | 教师在温度 T T T 下的 softmax 分布 | 教师对每个 token 的"偏好程度" |
| p s T p_s^T psT | 学生在温度 T T T 下的 softmax 分布 | 学生需要拟合的目标分布 |
温度参数 T T T 的直觉理解:
T = 1.0(正常分布): [0.90, 0.08, 0.01, 0.01] → "暗知识"不明显
T = 2.0(软化分布): [0.60, 0.25, 0.08, 0.07] → "暗知识"更显著
T → ∞ (均匀分布): [0.25, 0.25, 0.25, 0.25] → 完全丢失信息
温度越高,教师的概率分布越"平滑",排名靠后的 token 获得更多权重,"暗知识"------教师对次优选择的相对偏好------变得更容易被学生学习。
T 2 T^2 T2 缩放的必要性:
当 softmax 使用温度 T T T 软化后,梯度会缩小约 1 / T 2 1/T^2 1/T2 倍。为了保证蒸馏损失产生的梯度与 CE 损失在同一量级,需要在 KL 散度前乘以 T 2 T^2 T2 作为补偿。
4.4 白盒蒸馏的核心代码解析
MiniMind 的 train_distillation.py 完整实现了白盒蒸馏流程,关键代码如下:
4.4.1 蒸馏损失函数
python
def distillation_loss(student_logits, teacher_logits, temperature=1.0, reduction='batchmean'):
with torch.no_grad():
# 教师分布:温度缩放后的 softmax,并 detach 阻断梯度
teacher_probs = F.softmax(teacher_logits / temperature, dim=-1).detach()
# 学生分布:温度缩放后的 log_softmax
student_log_probs = F.log_softmax(student_logits / temperature, dim=-1)
# KL 散度:衡量学生分布与教师分布的差异
kl = F.kl_div(
student_log_probs,
teacher_probs,
reduction=reduction
)
# 温度缩放补偿
return (temperature ** 2) * kl
关键细节:
- 教师分布使用
softmax(概率),学生分布使用log_softmax(对数概率),这与 PyTorchkl_div的输入约定一致 - 教师分布必须
.detach(),确保梯度只回传到学生模型 - 乘以 T 2 T^2 T2 是标准蒸馏的梯度缩放补偿
4.4.2 混合损失计算
python
# 1) Ground-Truth CE Loss(硬标签监督)
ce_loss = F.cross_entropy(
student_logits.view(-1, student_logits.size(-1)),
shift_labels.view(-1),
ignore_index=-100,
reduction='none'
)
ce_loss_raw = torch.sum(ce_loss * loss_mask_flat) / (loss_mask_flat.sum() + 1e-8)
if lm_config_student.use_moe:
ce_loss = ce_loss_raw + res.aux_loss # MoE 负载均衡
else:
ce_loss = ce_loss_raw
# 2) Distillation Loss(软分布拟合)
distill_loss = distillation_loss(
student_logits.view(-1, student_logits.size(-1))[loss_mask_flat == 1],
teacher_logits.view(-1, teacher_logits.size(-1))[loss_mask_flat == 1],
temperature=temperature
)
# 3) 总损失 = alpha * CE + (1-alpha) * Distill
loss = (alpha * ce_loss + (1 - alpha) * distill_loss) / args.accumulation_steps
关键细节:
loss_mask仅对非 padding 位置计算蒸馏损失,避免无意义的位置参与 KL 散度计算- 当教师词表大于学生词表时,
teacher_logits被截断到vocab_size_student,确保维度匹配 - MoE 学生模型需额外考虑
aux_loss(负载均衡损失)
4.4.3 教师模型设置
python
# 教师模型:冻结参数,设为 eval 模式
teacher_model, _ = init_model(lm_config_teacher, args.from_teacher_weight, device=args.device)
teacher_model.eval()
teacher_model.requires_grad_(False)
# 教师前向传播:no_grad + eval 模式,仅生成 logits
with torch.no_grad():
teacher_logits = teacher_model(input_ids).logits[..., :-1, :].contiguous()
关键细节:
- 教师模型全程不参与梯度计算,仅作为"标签生成器"使用
- 教师和学生共享相同的
input_ids,保证对比的是同一上下文下的分布
4.5 支持的蒸馏配置
MiniMind 白盒蒸馏支持灵活的教师-学生组合:
| 教师模型 | 学生模型 | 场景说明 |
|---|---|---|
| MoE(198M-A64M) | Dense(64M) | 默认配置:用 MoE 蒸馏 Dense |
| 更大 hidden_size 的模型 | 更小 hidden_size 的模型 | 跨参数量蒸馏 |
| 同尺寸的更强模型 | 同尺寸的较弱模型 | 能力提升蒸馏 |
训练命令:
bash
# 默认配置:MoE 教师 → Dense 学生
cd trainer && python train_distillation.py
# 自定义教师-学生配置
python train_distillation.py \
--student_hidden_size 512 \
--teacher_hidden_size 768 \
--student_use_moe 0 \
--teacher_use_moe 1 \
--alpha 0.5 \
--temperature 1.5 \
--from_student_weight full_sft \
--from_teacher_weight full_sft
4.6 白盒蒸馏的超参数选择
| 超参数 | 推荐范围 | 作用 | 选择建议 |
|---|---|---|---|
alpha |
0.3 ~ 0.7 | CE 与 KL 的权重平衡 | 偏重硬标签 → α↑;偏重分布拟合 → α↓ |
temperature |
1.0 ~ 2.0 | 控制教师分布的软化程度 | T↑ 暗知识更显著但可能过度平滑 |
learning_rate |
1e-6 ~ 5e-6 | 蒸馏阶段的学习率 | 远小于预训练(5e-4)和 SFT(1e-5) |
epochs |
3 ~ 6 | 蒸馏训练轮数 | 蒸馏是微调性质,不需要过多 epoch |
⚠️ 白盒蒸馏是在已完成 SFT 的权重基础上进行的继续训练,因此学习率要更小,避免破坏已学到的能力。
五、LoRA 适配阶段:蒸馏的轻量化延伸
5.1 阶段意义
LoRA(Low-Rank Adaptation)虽然不直接属于蒸馏范畴,但从知识迁移的视角看,它与蒸馏有相似的哲学:用更少的参数代价实现能力迁移。
LoRA 的核心思想是在原有权重矩阵旁引入低秩增量分支:
W ′ = W + Δ W = W + B ⋅ A W' = W + \Delta W = W + B \cdot A W′=W+ΔW=W+B⋅A
其中 B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r, A ∈ R r × k A \in \mathbb{R}^{r \times k} A∈Rr×k, r ≪ min ( d , k ) r \ll \min(d, k) r≪min(d,k)。
从蒸馏的角度看 LoRA:
- LoRA 是一种"轻量化蒸馏"------只训练少量新增参数,就能从基模迁移到垂直领域
- LoRA + 基模的组合,可以理解为一种"知识融合":基模的通用知识 + LoRA 的领域知识
5.2 阶段目标
| 目标维度 | 具体目标 | 验证方式 |
|---|---|---|
| 领域适配 | 让模型在垂直领域(如医疗)表现更好 | 医疗问答测试 |
| 自我认知 | 让模型知道自己叫"MiniMind" | 输入"你叫什么名字",应回答"MiniMind" |
| 通用性保留 | 不严重损失原有通用对话能力 | 通用问答测试(避免灾难性遗忘) |
| 参数效率 | 仅训练极少参数(LoRA 权重远小于基模) | 对比训练参数量 |
5.3 典型蒸馏场景:LoRA 数据示例
jsonl
// 医疗领域数据
{"conversations": [{"role": "user", "content": "请问颈椎病的人枕头多高才最好?"}, {"role": "assistant", "content": "颈椎病患者选择枕头的高度应该根据..."}]}
// 自我认知数据
{"conversations": [{"role": "user", "content": "你叫什么名字?"}, {"role": "assistant", "content": "您好,我名叫 MiniMind,是由 Jingyao Gong 开发的人工智能助手。"}]}
六、RL 对齐阶段:AI 反馈蒸馏
6.1 阶段意义
在 RL(Reinforcement Learning)阶段,蒸馏的思想以一种更隐蔽但同样重要的形式存在------AI 反馈本身就是一种蒸馏信号。
RLHF(基于人类反馈的强化学习)和 RLAIF(基于 AI 反馈的强化学习)的核心区别在于"裁判"是谁:
| 类型 | 裁判 | 蒸馏含义 |
|---|---|---|
| RLHF | 人类 | 人类偏好信号的直接传递 |
| RLAIF | AI 模型(Reward Model / Judge Model) | AI 对"好/坏回答"的判断 → 蒸馏到策略模型 |
MiniMind 使用的 InternLM2-1.8B-Reward 作为奖励模型,其输出分数本质上就是将"什么是好的回答"这一知识从 Reward Model 蒸馏到策略模型(Actor)中。
6.2 DPO:隐式偏好蒸馏
DPO(Direct Preference Optimization)不需要显式的 Reward Model,但它仍然在做偏好蒸馏:
L DPO = − E log σ ( β \[ log π θ ( y w ∣ x ) π ref ( y w ∣ x ) − log π θ ( y l ∣ x ) π ref ( y l ∣ x ) ) ] \mathcal{L}_{\text{DPO}} = -\mathbb{E}\left\\log \\sigma\\left(\\beta \\left\[\\log \\frac{\\pi_\\theta(y_w\|x)}{\\pi_{\\text{ref}}(y_w\|x)} - \\log \\frac{\\pi_\\theta(y_l\|x)}{\\pi_{\\text{ref}}(y_l\|x)}\\right\right)\right] LDPO=−Elogσ(β\[logπref(yw∣x)πθ(yw∣x)−logπref(yl∣x)πθ(yl∣x))]
其中 y w y_w yw(chosen)和 y l y_l yl(rejected)来自人类标注的偏好数据。模型通过对比"好的回答"和"差的回答"的概率比,隐式地学习偏好------这本身就是一种偏好蒸馏。
6.3 GRPO / PPO:在线式蒸馏
PPO 和 GRPO 的训练过程更明确地体现了蒸馏:
rollout batch → 奖励模型打分 → 策略更新
每一步"打分 → 更新"的循环,都是将奖励模型的判断蒸馏到策略模型中。与 DPO 的 off-policy 不同,PPO/GRPO 是 on-policy 的------模型需要不断生成新回答,让奖励模型评价,再调整策略。这种在线蒸馏让模型能够持续探索更好的回答方式。
6.4 阶段目标
| 目标维度 | 具体目标 | 验证方式 |
|---|---|---|
| 偏好对齐 | 降低人类不满意回答的产生概率 | chosen vs rejected 的概率比上升 |
| 奖励提升 | 奖励模型的评分持续提升 | 观察 reward 曲线 |
| 通用性代价 | 认识到 RL 优化会牺牲部分通用能力 | RL 模型在通用问答上可能略降 |
⚠️ 后训练(包括 RL)往往能把某一条能力线拉得很高,但几乎都会伴随"对齐税"------模型在特定奖励目标上变强的同时,通常会牺牲一部分通用性、事实性或者自然分布下的稳定性。
七、Agentic RL 阶段:环境反馈蒸馏
7.1 阶段意义
Agentic RL 是 MiniMind 训练链路的最后阶段,也是蒸馏思想最复杂的应用场景。在这一阶段,"教师"不再是一个单一的模型,而是整个工具执行环境。
当模型调用工具并获得执行结果时,这个结果本身就是一种"反馈信号"------模型通过多轮 trial-and-error,学习"哪些工具调用是有效的"、"怎样的推理链能命中 ground truth"。
奖励函数的构成:
R ( τ ) = R answer + R tool + R format + R rm − R unfinished R(\tau) = R_{\text{answer}} + R_{\text{tool}} + R_{\text{format}} + R_{\text{rm}} - R_{\text{unfinished}} R(τ)=Ranswer+Rtool+Rformat+Rrm−Runfinished
- R answer R_{\text{answer}} Ranswer:最终答案是否命中 ground truth
- R tool R_{\text{tool}} Rtool:工具调用是否合法
- R format R_{\text{format}} Rformat:输出格式是否合规
- R rm R_{\text{rm}} Rrm:Reward Model 的评分
- R unfinished R_{\text{unfinished}} Runfinished:未完成任务的惩罚
7.2 阶段目标
| 目标维度 | 具体目标 | 验证方式 |
|---|---|---|
| 工具调用 | 能正确调用工具并利用结果 | 数学 ToolUse 测试:85% vs SFT 的 60% |
| 多步推理 | 能通过多轮调用完成复杂任务 | 连锁计算测试(如 "(94)-35" → 59) |
| 延迟奖励 | 学会在整轮结束后才获得反馈 | 训练曲线的 reward 持续上升 |
八、全流程总结:蒸馏视角的 LLM 训练
8.1 各阶段蒸馏形态汇总
| 训练阶段 | 蒸馏类型 | 教师 | 学生学到的 | 蒸馏信号 |
|---|---|---|---|---|
| 预训练 | 无直接蒸馏 | --- | 语言基础能力 | 海量文本的统计规律 |
| SFT | 黑盒蒸馏 | Qwen3 / R1 等 | 回答风格、推理链、工具调用 | 教师的最终输出文本 |
| 白盒蒸馏 | 白盒蒸馏 | MoE / 更大模型 | Token 分布偏好(暗知识) | 教师的 logits 概率分布 |
| LoRA | 轻量化迁移 | 基模 + 领域数据 | 垂直领域知识 | 领域数据的监督信号 |
| DPO | 隐式偏好蒸馏 | 人类偏好数据 | 好坏回答的区分 | chosen vs rejected 概率比 |
| PPO/GRPO | 在线 AI 蒸馏 | Reward Model | 回答质量的实时评价 | 奖励模型的分数 |
| Agentic RL | 环境反馈蒸馏 | 工具环境 + RM | 有效工具调用策略 | 多步轨迹的延迟奖励 |
8.2 蒸馏流程的完整演进路径
阶段1: 预训练
意义 → 建立语言能力基底(没有它,后续蒸馏无从谈起)
目标 → 学会"认字读书"
▼
阶段2: SFT(含黑盒蒸馏)
意义 → 从教师输出中学习回答方式和知识
目标 → 学会"照着老师的答案写"
▼
阶段3: 白盒蒸馏
意义 → 从教师内部分布中学习更细腻的判断
目标 → 学会"理解老师为什么这样选"
▼
阶段4: LoRA
意义 → 用极少参数代价迁移到垂直领域
目标 → 学会"在特定领域发挥专长"
▼
阶段5: RL 对齐(DPO/PPO/GRPO)
意义 → 从人类/AI 反馈中学习偏好
目标 → 学会"分辨好坏回答"
▼
阶段6: Agentic RL
意义 → 从环境交互中学习工具调用策略
目标 → 学会"善用工具解决问题"
8.3 蒸馏成功的判断标准
| 指标 | 衡量方式 | 期望趋势 |
|---|---|---|
| CE 损失 | 学生对 ground-truth 的交叉熵 | 持续下降 |
| KL 散度 | 学生分布与教师分布的差异 | 持续下降 |
| 奖励分数 | RL 阶段的奖励模型评分 | 持续上升 |
| 任务准确率 | 端到端测试(ToolUse / 问答) | 持续上升 |
| 通用性保持 | 非蒸馏任务的性能 | 尽量不下降 |
九、实践建议
9.1 何时选择黑盒蒸馏
- 无法获取教师模型的 logits(如使用闭源 API)
- 数据规模大,需要高效率训练
- 关注回答风格和格式迁移,不关注分布细节
9.2 何时选择白盒蒸馏
- 可以访问教师模型的权重和 logits
- 希望学生模型学到更细腻的知识(如"暗知识")
- 需要跨架构蒸馏(MoE → Dense)
9.3 蒸馏的常见陷阱
- 教师过强、学生过弱:KL 散度太大,学生无法有效拟合,训练不稳定
- 温度过高:教师分布过度平滑,"暗知识"稀释为噪声
- α 设置不当:α 过小会忽略硬标签监督,导致事实性下降
- 过度蒸馏:学生过度模仿教师分布,可能丢失自身特性,导致生成多样性下降
十、总结
本文核心要点:
- 蒸馏贯穿全链路:从 SFT 的黑盒蒸馏,到白盒蒸馏的 logits 级拟合,到 RL 的 AI 反馈蒸馏,蒸馏不是孤立的一步,而是 LLM 训练中的核心知识迁移机制
- 黑盒 vs 白盒各有适用场景:黑盒蒸馏高效且数据易获取,白盒蒸馏细腻且能传递"暗知识",二者不是替代关系而是互补关系
- 预训练是蒸馏的前提:没有扎实的语言基底,再好的教师也无法有效传递知识
- 白盒蒸馏的三要素 :α 控制硬/软标签平衡,T 控制分布软化程度, T 2 T^2 T2 保证梯度量级一致
- 蒸馏有代价:RL 对齐会带来"对齐税",蒸馏会降低生成多样性------工程实践需要在能力提升与通用性保持之间权衡
📌 项目地址 :https://github.com/jingyaogong/minimind
📂 数据集下载 :ModelScope - minimind_dataset