1. 从“点名”说起:蒸馏争议到底在吵什么
过去这段时间,圈子里讨论度最高的话题之一,就是几家中国大模型公司被海外同行公开点名,说它们通过“蒸馏”手段“偷”了别人的模型能力。消息一出,技术群、社交平台、行业媒体全炸了锅。有人义愤填膺,觉得这是知识产权层面的越界;也有人觉得这不过是商业竞争里的常规操作,没必要上纲上线。但吵归吵,真正把“蒸馏”这件事讲清楚的人并不多。
我自己做大模型相关的工作有些年头了,从早期折腾微调脚本,到后来参与过模型压缩和推理优化的项目,对蒸馏这条技术路线算是比较熟悉。看到这个新闻的时候,我的第一反应不是站队,而是想:大多数人其实并不清楚蒸馏到底是什么、它能“偷”走什么、又偷不走什么。所以这篇内容,我想从一个一线从业者的角度,把这件事拆开揉碎讲一遍。不管你是刚入门的大模型学习者,还是已经在做微调、部署、推理优化的工程师,应该都能从中拿到一些有用的东西。
先给一个最简版的结论:蒸馏本身是一种完全合法且公开的技术手段,它的核心思想是让一个小模型去模仿一个大模型的输出分布。但“蒸馏”这个词涵盖的范围非常广,从最正规的离线知识蒸馏,到灰色地带的黑盒蒸馏,再到直接拿别人模型的输出当训练数据,技术上的界限其实很模糊。争议的焦点不在于“用没用蒸馏”,而在于“数据从哪来、用了多少、是否违反服务条款”。
提示:本文讨论的是技术原理和工程实践,不涉及任何具体公司的法律定性。技术是中性的,怎么用才是关键。
2. 蒸馏的技术底子:小模型怎么“学”大模型
2.1 知识蒸馏的基本原理
知识蒸馏这个概念其实不新,2015年Hinton那篇经典论文就已经把框架搭好了。核心思路很朴素:一个已经训练好的大模型(教师模型),它的输出不只是“正确答案”,还包含了大量关于“错误答案”的信息。比如一个图像分类模型,看到一张猫的图片,它可能给出“猫 0.9,狗 0.07,兔子 0.02”这样的概率分布。这个分布里,“狗比兔子更像猫”这个信息,就是所谓的“暗知识”。
传统的训练方式只告诉学生模型“这是猫”,但蒸馏会告诉它“这是猫,但有点像狗,完全不像兔子”。学生模型通过拟合这个软标签分布,能学到比硬标签更丰富的信息。用生活化的类比来说,就像学做菜:只看菜谱(硬标签)你只能知道放多少盐,但跟着师傅在旁边看(软标签),你能学到火候、颠勺的节奏、什么时候该翻面这些菜谱上写不出来的东西。
蒸馏的损失函数通常由两部分组成:一部分是学生模型和教师模型软输出之间的KL散度,另一部分是学生模型和真实硬标签之间的交叉熵。用公式表示大概是这样:
# 蒸馏损失的核心计算逻辑(简化示意) import torch import torch.nn.functional as F def distillation_loss(student_logits, teacher_logits, true_labels, T=4.0, alpha=0.7): # 软标签损失:KL散度,温度T用于平滑概率分布 soft_loss = F.kl_div( F.log_softmax(student_logits / T, dim=-1), F.softmax(teacher_logits / T, dim=-1), reduction='batchmean' ) * (T * T) # 硬标签损失:常规交叉熵 hard_loss = F.cross_entropy(student_logits, true_labels) # 加权组合 return alpha * soft_loss + (1 - alpha) * hard_loss这里的温度参数T很关键。T越大,概率分布越平滑,暗知识暴露得越充分;T越小,分布越尖锐,接近硬标签。实践中T一般取2到10之间,需要根据任务调。alpha则是软硬损失的权重,通常软标签占大头,因为那才是蒸馏的价值所在。
2.2 大模型时代蒸馏的变体
到了大模型时代,蒸馏的玩法发生了很大变化。传统蒸馏里教师和学生通常是同架构的,只是参数量不同。但现在的大模型蒸馏,教师可能是千亿参数的稠密模型,学生可能是几十亿的MoE模型,架构差异巨大。这就催生了几种新的蒸馏范式。
第一种是响应蒸馏,也叫黑盒蒸馏。你只能拿到教师模型的输出文本,拿不到logits、注意力权重这些内部信息。这种情况下,学生模型只能通过拟合教师生成的文本来学习。这也是争议最大的方式,因为本质上你是在用别人模型的输出当训练数据。很多API服务条款里明确禁止用输出数据训练竞品模型,但技术上很难检测和约束。
第二种是特征蒸馏,也叫白盒蒸馏。你能拿到教师模型的中间层表示、注意力矩阵等内部信息,可以让学生模型去拟合这些特征。这种方式效果通常更好,但前提是你得能访问教师模型的内部结构。开源模型比如LLaMA系列,就经常被用来做这种蒸馏的教师。
第三种是自蒸馏,同一个模型自己教自己,或者用大版本教小版本。这种在模型迭代中很常见,比如DeepSeek的V系列和R系列之间就有类似的技术路线。
2.3 蒸馏、微调、RLHF的区别与联系
很多人容易把蒸馏和微调搞混。微调是在预训练模型的基础上,用特定领域的数据继续训练,让模型适应某个任务。蒸馏则是让一个模型去模仿另一个模型的行为。两者可以结合使用:先用教师模型生成大量领域数据,再用这些数据微调学生模型,这其实就是响应蒸馏的一种实现。
RL(强化学习)又是另一条路线。RLHF(基于人类反馈的强化学习)是通过奖励模型来引导模型输出更符合人类偏好的内容。蒸馏和RL可以叠加:先用RL训练出一个强教师模型,再蒸馏到小模型上。KL散度在这里既是蒸馏的损失函数,也是RLHF中约束模型不要偏离太远的正则项。
ODP这个词在热词里出现了,我理解可能是指“On-policy Distillation”或者某种在线蒸馏策略。核心思想是学生模型自己生成样本,教师模型对这些样本给出反馈,然后学生根据反馈更新。这种方式比纯离线蒸馏更高效,因为学生是在自己的输出分布上学习的,避免了分布不匹配的问题。
3. “偷”走的到底是什么:能力、数据还是时间
3.1 模型能力的可迁移性
回到标题里的问题:他们到底偷走了什么?从技术角度看,蒸馏能迁移的主要是输入输出之间的映射关系。教师模型见过海量数据,学到了复杂的模式,这些模式体现在它的输出分布里。学生模型通过拟合这些分布,相当于间接获取了教师从数据中学到的知识。
但这里有个关键限制:蒸馏能迁移的是教师模型已经学会的东西,而不是教师模型本身。学生模型不会因为蒸馏就拥有教师模型的全部能力,它只是在模仿教师的输出行为。就像一个学生跟着名师学解题,他能学会名师讲过的题,但遇到名师没讲过的新题型,他还是得靠自己。
具体来说,蒸馏能迁移的能力包括:语言生成的基本流畅度、常见知识的问答能力、特定格式的输出能力、一定的推理链模仿能力。但迁移不了的是:教师模型在预训练阶段从原始数据中提取的底层表示、注意力机制中的精细模式、以及模型规模带来的涌现能力。
3.2 数据飞轮的加速效应
蒸馏真正“偷”走的,其实是时间。一个从零训练的大模型,需要海量数据、大量算力、漫长的时间。但通过蒸馏,你可以在几个月甚至几周内,让一个小模型达到接近教师模型在某些任务上的表现。这相当于跳过了预训练阶段最耗时的部分,直接站在别人的肩膀上。
这也是为什么蒸馏在工业界这么受欢迎。企业不需要从头训练一个千亿模型,只需要拿开源模型或者API输出做教师,蒸馏出一个几十亿参数的小模型,就能在特定场景下达到可用的效果。成本可能只有从头训练的几十分之一。
但这里有个隐患:如果所有人都走蒸馏路线,没有人做原始创新,整个生态就会变成“互相蒸馏”的死循环。教师模型的能力上限决定了学生模型的天花板,而教师模型本身也需要持续进化。这就是为什么原创的预训练工作依然不可替代。
3.3 黑盒蒸馏的灰色地带
黑盒蒸馏是争议最大的区域。你通过API调用教师模型,拿到大量输出,然后用这些输出训练自己的模型。从技术上说,这和“用别人的模型生成数据”没有本质区别。但从商业伦理和服务条款角度看,很多API明确禁止这种用途。
问题在于,检测黑盒蒸馏非常困难。你无法证明对方的训练数据里有多少来自你的API输出。而且,即使检测到了,法律上的定性也很复杂。模型输出是否受版权保护、蒸馏是否构成不正当竞争,这些问题在不同法域下的答案都不一样。
我个人的看法是,技术社区应该建立更明确的规范:哪些蒸馏方式是可接受的,哪些是越界的。比如,用开源模型做教师进行白盒蒸馏,大家基本认可;但用闭源API的输出大规模训练竞品,就有问题了。这个界限需要行业共识,而不是靠个别公司单方面定义。
4. 实操视角:蒸馏一个自己的小模型
4.1 教师模型的选择与数据准备
假设你现在想自己动手蒸馏一个小模型,第一步是选教师。如果预算有限,可以用开源的大模型做教师,比如LLaMA系列、Qwen系列。这些模型可以本地部署,你能拿到完整的logits,做白盒蒸馏。如果预算充足,也可以用商业API做教师,但要注意服务条款的限制。
数据准备是蒸馏中最耗时的环节。你需要准备两类数据:一类是任务相关的输入,比如问题、指令、对话历史;另一类是教师模型对这些输入的输出。如果是白盒蒸馏,还需要保存教师的logits或中间层特征。
# 用教师模型生成蒸馏数据的简化流程 from transformers import AutoModelForCausalLM, AutoTokenizer import torch teacher_model = AutoModelForCausalLM.from_pretrained( "教师模型路径", torch_dtype=torch.float16, device_map="auto" ) teacher_tokenizer = AutoTokenizer.from_pretrained("教师模型路径") def generate_teacher_outputs(prompts, max_length=512): outputs = [] for prompt in prompts: inputs = teacher_tokenizer(prompt, return_tensors="pt").to(teacher_model.device) with torch.no_grad(): logits = teacher_model(**inputs).logits outputs.append({ "prompt": prompt, "logits": logits.cpu(), "input_ids": inputs["input_ids"].cpu() }) return outputs数据量方面,响应蒸馏通常需要几万到几十万条样本,白盒蒸馏因为信息密度更高,几万条就可能有效果。数据质量比数量重要,要确保覆盖目标任务的各种场景。
4.2 学生模型架构与训练配置
学生模型的选择要考虑部署环境。如果目标是本地部署,7B到13B是比较现实的区间;如果要在移动端跑,可能得压到1B到3B。架构上,现在主流的选择是Transformer decoder-only,和教师保持一致能简化蒸馏过程。
训练配置有几个关键参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 学习率 | 1e-5 到 5e-5 | 比常规微调小,避免破坏预训练知识 |
| 批次大小 | 根据显存调整 | 梯度累积可以模拟大batch |
| 温度T | 2.0 到 5.0 | 太高会引入噪声,太低暗知识不足 |
| alpha | 0.5 到 0.9 | 软标签权重,任务越复杂取值越高 |
| 训练轮数 | 2 到 5 | 过多容易过拟合教师噪声 |
训练过程中要监控两个指标:学生模型在验证集上的硬标签准确率,以及学生和教师输出之间的KL散度。理想情况下,KL散度应该稳步下降,但硬标签准确率不能掉太多。如果KL降了但准确率崩了,说明学生过度拟合了教师的错误。
4.3 蒸馏效果的评估方法
评估蒸馏效果不能只看loss曲线。我通常从三个维度来测:
第一是任务指标。在目标任务上跑测试集,看学生模型和教师模型的差距。如果差距在5%以内,基本算成功。
第二是生成质量。人工评估或者用GPT-4之类的强模型做裁判,对比学生和教师在相同输入下的输出。重点看流畅度、相关性、事实准确性。
第三是泛化能力。在教师没见过的任务上测试学生模型,看它是否保留了基本的语言能力。如果学生只在蒸馏数据上表现好,换个场景就崩,说明蒸馏过度了。
注意:蒸馏不是万能的。学生模型的能力上限受限于教师模型和训练数据。如果教师本身在某些任务上就弱,学生不可能凭空变强。
5. 常见问题与避坑指南
5.1 蒸馏训练中的典型故障
问题一:loss不下降或者震荡严重。最常见的原因是温度参数设置不当。T太大,软标签太平滑,学生学不到有效信号;T太小,软标签接近硬标签,蒸馏退化成普通微调。建议从T=4开始调,观察KL散度的变化趋势。
问题二:学生模型输出重复、退化。这通常是因为训练数据里教师输出本身就有重复模式,学生放大了这个问题。解决方法是在数据准备阶段做去重和过滤,或者在损失函数里加重复惩罚项。
问题三:显存不够。白盒蒸馏需要同时加载教师和学生模型,显存压力很大。可以用梯度检查点、混合精度、模型并行来缓解。如果实在不够,考虑离线蒸馏:先把教师的logits存到磁盘,训练时只加载学生模型。
问题四:学生模型在长文本上表现差。教师模型可能支持32K上下文,但学生只训练了4K。这种情况下,学生处理长文本时会丢失信息。解决办法是在蒸馏数据里加入长文本样本,或者用滑动窗口的方式分段蒸馏。
5.2 法律与合规的边界
虽然本文不讨论具体法律问题,但从工程实践角度,有几点需要提醒:
- 使用开源模型做教师时,注意其许可证是否允许蒸馏用途。有些模型的许可证明确禁止用输出来训练其他模型。
- 使用商业API时,仔细阅读服务条款。大多数API禁止用输出训练竞品模型,违反可能导致账号封禁。
- 如果蒸馏后的模型要商用,确保训练数据的来源合法,避免引入版权风险。
- 保留数据来源和训练过程的记录,以备合规审查。
5.3 蒸馏与微调的配合策略
在实际项目中,纯蒸馏往往不够,需要和微调结合。我的经验是分两阶段:第一阶段用蒸馏让模型学会教师的基本行为模式,第二阶段用高质量的人工标注数据做微调,纠正蒸馏引入的偏差。
微调阶段的学习率要比蒸馏阶段更小,通常用1e-6到5e-6。数据量不需要太大,几千条高质量样本就能显著提升效果。关键是数据要覆盖蒸馏数据中缺失的场景,比如边缘case、对抗样本、多轮对话等。
6. 蒸馏之外:大模型能力获取的其他路径
6.1 从零预训练还有没有必要
看到蒸馏这么高效,很多人会问:还有必要从零预训练吗?我的答案是:对于大多数企业来说,没必要;但对于头部玩家来说,必须做。预训练是定义模型底层能力的阶段,蒸馏只能迁移表层行为,迁移不了底层的语言理解和推理能力。如果所有人都只做蒸馏,整个生态的技术进步就会停滞。
而且,预训练的门槛在降低。现在有各种高效的预训练方法,比如MoE架构、稀疏注意力、课程学习,让中小团队也有机会参与。关键是找到差异化的数据源和训练目标,而不是盲目堆参数。
6.2 合成数据的双刃剑
蒸馏本质上是在用合成数据训练。合成数据的好处是量大、可控、成本低,但坏处是容易导致模型崩溃。有研究表明,如果连续多代模型都用合成数据训练,输出分布会逐渐窄化,多样性丧失,最终退化。
避免这个问题的方法是混合训练:合成数据搭配真实数据,比例控制在1:1到3:1之间。真实数据提供多样性,合成数据提供密度。另外,要定期用真实数据评估模型,监控多样性指标。
6.3 多模态蒸馏的挑战
热词里提到了多模态大模型和YOLO蒸馏,这确实是蒸馏技术的前沿方向。多模态蒸馏比纯文本蒸馏复杂得多,因为要同时对齐文本、图像、音频等多个模态的表示空间。
以YOLO蒸馏为例,目标检测模型的蒸馏通常涉及特征图对齐、注意力蒸馏、关系蒸馏等多个层次。教师模型可能是大分辨率的YOLOv8,学生模型是轻量化的YOLOv5-nano。蒸馏时要确保学生模型在不同尺度上的特征都向教师对齐,否则小目标检测性能会严重下降。
多模态大模型的蒸馏更复杂,因为文本和图像的表示空间差异很大。常见做法是先分别蒸馏单模态编码器,再做跨模态对齐蒸馏。这个领域还有很多开放问题,是很好的研究方向。
7. 我个人的一些实操体会
折腾蒸馏这几年,踩过的坑比成功的案例多。最大的体会是:蒸馏不是魔法,它不能凭空创造能力。教师模型会什么,学生才能学什么;教师模型不会的,蒸馏也变不出来。所以选教师的时候,一定要确保教师在你关心的任务上足够强。
另一个体会是数据质量决定一切。我试过用十万条低质量数据蒸馏,效果不如一万条精挑细选的数据。数据清洗和过滤的时间,往往比训练本身还长。但这是值得的,垃圾进垃圾出,在蒸馏里体现得特别明显。
还有一点是关于评估的。很多人蒸馏完只看loss,觉得loss降了就万事大吉。实际上loss和实际效果之间经常脱节。我习惯在训练过程中定期跑人工评估,哪怕只抽几十条样本,也能及时发现模型是不是在往奇怪的方向跑。
最后说一个技术细节:温度参数T的调度。固定T往往不是最优的,我试过在训练前期用大T(比如6),让模型充分吸收暗知识;后期逐渐降到2,让模型收敛到锐利的输出。这个策略在几个项目里都带来了稳定的提升,你可以试试。
至于蒸馏和原创的关系,我的看法是:蒸馏是加速器,不是替代品。它能让好技术更快普及,但不能替代源头创新。一个健康的生态,既需要有人做从零到一的突破,也需要有人做从一到N的扩散。两者不是对立的,而是互补的。