模型剪枝是给大模型做减法的一种办法:先找出权重里那些数值接近零、对结果影响很小的连接,把它们删掉或置零,让模型变小、变快,而答题能力只掉一点点。它常和量化、蒸馏一起被称作模型压缩,但三者的下手位置完全不同,这篇先把剪枝本身讲清。
剪掉的到底是什么
神经网络里真正占体积的是权重,也就是神经元之间连接的强度数值。训练结束后,权重分布并不均匀:少数连接承担了大部分判断,大量连接的数值小到近乎背景噪声。剪枝就是按重要性给连接排序,把尾部那批处理掉。
处理方式分两类。一类是非结构化剪枝,逐个把不重要的权重置零,模型文件里多出一大片零,理论上更省空间,但普通硬件算一堆零并不更快,需要专门的稀疏计算支持才能兑现速度。另一类是结构化剪枝,整条通道、整个注意力头甚至整层地删,剩下的模型形状规整,在普通显卡和手机芯片上就能直接变快。实际落地时,后者用得更多,原因就在这里。
为什么删掉不少连接还能用
关键在于过参数化:为了让训练顺利,大模型的参数量通常远超任务真正需要的量,很多连接从一开始就是冗余的,有的互相抵消,有的只在极少样本上被激活。把这部分删掉,相当于拆掉脚手架而不是承重墙。
但剪枝不是删完就完事。直接硬删通常会让效果掉一截,标准做法是剪一点、在数据上微调恢复一点,再剪再恢复,循环着来。彩票假说说的也是类似现象:大网络里藏着一个小得多的子网络,单独拿出来训练也能达到接近的效果。剪枝的上限取决于冗余有多少,模型本来就训得紧凑、参数利用率高时,能剪的空间自然小。
它和量化、蒸馏差在哪
| 办法 | 动的是什么 | 模型结构 | 典型收益 |
|---|---|---|---|
| 剪枝 | 删连接或整层删通道 | 变小、变稀疏 | 参数量下降,结构化剪枝还能直接提速 |
| 量化 | 把每个数值的精度从 16 位降到 8 位、4 位 | 不变 | 显存占用明显下降 |
| 蒸馏 | 让小模型模仿大模型的输出重新学 | 换成一个新模型 | 得到一个独立的小模型 |
三者经常叠着用:先剪枝瘦身,再量化压精度,最后用蒸馏或微调把效果找回来。看到某个开源模型标注了剪枝版,先确认它剪的是结构还是只置零,前者下载回来就能跑得快,后者多半只是文件看起来小。
三个常见误解
第一,剪枝不等于删数据,它动的是模型内部参数,和训练数据没有关系。第二,剪得越多不一定越划算,超过冗余边界后,效果会断崖式下跌,而且掉的往往是冷门知识和长尾能力,常用题测不出来。第三,剪枝省下的显存不等于能装下更大的模型去训练,它主要服务于推理部署,训练阶段的显存大头在优化器状态和激活值上,剪枝帮不上多少。
判断一个场景该不该剪枝,先问两件事:部署设备的算力和显存是不是真的卡住了,以及手头有没有可用于恢复微调的数据。两个都是yes,再动手;只是想让模型文件好看,没必要冒效果打折的风险。