本文目录导读:

“剪枝”和“稀疏化”是深度学习模型轻量化、加速推理并减少存储空间的两个核心技术,它们都旨在减少模型中的冗余参数,但具体实现方式和侧重点有所不同。
下面我来详细拆解这两个概念以及它们的关系。
核心概念区分
-
模型剪枝:
- 思想:移除模型中“不重要”的结构,这类似于园丁修剪树木的枯枝,保留主干和重要分支。
- 粒度:可以是不重要的单个权重(非结构化剪枝),也可以是神经元(权重矩阵的一整行或列)、卷积核(Filter)、通道(Channel),甚至是整个层(结构化剪枝)。
- 目标:直接减少模型的参数量和计算量(FLOPs),使模型结构变得更小、更紧凑。
-
模型稀疏化:
- 思想:让模型中的大部分权重值变为零(0),这类似于将一个稠密的数字矩阵变成一个含有大量“0”的稀疏矩阵。
- 粒度:通常是单个权重,它不一定会改变模型的结构,只是改变权重的数值分布。
- 目标:通过利用矩阵的稀疏性,配合专门的硬件或软件库(如NVIDIA的cuSPARSE、TensorFlow的XLA),实现加速的稀疏矩阵乘法,从而降低计算开销。
核心关系:剪枝是实现稀疏化的一种重要手段
- 剪枝是手段,稀疏化是结果或状态,当我们对一个模型进行非结构化剪枝(即把绝对值小的权重直接设为零)时,产生的直接结果就是一个稀疏化的模型。
- 结构化剪枝虽然也移除了权重,但移除的是一个连续块(如一个通道),其结果是一个更小的稠密模型,而不是一个易于用稀疏计算加速的稀疏矩阵。
- 训练稀疏化:也有不通过剪枝,而是通过在训练过程中直接施加正则化项(如L1正则化),引导模型本身向零权重收敛,最终自动获得稀疏性的方法。
主要技术分类与详解
非结构化剪枝
- 原理:对权重矩阵中的每个元素进行独立评判,将绝对值低于某个阈值的权重直接设为0。
- 优点:
- 剪枝率通常很高:可以轻松达到90%甚至99%的稀疏度,理论上压缩比最大。
- 灵活性高:可以针对每个层或甚至每个卷积核独立设置阈值。
- 缺点:
- 不直接加速:因为稀疏是“非结构化的”,零元素随机分布,无法利用CPU/GPU的通用矩阵乘法(GEMM)库进行优化,除非使用专门支持稀疏矩阵运算的硬件(如NVIDIA Ampere架构之后的GPU)或软件库。
- 需要特殊硬件支持:在普通硬件上,非结构化稀疏模型可能反而变慢,因为需要花时间处理稀疏格式。
- 经典方法:
Han Song 的 Deep Compression系列工作(如《Learning both Weights and Connections for Efficient Neural Networks》),通过训练-剪枝-微调的迭代过程,先训练,再剪掉低权重,最后微调恢复精度。
结构化剪枝
- 原理:移除整个结构单元,如一个卷积核、一个通道、或一个稠密层中的一整行/列。
- 优点:
- 直接加速:剪枝后的模型结构变小了,计算图变得简单,在任何硬件上都能获得直接的加速效果。
- 易于部署:不需要特殊的稀疏计算库,可以直接使用常规的推理框架(如TensorRT、OpenVINO)进行优化。
- 缺点:
- 剪枝率相对较低:风险较高,移除整个结构单元对精度的冲击通常比移除单个权重更大,需要更精细的策略来保持精度。
- 灵活性受限:选择剪掉哪个通道需要更复杂的准则(如基于L1范数、BN层gamma值、梯度信息等)。
- 经典方法:
- Network Slimming:利用Batch Normalization层的缩放因子(gamma)作为重要性指标,剪掉gamma值接近0的通道。
- ThiNet:基于下一层的输出重建误差来选择要保留的通道。
- HRank:通过计算特征图的秩(Rank)来判断通道重要性,秩低的通道对后续计算贡献小,可剪掉。
训练稀疏化
- 原理:不是事后剪枝,而是在训练过程中通过正则化手段(如L1、L2正则化)或特殊的优化器(如Proximal Gradient Descent),强制模型权重向0收敛。
- 优点:可以与剪枝形成协同,得到一个本身就倾向于稀疏的模型,使得后续剪枝更容易或精度损失更小。
- 缺点:需要精心调整正则化系数,否则可能导致模型欠拟合。
工作流程(以剪枝为例)
一个典型的剪枝流程是:
预训练 -> 评估重要性 -> 剪枝 -> 微调
- 预训练:首先训练一个精度达标的大模型(超参模型)。
- 评估重要性:根据某种准则(权重大小、梯度大小、损失函数对参数的敏感度等)评估每个参数或参数块的重要性。
- 剪枝:移除不重要的部分(设0或直接删除),这会降低模型精度。
- 微调:重新用训练数据对剪枝后的模型进行少量训练,让剩余的权重重新适应任务,恢复精度,这个过程通常需要多次迭代(Loop)。
应用场景对比
| 特性 | 非结构化剪枝/稀疏化 | 结构化剪枝 |
|---|---|---|
| 主要目标 | 极限压缩模型大小、降低存储(适合终端芯片) | 加速、降低延时、降低能耗(适合云端、移动端) |
| 硬件要求 | 需要专门硬件(如NVIDIA A100的2:4稀疏模式)或稀疏计算库 | 无需特殊硬件,任何硬件上均可直接加速 |
| 模型结构 | 不变(形状一样,只是大量元素为0) | 变小(通道数、卷积核数减少) |
| 典型应用 | 模型量化前的预处理(如Distiller);极端压缩场景 | MobileNet、ShuffleNet系列的设计;TensorRT的通道剪枝 |
总结与选择建议
- 如果需要极限压缩,且有专门硬件支持 -> 非结构化剪枝 + 稀疏化,这是实现模型 < 1KB 的唯一途径。
- 如果需要通用加速,且追求易于部署 -> 结构化剪枝,这是目前工业界最广泛使用的方法。
- 可以结合使用:先进行结构化剪枝得到一个小模型,再对小模型进行非结构化剪枝或量化,进一步压缩。
- 不要单独看剪枝率,50%的结构化剪枝带来的延迟降低,远大于90%的非结构化剪枝(在普通硬件上)。
推荐工具和学习资源
- 框架:
- Intel
Distiller:一个非常优秀的PyTorch模型压缩库,内置大量剪枝、量化和蒸馏算法。 - TensorFlow
Model Optimization Toolkit:TF官方提供的剪枝和量化API。 - PyTorch
torch.nn.utils.prune:PyTorch自带的非结构化剪枝工具。
- Intel
- 经典论文:
- 《Learning both Weights and Connections for Efficient Neural Networks》(非结构化剪枝奠基作)
- 《Pruning Filters for Efficient ConvNets》(结构化剪枝经典)
- 《Network Slimming》(基于BN的结构修剪)
- 《The Lottery Ticket Hypothesis》(彩票假设,一种特殊的结构化剪枝方法)
如果你有具体模型(如ResNet、BERT)、框架(PyTorch、TensorFlow)或场景(移动端、边缘端、云端)的需求,可以进一步描述,我可以提供更具体的实施方案或代码示例。