MiniMind知识蒸馏:大语言模型蒸馏全流程深度解析

📌 本文亮点:从黑盒到白盒,从理论到代码,全面解析 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. 每个训练阶段,蒸馏扮演什么角色?意义是什么?
  2. 每个阶段的具体目标是什么?如何判断蒸馏是否成功?

一、知识蒸馏总览:从黑盒到白盒

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_len340 提升至 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(对数概率),这与 PyTorch kl_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 散度太大,学生无法有效拟合,训练不稳定
  • 温度过高:教师分布过度平滑,"暗知识"稀释为噪声
  • α 设置不当:α 过小会忽略硬标签监督,导致事实性下降
  • 过度蒸馏:学生过度模仿教师分布,可能丢失自身特性,导致生成多样性下降

十、总结

本文核心要点:

  1. 蒸馏贯穿全链路:从 SFT 的黑盒蒸馏,到白盒蒸馏的 logits 级拟合,到 RL 的 AI 反馈蒸馏,蒸馏不是孤立的一步,而是 LLM 训练中的核心知识迁移机制
  2. 黑盒 vs 白盒各有适用场景:黑盒蒸馏高效且数据易获取,白盒蒸馏细腻且能传递"暗知识",二者不是替代关系而是互补关系
  3. 预训练是蒸馏的前提:没有扎实的语言基底,再好的教师也无法有效传递知识
  4. 白盒蒸馏的三要素 :α 控制硬/软标签平衡,T 控制分布软化程度, T 2 T^2 T2 保证梯度量级一致
  5. 蒸馏有代价:RL 对齐会带来"对齐税",蒸馏会降低生成多样性------工程实践需要在能力提升与通用性保持之间权衡

📌 项目地址https://github.com/jingyaogong/minimind

📂 数据集下载ModelScope - minimind_dataset

📂 模型权重ModelScope - minimind-3 | HuggingFace - minimind-3