剪枝
模型剪枝 (Model Pruning)
模型剪枝是指移除神经网络中不重要的权重或神经元,以减少模型参数量、降低计算复杂度,从而实现模型压缩和推理加速。
1. 基本概念
1.1 为什么要剪枝?
- 减少参数量:显著降低模型存储空间。
- 加速推理:减少浮点运算次数 (FLOPs)。
- 防止过拟合:稀疏化模型有时能起到正则化的作用。
1.2 剪枝粒度 (Granularity)
非结构化剪枝 (Unstructured Pruning)
- 定义:对单个权重进行剪枝,不考虑其在矩阵中的位置。
- 结果:产生稀疏矩阵 (Sparse Matrix)。
- 优点:压缩率高,对精度影响较小。
- 缺点:需要专门的硬件或软件库(如 Sparse Matrix Libraries)支持才能获得实际的加速效果。在通用硬件(CPU/GPU)上,由于内存访问不连续,速度反而可能变慢。
结构化剪枝 (Structured Pruning)
- 定义:移除整个结构单元,如卷积核 (Filter)、通道 (Channel)、层 (Layer) 或 块 (Block)。
- 结果:产生更小的稠密矩阵 (Dense Matrix)。
- 优点:不需要专门的硬件支持,直接在通用硬件上就能看到加速效果。
- 缺点:相比非结构化剪枝,在相同压缩率下,精度损失通常更大。
2. 剪枝标准 (Pruning Criteria)
如何判断哪些权重是“不重要”的?
2.1 基于幅值 (Magnitude-based)
- 原理:认为绝对值较小的权重对输出贡献小。
- 方法:计算权重矩阵的 L1 或 L2 范数,移除范数最小的权重或通道。
- 评价:最简单常用,效果通常不错。
2.2 基于梯度/Hessian (Gradient/Hessian-based)
- 原理:基于泰勒展开,估算移除权重对 Loss 的影响。
- Optimal Brain Damage (OBD) / Optimal Brain Surgeon (OBS):利用 Hessian 矩阵(二阶导数)来判断权重重要性。
- 评价:理论上更优,但计算 Hessian 矩阵及其逆矩阵的代价非常高。
2.3 基于激活值 (Activation-based)
- 原理:如果某个神经元的激活值总是接近 0,说明它不起作用。
- 方法:统计验证集上的平均激活值 (APoZ - Average Percentage of Zeros)。
3. 剪枝流程 (Pruning Schedule)
3.1 One-shot Pruning (一次性剪枝)
- 训练大模型。
- 按照比例一次性剪掉权重。
- (可选) 微调恢复精度。
3.2 Iterative Pruning (迭代式剪枝)
- 训练大模型。
- 剪掉一小部分权重 (e.g., 10%)。
- 微调 (Fine-tune) 恢复精度。
- 重复步骤 2-3,直到达到目标压缩率。
- 评价:通常比 One-shot 效果好,能达到更高的压缩率且保持精度。
4. 彩票假设 (The Lottery Ticket Hypothesis)
- 提出者:Frankle & Carbin (ICLR 2019)
- 核心观点:一个随机初始化的密集网络包含一个子网络(Winning Ticket),如果将这个子网络单独拿出来,并使用原始的初始化权重进行训练,它可以在相似的迭代次数内达到与原始网络相当的精度。
- 意义:揭示了过参数化 (Over-parameterization) 的重要性,即大模型更容易找到好的解,而剪枝后的结构其实本身就有能力达到高性能。
5. 实践与挑战
- 硬件亲和性:结构化剪枝更适合工程落地。
- 自动剪枝 (AutoML for Pruning):使用强化学习或进化算法自动搜索每层的剪枝率 (AMC - AutoML for Model Compression)。
- 稀疏训练 (Sparse Training):从一开始就训练稀疏网络,而不是先训练密集中再剪枝,是当前的研究热点。