剪枝

模型剪枝 (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 (一次性剪枝)

  1. 训练大模型。
  2. 按照比例一次性剪掉权重。
  3. (可选) 微调恢复精度。

3.2 Iterative Pruning (迭代式剪枝)

  1. 训练大模型。
  2. 剪掉一小部分权重 (e.g., 10%)。
  3. 微调 (Fine-tune) 恢复精度。
  4. 重复步骤 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):从一开始就训练稀疏网络,而不是先训练密集中再剪枝,是当前的研究热点。