Skip to content

剪枝(Pruning)

一句话 TL;DR:剪枝是删除模型中"不重要"的参数或连接,让模型变稀疏。理论支撑是"Lottery Ticket"假说--大模型里藏着一个稀疏的小子网络,效果一样好。剪枝与 量化知识蒸馏 并列三大压缩技术。但实际落地比量化难:稀疏模型需要特殊硬件/算子才能加速。


L1 · 一句话点破

剪枝:把模型里"不重要"的权重置 0(或删除),让模型变稀疏,从而减少计算和存储。

原始权重: [0.5, 0.001, 0.3, 0.0002, 0.8, 0.0001, ...]
剪枝后:   [0.5, 0,     0.3, 0,      0.8, 0,      ...]  # 小值置 0
存储:      只存非零位置和值,节省空间

直觉:模型很多权重接近 0,对输出影响小,删了影响不大。这是"冗余"的另一面(量化利用数值冗余,剪枝利用结构冗余)。

L2 · 通俗类比

公司裁员:

  • 不裁员:所有人留着,效率低但稳定
  • 随机裁员:乱裁一气,可能裁到关键员工,公司垮
  • 按绩效裁员:裁绩效差的(小权重),保留核心员工(大权重),公司照常运转
  • 结构性裁员:整个部门裁掉(结构化剪枝),组织更精简

剪枝同理:

  • 非结构化剪枝:逐个权重判断,小的置 0。模型变稀疏,但需要特殊硬件加速
  • 结构化剪枝:整个通道/层/头删除。模型架构本身变小,通用硬件能加速

裁员的权衡:裁多少?裁谁?裁完要不要重新培训(微调)?剪枝也面临这些问题。

关键洞察:大模型里很多参数是冗余的Lottery Ticket 假说 说:一个训练好的大模型里,存在一个稀疏的子网络(10-20% 参数),单独训练能达到同样效果。剪枝就是找出这个子网络。

L3 · 正经定义

剪枝(Pruning):删除模型中不重要的参数或结构,降低复杂度。

按剪枝粒度分:

类型剪枝对象加速代表
非结构化单个权重需稀疏硬件Magnitude Pruning
半结构化(N:M)每 M 个权重剪 N 个NVIDIA 稀疏张量核心2:4 稀疏
结构化通道/层/头通用硬件Channel Pruning

按剪枝时机分:

时机描述
训练后剪枝(Post-training)训完再剪,最简单
训练中剪枝(During training)Lottery Ticket
训练前剪枝(Initialization)找稀疏初始化,再训练

经典流程(Iterative Magnitude Pruning, IMP)

1. 训练模型至收敛
2. 评估每个权重的重要性(如绝对值)
3. 把最不重要的 p% 权重置 0
4. 微调恢复精度
5. 重复 2-4 直到目标稀疏度

参考资料

L4 · 原理深挖

4.1 为什么剪枝有效:参数冗余

大模型严重过参数化(见 过拟合 & 正则化 的 double descent)。实际"有效"参数远少于总参数:

  • 大部分权重接近 0,对输出影响小
  • 不同参数可能编码相似信息(冗余)
  • 删除部分参数,其他参数可补偿

实证:很多神经网络能剪掉 80-90% 参数,精度损失 <1%。这是剪枝可行的根本原因。

但"能剪"不等于"能加速"(见 4.3),这是剪枝落地的关键难点。

4.2 Lottery Ticket 假说

Frankle & Carbin, 2018 提出震撼性假说:

一个训练好的 dense 网络里,存在一个稀疏子网络("中奖彩票"),用同样的初始化单独训练,能达到接近 dense 网络的效果。

含义:

  • 大模型的价值不在"所有参数",而在"那个稀疏子网络 + 初始化"
  • 训练大模型本质是"搜索这个子网络"
  • 找到子网络后,大模型可以剪成小模型

挑战后续研究:

  • 早期彩票(Early-Bird Ticket):训练早期就能找到好子网络
  • 彩票迁移:跨任务、跨数据集的彩票能否复用
  • 彩票生成:能否直接生成彩票初始化,省去训练大模型

Lottery Ticket 是剪枝领域最重要的理论贡献,重塑了对"大模型为什么有效"的理解。

4.3 非结构化 vs 结构化:加速的难题

剪枝的工程难题:非结构化剪枝(逐个权重置 0)很难在通用硬件上加速

原因:GPU/CPU 的矩阵乘法是密集计算,稀疏矩阵(大部分 0)反而慢,因为:

  • 内存访问仍按 dense 模式
  • 稀疏索引的开销大于省的计算
  • 硬件未优化稀疏访问

解决:

① 结构化剪枝

剪整个通道/层/头,让稀疏模式对齐硬件。

通道剪枝: 删除第 5、12、20 个通道
架构: 输入维度从 1024 变为 1021
硬件: 通用 GPU 直接加速(架构变了,但计算仍是 dense)

代价:剪枝粒度粗,相同稀疏度下精度损失比非结构化大。

② N:M 稀疏

半结构化剪枝,每 M 个权重剪 N 个。NVIDIA Ampere+ 的稀疏张量核心原生支持 2:4 稀疏(每 4 个权重剪 2 个)。

2:4 稀疏: [a, 0, b, 0, c, 0, d, 0, ...]  # 每 4 个有 2 个非零
硬件: NVIDIA A100/H100 直接 2x 加速

N:M 稀疏是非结构化和结构化的折中:粒度细(精度好),硬件可加速。

③ 稀疏算子库

如 SparseRT、TVM 等优化稀疏矩阵计算。但仍不如 dense 通用。

实务:N:M 稀疏(特别是 2:4)是当前剪枝落地主流,结构化剪枝次之,纯非结构化剪枝主要用于研究。

4.4 剪枝的"重要性"评估

剪枝的核心问题:怎么判断哪些参数不重要?

① Magnitude(绝对值)剪枝

最简单:绝对值小的权重不重要,置 0。

prune_mask = |W| > threshold
W_pruned = W * prune_mask

优点:简单、无需额外计算。 缺点:绝对值小不等于不重要(某些小权重可能关键)。

② Gradient-based 剪枝

用梯度评估重要性:梯度大的权重对损失敏感,不应剪。

$$ \text{importance}(w) = |w \cdot \nabla L| $$

Optimal Brain Damage 用二阶信息(Hessian)。

③ Movement 剪枝

训练过程中"动得少"的权重不重要,剪掉。

④ Learned Pruning

训练一个"剪枝门"(mask),让模型自己学该剪哪些。

实务:magnitude 剪枝仍是基线,简单有效。复杂方法在特定场景略好,但工程复杂度高。

4.5 剪枝 + 量化 + 蒸馏:组合压缩

实际部署常组合三种压缩:

1. 蒸馏: 训小模型(教师 -> 学生)
2. 剪枝: 把学生剪稀疏
3. 量化: 把剪枝后的模型量化
4. 微调: 恢复精度

这种"压缩 pipeline"能实现 10-50 倍压缩,且精度损失可控。如 MobileNet 等移动端模型。

大模型时代,组合压缩相对少见(量化和蒸馏更主流),但在边缘部署(手机、IoT)仍是关键技术。

4.6 大模型时代的剪枝

大模型剪枝的特殊性:

① 剪枝收益相对小

大模型已经过参数化,再剪枝的边际收益不如量化。70B 模型剪 50% 仍是 35B,仍是"大模型"。

② 训练成本高

经典 IMP 需要多次"剪枝-微调"循环,大模型微调成本高,循环不现实。

③ 稀疏激活 vs 稀疏参数

MoE(混合专家)本质是"稀疏激活"--参数总量大但每次推理只用部分。这和剪枝的"稀疏参数"不同,但思路相通。

④ 推理引擎对稀疏支持有限

vLLM、TensorRT-LLM 等对结构化剪枝支持不完善,限制了剪枝在大模型推理的落地。

但研究仍在推进:

这些工作让 LLM 剪枝逐渐实用,但仍是研究热点而非工程标配。

L5 · 沿革与坑

沿革

常见误解

  • 误解:剪枝 80% 参数速度就提升 5 倍。 ✅ 真相:非结构化剪枝在通用硬件上几乎不加速(稀疏矩阵反而慢)。需要结构化剪枝或 N:M 稀疏才能实际加速(4.3)。

  • 误解:剪枝一定让模型变笨。 ✅ 真相:适度剪枝(50-80%)精度损失常 <1%。大模型过参数化严重,冗余多,剪枝空间大(4.1)。

  • 误解:Lottery Ticket 说明大模型没必要。 ✅ 真相:彩票假说说大模型里有稀疏子网络,但找到这个子网络仍需先训练大模型。大模型是"搜索过程",不是浪费(4.2)。

  • 误解:剪枝和量化二选一。 ✅ 真相:可组合。剪枝让模型稀疏,量化让数值低精度,两者正交,常组合使用(4.5)。

  • 误解:大模型时代剪枝过时了。 ✅ 真相:在大模型上剪枝收益相对小(量化和蒸馏更主流),但 Wanda、Sheared LLaMA 等让 LLM 剪枝可行。在边缘部署仍是关键技术(4.6)。

  • 误解:剪枝就是删小权重。 ✅ 真相:magnitude 剪枝是基线,但还有梯度-based、movement、learned 等多种"重要性"评估方法。绝对值小不等于不重要(4.4)。

面试怎么考

  1. "什么是剪枝?为什么有效?" --删不重要参数让模型稀疏。有效因为大模型过参数化、有冗余(L1、4.1)。
  2. "非结构化 vs 结构化剪枝?" --非结构化剪单个权重(需稀疏硬件加速);结构化剪通道/层(通用硬件加速)。N:M 是折中(4.3)。
  3. "Lottery Ticket 假说?" --大模型里有稀疏子网络,用同样初始化单独训练能达到接近效果。说明大模型价值在子网络+初始化(4.2)。
  4. "剪枝为什么在通用 GPU 上难加速?" --稀疏矩阵内存访问仍按 dense,索引开销大于省的计算。需结构化或 N:M 稀疏(4.3)。
  5. "2:4 稀疏是什么?" --每 4 个权重剪 2 个,NVIDIA Ampere+ 原生支持,直接 2x 加速(4.3)。
  6. "剪枝和量化怎么组合?" --剪枝让稀疏,量化让低精度,两者正交。pipeline:蒸馏->剪枝->量化->微调(4.5)。

延伸阅读


上一篇:知识蒸馏 -- 用大模型教小模型。下一篇:推理引擎(vLLM / TensorRT-LLM) -- 生产部署的加速器。

内容采用 CC BY-SA 4.0,代码采用 MIT。