首页 / 第四部分 · 压缩与工程落地 / 第 16 篇

第 16 篇 · 第四部分 · 压缩与工程落地

剪枝:删除模型里贡献小的权重

上一篇文章把权重从 16 位压到了 4 位,靠的是"用更少的位数表示同一个数"。这一篇换个思路:与其节省表示位数,不如直接删掉一部分。一个训练好的网络里,有大量权重删掉之后精度几乎不下降——这听起来有悖直觉,实测却确实如此。剪枝要做的,就是找出哪些可以删,以及删了之后怎么补回来。

一、一个反直觉的事实:很多权重删掉后影响很小

先说结论:一个几千万参数的网络,随机地把一半权重置零,精度通常会下降,但降幅往往小于直觉;按某种规则选择性地删除,删掉九成,精度也仍基本保持。

Han 等人在 2015 年那篇讲剪枝的论文里就给了这样的数据:在 ImageNet 上,把 AlexNet 的参数量削减九成,分类精度基本不变。VGG 那种更冗余的网络,能削减的比例更大。这不是因为那些权重没参与过计算,而是因为它们的作用被其他权重覆盖了。

为什么会有这么多冗余?因为深度网络本身就是过参数化的。参数量远大于任务所需,网络里存在大量冗余——同一个特征可以从不同路径表达。你删掉其中一条路径上的权重,其余路径仍能承担对应的功能。这有些像一支球队:替补席上人员充足,缺一两名首发,成绩受到的影响远小于直觉预期。

剪枝要利用的就是这份冗余。

二、非结构化剪枝:把小权重置零

最简单的一种,是把权重矩阵里绝对值小的那些元素直接置零。得到的矩阵里大部分是 0,稀疏度通常用零元素所占的比例来衡量。比如剪掉 90%,就是每 100 个权重里只留 10 个。

直觉是:权重绝对值小,说明这个连接贡献弱,删掉影响小。这个判据虽然粗糙,但在很多网络上意外地有效。

问题在于,置零之后,矩阵并没有变小。它还是个 n×m 的稠密形状,只是里面全是 0。要真正省显存,得换成稀疏存储格式,比如只存非零值加它们的位置索引(CSR、COO 等格式)。存储确实节省了,但新问题也随之而来。

问题在于稀疏不一定节省时间。GPU 做稠密矩阵乘法,靠的是规整的内存访问和极高的并行度。一旦矩阵变成稀疏格式,每个位置的非零数不一样,取数据的地址变得不规则,内存访问效率明显下降。计算上节省的时间,多半又被访存开销抵消。除非硬件专门为稀疏设计了通路,否则"稀疏了 90%,速度却只提升了一点"是常态。

这也是剪枝最容易被误解的地方:参数少不等于速度快,还要看硬件是否支持这种稀疏结构。

三、结构化剪枝:整条通道、整行删掉

既然零散删除难以节省时间,那就改为整块删除。结构化剪枝删的不是单个权重,而是完整的结构单元:一整行、一整列、一整条通道,甚至整个注意力头。

这么做的好处很直接。删掉一行,矩阵就真的从 m 行变成 m−k 行,形状变小了,剩下的部分仍是稠密的,照样能沿用原来的快速计算路径。显存和计算同时缩减,硬件无需做任何特殊适配。

代价也同样明确:粒度太粗。一个权重可能数值不大,但它所在的那条通道整体有用,一刀切式地删除就可能误伤。所以结构化剪枝能削减的比例,通常低于非结构化,精度也更容易下降,需要更多微调来弥补。

两种路线其实是在理论收益与实际速度之间取舍:非结构化理论收益大,却难以真正提速;结构化确实能获得速度提升,但削减幅度偏保守。后面讲的 2:4 稀疏,就是想借助硬件把这两方面兼顾起来。

四、剪枝的标准流程:训练 → 剪枝 → 微调,多轮迭代

剪枝很少一步到位。直接删去大量权重,精度通常会明显下降,需要时间恢复。所以标准做法是一个循环:

  1. 正常训练,得到一个精度达标的大模型;
  2. 按某种标准删掉一批权重;
  3. 用原来的训练数据微调,让剩余权重重新分配职责,承接被删除部分的功能;
  4. 如果还要更稀疏,回到第二步再剪一轮。

这种"边剪边调"的迭代方式,比一次剪到位稳定得多。Han 等人后来的 Deep Compression 就是在这个框架里做的,还叠加了量化与霍夫曼编码,把模型压缩到原来的三十分之一以下,精度依然得以保持。

理念很简单:既然网络存在过参数化,每次只改动一小部分,它就有余裕在微调中重新适应。

五、按幅度剪还是按重要性剪

关键问题始终是:怎么判断一个权重"不重要"?

按幅度剪,就是看上文的 |w|。简单、便宜、和具体任务无关,不需要额外的数据或计算。工业界用得最多,因为实施便捷。

但它有一个明显的缺陷:幅度小≠不重要。一个权重数值不大,如果它对应的输入激活长期较大,那么权重乘以激活之后对输出的贡献并不小。只看权重绝对值,会在这种情形下误删。

按重要性剪考虑得更细致。早期方法用梯度信息(比如 OBD 系列用二阶导数估计删掉某个权重后损失上升多少),理论严谨,但计算量大,逐权重地计算 Hessian 在大模型上几乎不可行。更实用的做法是把激活也纳进来,用"权重 × 激活"的综合量来打分,这正是下面第八节要讲的 Wanda 的核心。

六、彩票假说:子网络里藏着一张能中奖的彩票

2019 年,Frankle 和 Carbin 提出了一个很有启发性的猜想,叫彩票假说(Lottery Ticket Hypothesis)。

他们发现:一个随机初始化的大网络,里面存在一个稀疏子网络,只要将它单独提取出来、用其原本的初始权重训练,就能达到与完整网络接近的精度。这个子网络被称作"中奖彩票"。注意关键的限定条件——沿用原有的初始权重。他们试过把子网络重新随机初始化,精度就下降了。也就是说,中奖的不只是那张彩票的"结构",还有它一开始的那个初始值。

对这一假说应持谨慎态度。它很有启发性,但也争议不小。后来有人指出,在更大的网络上、用足够的训练轮数和精心调的学习率,把剪枝后的子网络随机重初始化也能重新训练回原有水平,那"特定初始值才中奖"的说法就并不绝对。争论至今没有定论。对我们来说,它的价值在于换了个角度看剪枝:剪枝不只是压缩,它也在揭示网络里哪些结构真正承担计算功能。

七、2:4 半结构化稀疏:为硬件量身定做的稀疏

非结构化难以节省时间,结构化削减幅度过激,中间地带便成了更有价值的方向。

2:4 稀疏的规则很简洁:每 4 个连续权重里,最多保留 2 个非零,其余置零。这样固定下来,稀疏度正好 50%,而且非零元素的位置有规律、可预测。NVIDIA 从 Ampere 架构(A100、30 系显卡)起就在张量核里给了这种模式专门的通路,运行起来能获得接近两倍的吞吐。

要点在于"规律"。硬件之所以能加速,是因为它确定每 4 个槽中保留 2 个,取数的地址模式规整,无需像通用稀疏那样临时计算索引。Mishra 等人 2021 年把这件事和剪枝算法结合,证明了 2:4 稀疏配上合适的训练,精度损失可以很小。

不足也很明确:你必须把权重整理成 4 个一组的形状才能使用,而且这 50% 是固定的,想要更高稀疏率就需要换别的方案。它是一种与硬件行为深度绑定的压缩方式。

八、大模型时代的剪枝:SparseGPT 与 Wanda

前面那套"剪了再微调、多轮迭代"的流程,应用到几十上百亿参数的模型上就不适用了:微调本身就是一项庞大的工程,成本高得难以承受。所以大模型时代需要的是一次性剪枝——不重新训练,剪枝后即投入使用。

SparseGPT(Frantar 和 Alistarh,2023)借鉴了量化那边 GPTQ 的思路,逐层处理。它利用 Hessian 信息,找出能最小化重建误差的那组剪枝位置,同时更新保留下来的权重来补偿误差。经过这一流程,一个 175B 的模型可以在几个小时内被剪去一半以上的权重,精度仍能保持。它甚至可以与量化叠加使用。

Wanda(Sun 等,2023)则追求更简单。它的打分规则只有一句话:权重乘以对应输入激活的幅值,即 |W|·‖X‖,然后在这个乘积上按输出维度比较、删除数值较小的。不依赖二阶信息,不用更新剩余权重,运行速度快且开销低,效果却与 SparseGPT 接近。

把这两者放在一起看,会发现它们延续了本系列一贯的脉络:量化和剪枝都在追问同一个问题——这个数字(或连接)到底为输出做出了多少贡献?贡献大的予以保留,贡献小的予以删除。

九、先剪还是先量化

两种技术可以组合使用,Deep Compression 就是同时采用剪枝与量化的例子。但如果想获得双重收益,先后顺序需要仔细考量。

先剪后量化:先将权重稀疏化,再对其余非零权重做量化。此时分布更集中,量化误差小一些,较易实现。缺点在于,剪枝产生的稀疏结构可能与量化的分组粒度发生冲突。

先量化后剪枝:先完成量化,再剪去一部分。量化后的数值已经离散,剪枝判断可以在离散域上进行,逻辑更清晰,也更便于与现有量化工具链衔接。

实践里,两者收益并不会简单相乘。2:4 稀疏理论上是两倍,4 位量化理论上是四倍,叠加后未必能达到八倍——因为瓶颈会从算力转移到其他地方,例如带宽、调度、显存分块。真实的加速比,需要在目标硬件上实测才能确定。

下一篇转向另一条思路:既不删除权重、也不改变位数,而是让一个小模型去"学习"大模型的能力——知识蒸馏。

参考资料

  1. Song Han 等, Learning both Weights and Connections for Efficient Neural Networks, NeurIPS 2015. arXiv:1506.02626(剪枝的奠基性工作)
  2. Song Han 等, Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding, ICLR 2016. arXiv:1510.00149(剪枝 + 量化 + 熵编码的组合方案)
  3. Jonathan Frankle, Michael Carbin, The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks, ICLR 2019. arXiv:1803.03635(彩票假说的出处)
  4. Asit Mishra 等, Accelerating Sparse Deep Neural Networks, 2021. arXiv:2104.08378(2:4 半结构化稀疏与硬件加速)
  5. Elias Frantar, Dan Alistarh, SparseGPT: Massive Language Models Can Be Accurately Pruned in One-Shot, ICML 2023. arXiv:2301.00774(一次性剪枝大语言模型)
  6. Mingjie Sun 等, A Simple and Effective Pruning Approach for Large Language Models, ICLR 2024. arXiv:2306.11695(Wanda:按权重×激活打分)