这两天 AI 圈最有看点的消息,莫过于 Meta 时隔 16 个月重新以开源姿态杀回大模型竞技场。更令人关注的是,扎克伯格在公开表态中明确力挺“蒸馏”这条技术路线。一边是开源与闭源的路线之争,一边是“老师带学生”的模型压缩思路,两个关键词叠加在一起,把大模型行业的竞争焦点拉到了一条非常清晰的坐标上:不再单纯卷参数量,而是卷推理效率、卷生态、卷工程化能力。
这篇文章不打算只停留在新闻层面解读,而是把“蒸馏”这个技术核心彻底拆开。全文会从概念原理讲起,逐步深入到损失函数设计、PyTorch 手写实现,再到 LLM 环境下的工程落地与高频踩坑点,希望帮你建立一套完整可用的知识体系。
1. 事件背景:Meta 开源回归与蒸馏站上风口
1.1 为什么说“16 个月后杀回开源”
Meta 在开源大模型领域一直是一个特殊的存在。早期的 Llama 系列模型以开放权重的方式发布后,迅速成为开源社区微调、部署和二次开发的基础底座。无论是学术界的低成本研究,还是创业公司的私有化部署,Llama 系列都是绕不开的参考系。
但在过去一段时间里,Meta 在开源大模型上的节奏明显放缓。版本发布空窗期长达 16 个月,社区里甚至出现了一些担忧:Meta 是否要转向更保守的技术策略?毕竟开源模型面临着被商用、被蒸馏、被二次分发的风险,这对于任何一家商业公司来说都是需要反复权衡的决策。
而这一次重新回归开源,并且明确表态支持蒸馏,信号意义非常强烈。它说明 Meta 对开源生态的判断没有改变:与其把模型锁在封闭环境里,不如通过开源建立事实标准,让整个社区的开发者都基于自己的模型体系去做应用创新。蒸馏本身则被看作是一条让开源模型能力“安全扩散”的途径——不是简单复制参数,而是把大模型的知识提炼到更小、更高效的模型里。
1.2 蒸馏为什么成为关键词
蒸馏并不是新概念。它最早可以追溯到 2015 年左右 Geoffrey Hinton 等人提出的知识蒸馏框架,核心思想是让一个复杂的教师模型“教”一个精简的学生模型,从而在保持较高精度的同时大幅降低模型体积。
但在大模型时代,蒸馏的地位发生了质变。原因有两个方面。
第一,推理成本成为大模型落地的头号瓶颈。一个数百亿参数的大模型即使能力强,部署成本、响应延迟、显存占用都会让中小团队望而却步。而蒸馏正好可以在能力与成本之间找到一个平衡点。
第二,开源生态中出现了大量基于蒸馏的训练范式。无论是把通用大模型的能力蒸馏到垂直领域小模型,还是把长思维链推理能力压缩到轻量模型,都已经成为社区里非常成熟的玩法。
扎克伯格点赞蒸馏,本质上是在回应一个行业共识:未来的大模型竞争不只看谁训练出来的模型最大,还要看谁能把模型能力以最低成本、最高效率地分发出去。
1.3 开源与蒸馏的“双向奔赴”
开源和蒸馏之间其实存在一种天然的配合关系。
开源模型给了蒸馏合法的“教师来源”。社区开发者可以基于开源大模型的输出去构造蒸馏数据集,再训练自己的小模型,不需要重复昂贵的预训练过程。同时,蒸馏又反过来降低了开源模型的使用门槛,让更多开发者有能力把大模型的能力内嵌到自己的产品中。
换句话说,开源提供了知识的上游,蒸馏则打通了知识向下游流动的通道。Meta 同时押注这两个方向,背后的战略逻辑是比较清晰的:生态规模比单点模型能力更重要。
2. 知识蒸馏是什么:老师带学生的压缩艺术
2.1 一个直观的比喻
在没有蒸馏的情况下训练小模型,相当于让一个学生只看教材自学。教材虽然信息量大,但缺乏针对性,学生容易抓不住重点,学出来效果自然打折。
蒸馏的做法则完全不同:先让一个经验丰富的老师(教师模型)把知识点吃透,然后老师不是直接给学生划考试答案,而是把自己做题时的“思考痕迹”和“判断倾向”也一并传递给学生。学生在老师的引导下,能更快抓住知识的核心。
放到模型训练里,教师模型在输出预测时,不仅仅给出一个唯一正确的类别,而是会给出一个概率分布。比如一张手写数字图片,教师模型可能认为它是 7 的概率是 0.7,是 1 的概率是 0.2,是 9 的概率是 0.1。这个分布本身就包含了大量隐藏信息——数字 7 和 1 在形状上的相似性、数字 9 和 7 在笔画上的关联——这些都是普通硬标签无法表达的。
2.2 专业定义
从专业角度定义,知识蒸馏是一种模型压缩与知识迁移技术。它通过让一个参数量较大的教师模型(Teacher Model)指导一个参数量较小的学生模型(Student Model)训练,使学生模型能够模仿教师模型的输出行为,从而获得接近教师模型的泛化能力。
整个过程通常包含以下几个步骤:
- 训练或获取一个高精度的教师模型。
- 准备训练数据集,数据可以是原始数据集,也可以是教师模型生成的增强数据。
- 在训练学生模型时,同时使用教师模型的软输出和真实硬标签作为监督信号。
- 通过蒸馏损失函数约束学生模型,使其输出分布向教师模型靠拢。
2.3 蒸馏能解决什么问题
在实际工程中,蒸馏主要被用来解决三类问题。
第一类是部署资源受限问题。移动端、边缘设备、低配服务器无法承载大模型的推理压力,需要通过蒸馏得到一个小模型。
第二类是知识隔离问题。多个教师模型各自擅长不同的领域,通过蒸馏可以把它们的能力合并到一个统一的小模型中,方便维护和部署。
第三类是推理速度优化。在在线推理场景中,响应时间直接决定用户体验,蒸馏后的小模型可以把单次推理延迟降低一个数量级以上。
2.4 容易混淆的概念
以下几个概念经常和蒸馏混在一起,需要区分清楚。
微调(Fine-tuning)是在预训练大模型的基础上,使用标注数据继续训练,让模型适应特定任务。微调不会改变模型结构,小模型微调仍然是小模型,大模型微调后仍然是大模型。
剪枝(Pruning)是删除模型中不重要的权重或神经元,直接压缩模型结构。蒸馏不删参数,而是重新训练一个全新的小模型。
量化(Quantization)是把模型权重从 FP32 降低到 FP16 或 INT8,减少存储和计算开销。量化不改变模型结构,只改变数值精度。
蒸馏与它们最大的不同在于:蒸馏训练出了一个全新的、更小的模型,而这个模型的“知识”来源于教师模型的输出行为,而不是简单地从大模型上裁切或压缩。
3. 知识蒸馏核心原理拆解
3.1 教师模型与学生模型
教师模型和学生模型之间没有严格的架构约束。教师模型可以是一个大而深的网络,学生模型可以是一个小而浅的网络,甚至两者的结构可以完全不同。
关键点在于:教师模型的能力必须明显强于学生模型独立训练能达到的水平。如果教师模型本身精度不高,它提供的软标签就没有太多额外信息量,蒸馏效果自然有限。
在实际项目中,教师模型通常有以下几种来源:
- 一个已经训练好的开源大模型,比如各种开放权重模型。
- 自己训练的、参数量较大的专用模型。
- 多个模型的集成,取它们的平均输出作为软标签。
学生模型的选择则需要结合部署场景。如果目标是移动端推理,可以设计非常紧凑的网络结构;如果目标是中低配置服务器,可以保留一定的宽度和深度。
3.2 软标签与温度参数
这是蒸馏技术最核心的细节。
普通分类任务训练时,模型输出经过 Softmax 后得到一个概率分布,公式是:
softmax(z_i) = exp(z_i) / sum_j exp(z_j)这个分布被称为“硬分布”,因为正确类别的概率会被拉得很高,其他类别的概率趋近于 0。如果直接用这个分布来教学生模型,学生能学到的信息非常有限。
Hinton 等人提出的改进方式是引入温度参数 T,把 Softmax 改为:
softmax(z_i / T) = exp(z_i / T) / sum_j exp(z_j / T)T 值越大,输出的概率分布就越平滑,类别之间的相对差异也会被放大。打个比方,教师模型原本认为一张图片是 7 的概率是 0.7、是 1 的概率是 0.2、是 9 的概率是 0.1。经过高温 Softmax 之后,这个分布可能变成 0.35、0.30、0.25,学生模型就能更明显地感受到“7 和 1 有点像”这个隐式知识。
T 的取值需要实验调整。常用范围在 2 到 8 之间。T 太小,软标签接近硬标签,蒸馏退化为普通训练;T 太大,所有类别概率都趋于均匀,有用的信息被稀释。
3.3 损失函数设计
蒸馏训练时,学生模型同时受到两个监督信号约束。
第一个信号是教师模型的软标签。学生模型的输出也要除以相同的 T,然后与教师模型的软标签计算 KL 散度,衡量两个分布之间的差异。
第二个信号是真实硬标签。学生模型的原始输出和真实标签计算交叉熵,保证学生模型不会偏离正确答案。
最终的蒸馏损失是两者的加权和:
loss = alpha * KL(soft_student, soft_teacher) * T^2 + (1 - alpha) * CE(student, hard_label)这里要注意,KL 散度部分需要乘以T^2。原因是 Softmax 除以 T 之后,梯度会按比例缩小,乘以T^2可以抵消这种影响,让梯度尺度恢复到和普通训练接近的水平。alpha是一个超参数,控制软标签和硬标签的权重比例,常见取值为 0.7。
3.4 特征层蒸馏与输出层蒸馏
除了对输出层做蒸馏,还有一种更细粒度的做法:对中间特征层做蒸馏。
输出层蒸馏只能让学生模型模仿教师模型的最终判断,但教师模型在中间层提炼到的语义特征,学生模型是感知不到的。特征层蒸馏的思路是:在教师模型和学生模型的中间层之间建立一一对应的对齐关系,让学生模型的中间特征尽可能接近教师模型的中间特征。
典型的实现方式是计算中间特征之间的均方误差,或者使用注意力图对齐。这类方法在视觉任务中效果尤为明显,因为中间层特征往往对应着边缘、纹理、语义部件等不同级别的视觉信息。
不过特征层蒸馏对模型结构对齐有要求。如果教师模型和学生模型的通道数、层数差异太大,需要额外设计映射层,工程复杂度会明显上升。
4. PyTorch 实现蒸馏实战:MNIST 手写数字分类
4.1 环境准备
本文示例使用 PyTorch 实现一个完整的蒸馏训练流程,环境如下:
- Python 3.9 或更高版本
- PyTorch 1.13 或更高版本
- torchvision 0.14 或更高版本
- CPU 即可运行,有 GPU 会明显加快训练
版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示配置思路。
安装依赖:
pip install torch torchvision4.2 创建项目结构
项目结构如下:
distill_demo/ ├── model.py # 教师模型与学生模型定义 ├── train_teacher.py # 教师模型训练脚本 ├── distill.py # 蒸馏训练脚本 └── eval.py # 学生模型评估脚本4.3 定义模型结构
创建model.py,定义两个模型。教师模型使用一个较大的两层全连接网络,学生模型使用一个更小的单层隐藏层网络。
# 文件路径:distill_demo/model.py import torch import torch.nn as nn class TeacherNet(nn.Module): """教师模型:参数较多,容量较大""" def __init__(self): super().__init__() self.layers = nn.Sequential( nn.Linear(28 * 28, 512), nn.ReLU(), nn.Linear(512, 256), nn.ReLU(), nn.Linear(256, 10) ) def forward(self, x): return self.layers(x.view(x.size(0), -1)) class StudentNet(nn.Module): """学生模型:参数较少,计算量小""" def __init__(self): super().__init__() self.layers = nn.Sequential( nn.Linear(28 * 28, 64), nn.ReLU(), nn.Linear(64, 10) ) def forward(self, x): return self.layers(x.view(x.size(0), -1))这里的核心是展示两个模型在容量上的差异。教师模型每一层宽度都在 256 以上,拥有百万级参数;学生模型只有一层 64 维的隐藏层,参数量在万级左右。同样的数据量下,学生模型独立训练很难达到教师模型的精度,蒸馏的意义正在于此。
4.4 训练教师模型
创建train_teacher.py,完成数据加载和教师模型训练。
# 文件路径:distill_demo/train_teacher.py import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms from model import TeacherNet def load_data(batch_size=128): transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_dataset = datasets.MNIST( root='./data', train=True, download=True, transform=transform ) test_dataset = datasets.MNIST( root='./data', train=False, download=True, transform=transform ) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) return train_loader, test_loader def evaluate(model, test_loader): model.eval() correct = 0 total = 0 with torch.no_grad(): for images, labels in test_loader: outputs = model(images) pred = outputs.argmax(dim=1) correct += (pred == labels).sum().item() total += labels.size(0) return correct / total def main(): device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') train_loader, test_loader = load_data() teacher = TeacherNet().to(device) optimizer = optim.Adam(teacher.parameters(), lr=1e-3) criterion = nn.CrossEntropyLoss() epochs = 6 for epoch in range(epochs): teacher.train() total_loss = 0.0 for images, labels in train_loader: images, labels = images.to(device), labels.to(device) optimizer.zero_grad() outputs = teacher(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() total_loss += loss.item() acc = evaluate(teacher, test_loader) print(f"Epoch {epoch + 1}/{epochs}, Loss: {total_loss / len(train_loader):.4f}, Test Acc: {acc:.4f}") torch.save(teacher.state_dict(), './teacher_model.pth') print("教师模型训练完成,模型已保存为 teacher_model.pth") if __name__ == '__main__': main()MNIST 数据集相对简单,教师模型训练 6 个 epoch 通常就能达到 98% 以上的测试准确率。保存下来的teacher_model.pth将作为蒸馏训练的“老师”。
4.5 蒸馏训练学生模型
创建distill.py,这是整个实战的核心脚本。
# 文件路径:distill_demo/distill.py import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms from model import TeacherNet, StudentNet from train_teacher import load_data, evaluate def distillation_loss(student_logits, teacher_logits, labels, temperature=4.0, alpha=0.7): """ 蒸馏损失函数 student_logits: 学生模型原始输出 teacher_logits: 教师模型原始输出 labels: 真实硬标签 temperature: 温度参数 T alpha: 软标签损失权重 """ soft_loss = nn.KLDivLoss(reduction='batchmean')( F.log_softmax(student_logits / temperature, dim=1), F.softmax(teacher_logits / temperature, dim=1) ) * (temperature * temperature) hard_loss = nn.CrossEntropyLoss()(student_logits, labels) return alpha * soft_loss + (1 - alpha) * hard_loss def main(): device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') train_loader, test_loader = load_data() teacher = TeacherNet().to(device) teacher.load_state_dict(torch.load('./teacher_model.pth', map_location=device)) teacher.eval() student = StudentNet().to(device) optimizer = optim.Adam(student.parameters(), lr=1e-3) temperature = 4.0 alpha = 0.7 epochs = 6 for epoch in range(epochs): student.train() total_loss = 0.0 for images, labels in train_loader: images, labels = images.to(device), labels.to(device) optimizer.zero_grad() student_logits = student(images) with torch.no_grad(): teacher_logits = teacher(images) loss = distillation_loss( student_logits, teacher_logits, labels, temperature=temperature, alpha=alpha ) loss.backward() optimizer.step() total_loss += loss.item() acc = evaluate(student, test_loader) print(f"Epoch {epoch + 1}/{epochs}, Loss: {total_loss / len(train_loader):.4f}, Test Acc: {acc:.4f}") torch.save(student.state_dict(), './student_model_distilled.pth') print("蒸馏训练完成,学生模型已保存为 student_model_distilled.pth") if __name__ == '__main__': main()蒸馏训练过程中,教师模型始终处于评估模式,不参与梯度更新。学生模型的梯度只由蒸馏损失反向传播得到。这也是蒸馏在工程上成本较低的原因:教师模型只需要做一次前向推理,不需要回传梯度。
4.6 结果对比
为了验证蒸馏的效果,可以写一个简单脚本,对比三组实验:
- 教师模型测试准确率。
- 学生模型独立训练(不使用蒸馏)的准确率。
- 学生模型蒸馏训练的准确率。
# 文件路径:distill_demo/eval.py import torch from model import TeacherNet, StudentNet from train_teacher import load_data, evaluate def main(): device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') _, test_loader = load_data() teacher = TeacherNet().to(device) teacher.load_state_dict(torch.load('./teacher_model.pth', map_location=device)) teacher_acc = evaluate(teacher, test_loader) print(f"教师模型准确率: {teacher_acc:.4f}") student_distilled = StudentNet().to(device) student_distilled.load_state_dict(torch.load('./student_model_distilled.pth', map_location=device)) student_distilled_acc = evaluate(student_distilled, test_loader) print(f"蒸馏学生模型准确率: {student_distilled_acc:.4f}") if __name__ == '__main__': main()典型结果会呈现如下趋势:
| 模型 | 参数量 | 测试准确率 |
|---|---|---|
| 教师模型 | 约 130 万 | 约 0.985 |
| 学生模型独立训练 | 约 5 万 | 约 0.965 |
| 学生模型蒸馏训练 | 约 5 万 | 约 0.978 |
可以看到,学生模型参数只有教师模型的几十分之一,但经过蒸馏后,准确率比独立训练高出 1 个百分点以上,非常接近教师模型。这个差距在更复杂的数据集和任务上会更加明显。
5. 大模型场景下的蒸馏工程实践
5.1 大模型蒸馏的三种主流路线
在 LLM 场景下,蒸馏不再只是计算输出分布,而是衍生出多种更贴近实际任务的范式。
第一种是意图蒸馏,也被称为指令蒸馏。核心做法是让大模型针对一批指令生成高质量回复,再把这些回复作为小模型的训练目标。小模型学习的不只是答案本身,还包括大模型理解指令、组织语言的方式。
第二种是推理链蒸馏。对于需要多步推理的任务,直接让大模型输出最终答案并不能教会小模型思考过程。推理链蒸馏会让大模型先输出完整的中间推理过程,再让小模型学习这条推理链。这也是提升小模型逻辑推理能力的有效手段。
第三种是偏好蒸馏。利用大模型对同一问题生成多个候选回答,并用奖励模型或人工排序给出偏好信号,然后让小模型学习排序信息,从而掌握与人类偏好对齐的能力。
5.2 蒸馏数据的构造与筛选
蒸馏数据的质量直接决定学生模型的天花板。
在大模型蒸馏中,不能简单地把原始训练数据直接喂给教师模型生成输出就完事。需要进行充分的筛选与清洗。
首先要关注输出的正确性。教师模型输出不一定全部可靠,尤其是超出其能力边界的复杂问题时,教师模型也可能一本正经地给出错误答案。用这些错误答案训练学生模型,会把错误也“蒸馏”进去。
其次要关注样本的多样性。如果教师模型生成的数据集中在少数高频指令上,学生模型很容易过拟合,对于长尾指令缺乏泛化能力。
实际工程中比较稳妥的做法是:用教师模型对一批种子数据进行增强,然后按规则做质量过滤,再结合人工抽检和规则判分,筛选出高置信度的样本作为训练集。数据规模不需要追求极限,质量优先。
5.3 蒸馏后模型的评估
蒸馏完成不代表任务结束,评估环节需要特别用心。
除了通用的自动评估指标,蒸馏模型还需要专门对比它和教师模型在行为上的一致性。常用的评估维度包括:
- 准确率下降幅度是否在可接受范围内。
- 在分布外数据上的泛化能力。
- 长尾场景和边缘样本的处理效果。
- 推理延迟和显存占用是否满足部署要求。
一个常见的误区是只看平均准确率。平均准确率接近并不意味着小模型在所有场景下都继承了教师模型的能力,可能只是在大类上表现接近,在细粒度分类或罕见场景上明显退化。因此,按场景拆分评估结果,甚至建立分类别、分难度的评估矩阵,是更严谨的做法。
6. 常见问题与排查思路
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 蒸馏后学生模型准确率反而低于独立训练 | 温度参数设置不当,软标签信息丢失 | 尝试增大 T 至 4 到 8,检查软硬标签权重 alpha |
| 训练过程中损失出现 NaN | 学习率过大,导致梯度爆炸 | 调低学习率,增加梯度裁剪 |
| 教师模型输出全为均匀分布 | 教师模型未切换到评估模式或未正确加载权重 | 检查model.eval()和无梯度上下文 |
| 学生模型收敛但泛化差 | 蒸馏数据过于单一,多样性不足 | 扩充数据来源,增加教师模型生成的增强样本 |
| 特征层蒸馏不收敛 | 中间特征维度不对齐,映射层设计不合理 | 引入适配层对齐维度,或改用输出层蒸馏 |
| 大模型蒸馏后幻觉问题加重 | 教师模型本身输出含幻觉,被一并蒸馏 | 先用规则过滤低置信度输出,再做人工抽检 |
排查时建议按顺序执行:先确认教师模型单独推理的精度是否达标,再以小批量数据验证蒸馏损失是否正常下降,最后逐步增加训练数据量。不要一上来就怀疑蒸馏算法本身,多数问题出在数据或超参数上。
7. 最佳实践与工程建议
7.1 蒸馏训练中的调参策略
温度 T 和软硬损失权重 alpha 是蒸馏实验中最重要的两个超参数。
实践中可以先固定 alpha 为 0.7,在 T 为 2、4、6、8 之间做一组对比实验,观察学生模型在验证集上的表现。之后再固定最优 T,对 alpha 做微调。alpha 过大会导致学生模型过度模仿教师模型,忽略真实标签中的强监督信号;alpha 过小则蒸馏失去了意义,退化为普通训练。
学习率方面,蒸馏训练通常可以采用和独立训练相近甚至略低的学习率。因为教师模型的软标签相对稳定,梯度方向波动较小,但若学习率过大,学生模型仍然可能震荡不收敛。
7.2 注意教师模型的授权与合规
在模型蒸馏的工程落地中,一个经常被忽略的问题是教师模型的使用授权。
使用开源大模型作为教师模型时,需要仔细阅读模型许可证中的条款。部分开源模型虽然在权重上开放,但对模型的二次使用、商用、以及基于模型输出进行训练有额外限制。蒸馏本质上是在教师模型的输出基础上训练新模型,这属于典型的二次利用场景,必须确认授权边界。
在生产环境中,建议由法务和合规团队参与评估。同时保留完整的蒸馏数据溯源记录,包括教师模型版本、输入数据、输出数据、过滤规则,确保后续审计时有据可查。
7.3 工程化落地建议
蒸馏模型上线前,需要建立完善的评测与监控体系。
一条比较稳妥的落地路径是:先在离线环境中用小批量真实流量回放数据评估蒸馏模型与教师模型的差异,再通过灰度发布逐步放大流量比例,同时监控线上业务指标和模型输出质量。如果发现线上效果下滑,要及时回滚到教师模型,并分析是数据分布漂移导致的还是蒸馏能力不足导致的。
从维护角度看,蒸馏模型并不是一次训练就结束的产物。教师模型升级后,需要重新生成蒸馏数据集并迭代学生模型。建议把蒸馏流程沉淀成自动化流水线,数据更新、模型训练、评估、发布全链路打通,这样每次教师模型升级时,学生模型也能同步保持最新能力。
8. 总结与下一步学习路线
本文从 Meta 开源回归和蒸馏获得力挺的行业事件切入,完整拆解了知识蒸馏的核心原理与实战流程。你可以从中学到几个关键点:
第一,蒸馏的本质是通过模仿教师模型的软输出,让学生模型获得超越自身容量的泛化能力,是一种低成本、高效率的模型压缩方式。
第二,温度参数和软标签是蒸馏的灵魂。没有温度调节,软标签退化为硬标签,蒸馏就失去了意义。
第三,从 PyTorch 手写实现到 LLM 蒸馏工程,核心思路是一脉相承的:构造高质量的教师输出数据,设计合理的损失约束,建立严格的评估与监控机制。
如果想继续深入,建议按以下顺序展开学习:
- 阅读 Hinton 等人关于知识蒸馏的原始论文,理解温度与损失函数设计的推导动机。
- 尝试把蒸馏方法迁移到 CIFAR-10、ImageNet 等更复杂的数据集,观察不同模型容量差异下蒸馏效果的变化。
- 研究当前主流 LLM 蒸馏框架的实现细节,重点关注数据构造和评估方式。
- 在自己熟悉的任务上,用一个小规模的教师模型配合一个更小的学生模型跑通全流程,再逐步扩大数据规模。
蒸馏不是一门“背公式”的技术,而是一套需要结合数据、模型、业务场景反复调优的工程方法。建议你亲手把文中的 MNIST 示例跑一遍,改一改温度、换一换模型结构,直观感受一下超参数对蒸馏效果的影响。理解了这个过程,再看任何蒸馏相关的论文和框架,都会轻松很多。