Model Pruning
模型剪枝会移除神经网络中重要性较低的权重、滤波器或层,以缩减模型体积和计算量。了解非结构化与结构化剪枝,并查看代码。
模型剪枝会移除对训练后神经网络输出贡献很小的参数,范围从单个权重到整个滤波器、注意力头或层,从而让模型更小、运行成本更低。大多数网络都过度参数化,因此可以移除相当一部分权重,而准确率几乎不受影响;之后再进行微调时尤其如此。2015 年的一种剪枝再训练方法将 AlexNet 的参数量从 6100 万降到 670 万,将 VGG-16 的参数量从 1.38 亿降到 1030 万,且 ImageNet 准确率没有损失。剪枝是为手机、相机和其他边缘 AI硬件准备模型的标准步骤,如今也应用于大型语言模型(LLM)。
模型剪枝的工作原理#
剪枝会根据重要性为候选权重或结构打分,移除得分最低的一部分,再对剩余的模型权重进行微调以恢复准确率。最简单且至今最常用的评分方法是权重幅值:接近零的权重,或 L1、L2 范数较小的滤波器,移除后对输出的影响最小。其他标准则会利用梯度或激活值,估算移除每个部分会使损失增加多少。一次移除过大比例的参数通常会损害准确率,因此剪枝通常分轮进行,每轮之后都进行微调,直到模型达到目标大小,或准确率下降超出容许范围:
剪枝也改变了研究人员对网络规模的看法。彩票假设认为,稠密网络包含一些小型子网络;如果这些子网络从其原始初始权重开始单独训练,就能达到完整网络的准确率。该假设的作者在 MNIST 和 CIFAR-10 上反复发现,这类子网络的规模不到原网络的 10%–20%。
非结构化剪枝与结构化剪枝#
非结构化剪枝会将张量中任意位置的单个权重置零。它可以在准确率损失很小的情况下实现高稀疏度,但张量形状保持不变,因此标准稠密内核仍要执行同样的工作;要获得加速,需要稀疏内核或硬件支持。Ampere 及之后的 NVIDIA GPU 支持一种模式:每四个连续权重中有两个为零的 2:4 稀疏模式,其运算速度最高可达到稠密运算的两倍。结构化剪枝会移除整个滤波器、通道、注意力头或层,得到更小的稠密模型,可在任何处理器上更快运行;但在移除相同数量权重时,准确率损失更大。移除滤波器时,也会移除下一层中与之对应的输入通道;Torch-Pruning 等库可以自动追踪这些依赖关系。PyTorch 的剪枝工具展示了这两种方法的区别:
import torch
from torch.nn.utils import prune
# Two identical convolution layers, one for each pruning style
torch.manual_seed(0)
a = torch.nn.Conv2d(16, 32, kernel_size=3)
b = torch.nn.Conv2d(16, 32, kernel_size=3)
# Unstructured: zero the 50% of individual weights with the smallest magnitude
prune.l1_unstructured(a, name="weight", amount=0.5)
# Structured: zero the 50% of output filters with the smallest L2 norm
prune.ln_structured(b, name="weight", amount=0.5, n=2, dim=0)
for name, layer in [("unstructured", a), ("structured", b)]:
zeros = (layer.weight == 0).float().mean().item()
empty = (layer.weight.flatten(1) == 0).all(dim=1).sum().item()
print(f"{name}: {zeros:.0%} of weights zero, {empty} of 32 filters empty")两层最终都有 50% 的权重为零。只有结构化剪枝后的层包含空滤波器,共 32 个滤波器中的 16 个;删除它们后,就会得到滤波器数量减半的稠密层,在普通硬件上可将计算量减半。专为稀疏计算打造的硬件也能从非结构化剪枝中受益:Ambarella 为 Ultralytics YOLO 提供的 CVflow 集成由 Ambarella 在自己的软件包分支中维护,它会在 YOLO 训练期间逐步剪枝权重,并在 ONNX 导出过程中保留稀疏性,以便编译到其边缘 AI 芯片上。
剪枝与相关技术的比较#
- 模型量化:降低所有权重的精度,例如从 32 位浮点数降至 8 位整数,但保留所有权重。剪枝和量化常结合使用,因为剪枝会减少运算次数,量化则会降低每次运算的成本。
- 知识蒸馏:训练较小的学生模型模仿较大的教师模型;结构化剪枝移除整个滤波器或层后,通常会采用知识蒸馏来恢复由此损失的准确率。
- Dropout:作为正则化的一种形式,在训练期间临时将随机激活值置零,推理时则使用完整网络。
剪枝大型语言模型#
每轮剪枝后重新训练 LLM 的成本过高,因此单次剪枝方法会使用小型校准集,一次性完成剪枝。SparseGPT 在不到 4.5 小时内,将 1750 亿参数的 OPT 和 1760 亿参数的 BLOOM 模型剪枝到 60% 的非结构化稀疏度,困惑度仅略有上升;它也支持 GPU 可加速的 2:4 模式。结构化剪枝结合知识蒸馏可生成更小的稠密模型:NVIDIA 的 Minitron 从一个预训练的 150 亿参数模型中剪枝嵌入通道、MLP 神经元和注意力头,得到 8B 和 4B 模型;随后用比从头训练少至多 40 倍的 token 对它们重新训练。










