大模型蒸馏
模型蒸馏不是复制别人的模型参数,而是让一个小模型学习大模型的输出行为
误区:蒸馏不是把大模型压缩一下,就变成小模型
真实的蒸馏过程:
- 准备一批数据
- 让强模型回答这些问题
- 把强模型的答案整理成训练数据
- 用这些数据训练一个小模型
- 看小模型有没有学到强模型的能力
所以蒸馏学的不是参数,而是行为
为什么要蒸馏?
大模型太贵、太慢、太重
做大模型应用的时候,会有三个现实问题
- 调一次模型,成本不低
- 输出长一点,延迟就上来了
- 想私有化部署,机器成本顶不住
但是很多业务场景,其实不需要一个全能大模型
只要在某个小任务上稳定、便宜、速度快,这就是蒸馏的价值
把强模型在某个任务上的能力,迁移到一个更便宜、更快、更好部署的小模型
硬蒸馏
只学习最终答案,学生模型只看到这个最终答案,然后学习怎么输出类似答案
通常是:
问题 -> 老师最终回答
这种方式简单、便宜、常见
特别是黑盒api场景,你只能拿到模型输出文本,拿不到模型内部概率分布,所以现实中很多蒸馏都是硬蒸馏
软蒸馏
不仅仅学答案,还学习老师的判断分布
软蒸馏学的是老师模型对多个答案的概率分布,所以信息更细
但问题也很现实,软蒸馏需要拿到logits或概率分布,很多闭源API根本不给
所以大家听到有人说"蒸馏其他厂商模型,多数时候不是严格意义上的软蒸馏,而是黑盒硬蒸馏或者响应蒸馏
白盒蒸馏和黑盒蒸馏
白盒蒸馏:你能看到老师模型内部的一些信息
比如:
- logits
- 概率分布
- 中间层表示
- attention信息
这钟蒸馏更正统,信息量更大。通常发生在自家模型体系内,或者开源模型上。
黑盒蒸馏:你看不到模型内部,只能通过API问他问题,拿到回答
这就是大多数闭源模型API的情况
只能看到它最终输出,所以黑盒蒸馏常见做法是:
- 准备大量问题
- 调用强模型API
- 收集输出
- 清洗成训练数据
- 拿去微调自己的小模型
黑盒蒸馏技术上不复杂,麻烦的是成本、质量、规模、合规
蒸馏其他厂商模型,是不是公开的秘密
大模型厂商都不希望自己的模型被别人蒸馏
训练一个强模型,需要花费大量算力,数据,工程,人力和对齐成本。
所以,用自家大模型蒸馏自家小模型,没问题
用开源模型和许可允许的数据做蒸馏,没问题
但是批量调用闭源模型api,拿输出训练竞争模型,很可能违反服务条款
蒸馏大模型有哪些方法
Response Distillation:学最终回答
很多垂直小模型,本质上就是大量高质量指令数据+SFT
缺点也很明显:学生只学到了老师最后怎么回答,不一定学到老师为什么这么回答
CoT 蒸馏:学习推理过程
Chain of Thought,思维链
普通蒸馏只学习答案,CoT蒸馏让老师模型把推理过程也写出来,但是CoT数据必须清洗好
Preference Distillation:学偏好判断
大模型不只是回答,还会判断哪个回答更好
这类蒸馏类似于对齐,让小模型更像强模型一样判断"什么是好回答"
Self-Instruct:让模型造训练题
让强模型自己生成题目,生成答案,生成变体
但是注意,强模型生成的数据,不等于高质量数据
生成数据很容易同质化,也容易带进模型自己的偏见和错误
真正有价值的是:生成之后的筛选,去重,评测,人工抽检
领域蒸馏:只蒸馏一个能力
不是把一个通用大模型完整蒸馏出来,而是只蒸馏某个具体的能力
全量复刻一个强模型太难了,但是复刻它在一个小任务上的表现,现实很多
蒸馏能学到什么,学不到什么?
蒸馏不是魔法,学生模型不是看了老师答案,就可以突然变成老师
能学到什么?
- 常见问题的回答方式
- 某个任务的输出格式
- 老师模型的表达风格
- 一部分领域的知识
- 一部分推理套路
- 一部分偏好判断
学不到什么?
- 老师模型的完整参数
- 老师模型的全部世界知识
- 老师模型的全部泛化能力
- 老师模型内部真实推理机制
- 超过学生模型容量的复杂能力
这里有一个关键点:
学生模型容量是天花板
一个很小的模型,不可能因为蒸馏数据多,就完整学会强模型的全部能力
它能学到的一些解题套路,但底层知识结构和能力上限不一样
蒸馏和微调、量化、剪枝有什么区别?
微调:让一个已有模型学习你的任务数据
比如你拿客服问答数据去训练一个模型,让它更懂你公司的客服场景
微调强调的是:学任务数据
蒸馏:让学生模型学习老师模型的输出行为
老师开源是强模型,也可是多个模型的集成
蒸馏强调的是:学老师模型
量化:降低模型参数的数值精度
让模型占用显存更少、推理更快
量化强调的是:降低计算和存储成本
剪枝:删掉模型里面不重要的结构
比如删除部分神经元,通道,层,让模型更小
剪枝强调的是:减少模型结构规模
这几者不是互斥的,通常真实工程里经常组合使用:先蒸馏出来一个小模型,再量化部署
或者
先用强模型生成领域数据,再SFT微调,再做量化上线
他们依次解决的问题是:
- 蒸馏:能力迁移
- 微调:任务适配
- 量化:降低精度
- 剪枝:减少结构
蒸馏有那些应用场景?
最核心的场景,就是降本增效
1.降低API成本
如果一个业务每天要调用强模型几百万次,成本会很高
这时候可以先让强模型生成高质量数据,再训练一个小模型承接高频任务
强模型处理复杂问题,小模型处理常见问题
这就是典型的成本分层
2.降低延迟
强模型输出慢,小模型输出快
对客服、搜索、推荐、实时交互类场景来说,延迟很关键
用户不是来欣赏模型思考的,用户是来要结果的
3.端侧部署
手机、PC、本地设备,不可能都跑大模型
端侧模型需要小、快、省资源
蒸馏就是把云端强模型的一部分能力迁移到端侧模型的一种方式
4.企业私有化部署
训练一个领域小模型,在内网环境里面跑
5.垂直领域小模型
用强模型辅助生成领域数据,在结合真实业务数据,训练一个更懂业务的小模型
6.RAG系统里面的辅助模型
RAG不一定所有环节都用大模型
某些环节可以使用小模型承接
7.Agent系统里的子任务模型
Agent 系统里,很多判断不需要最强模型
这时适合蒸馏的小任务