2、基础知识:神经网络剪枝的基本概念、分类(结构化/非结构化、细粒度/粗粒度)与常见术语
在进入剪枝与蒸馏联合训练的技术细节之前,必须先建立一套清晰、准确的概念坐标系。剪枝(Pruning)并非简单的“删掉一些权重”,而是一个涉及粒度选择、结构约束、稀疏模式、硬件适配的系统工程。如果对基本概念理解模糊,后续在联合训练中很容易出现“剪了但加速不了”“稀疏了但精度崩了”“结构变了但蒸馏失效”等问题。本节将系统梳理剪枝的核心定义、分类维度、关键术语,并给出结构化与非结构化剪枝的对比框架,为后续章节的联合训练策略打下坚实的理论基础。
上图展示了剪枝分类的整体框架。从最顶层的“神经网络剪枝”出发,按照剪枝粒度可以划分为非结构化剪枝(细粒度)与结构化剪枝(粗粒度)两大分支。非结构化剪枝进一步细分为权重级、神经元级和连接级剪枝;结构化剪枝则包括通道/滤波器剪枝、核/张量剪枝以及层/块剪枝。图中底部列出了剪枝领域最常用的关键术语,这些术语将在后续章节中反复出现。下面逐一展开详细讲解。
2.1 剪枝的核心定义与本质
神经网络剪枝(Neural Network Pruning)是一种模型压缩技术,其核心思想是在保持模型性能(精度)基本不下降的前提下,移除网络中冗余的参数、神经元、通道甚至整个层。剪枝的本质可以理解为一种“结构搜索”与“参数筛选”的结合——它试图在训练好的模型中找出哪些部分对最终输出贡献较小,然后将其剔除,从而减少模型的存储占用、计算量和推理延迟。
从数学角度看,剪枝操作可以形式化地描述为:给定一个训练好的网络参数集合 W,剪枝的目标是找到一个稀疏化后的参数集合 W',使得 W' 满足某种稀疏性约束(如非零参数比例低于阈值),同时最小化损失函数的变化量。对于非结构化剪枝,W' 中的非零参数位置是任意分布的;对于结构化剪枝,W' 中的非零参数必须满足特定的结构约束(如整行、整列、整个通道非零)。
剪枝之所以有效,是因为深度神经网络普遍存在严重的参数冗余。研究表明,在训练好的ResNet、VGG等模型中,有相当比例的卷积核或权重对最终预测结果的贡献微乎其微。这些冗余参数可能是由于过参数化(Over-parameterization)导致的,也可能是训练过程中某些参数收敛到了接近零的极小值。剪枝正是利用了这一特性,通过移除冗余来换取效率。
2.2 剪枝分类:结构化与非结构化
剪枝分类的核心维度是剪枝后参数分布的结构性。这一维度直接决定了剪枝后的模型能否在现有硬件上获得实际的加速效果。
2.2.1 非结构化剪枝(细粒度剪枝)
非结构化剪枝是最早被提出的剪枝形式,其特点是对单个权重或单个神经元连接进行独立判断和删除。剪枝后,网络中保留下来的参数位置是零散、不规则的,形成一种“稀疏矩阵”的形态。这种剪枝方式通常能达到极高的稀疏度(如90%以上),但在实际推理时,由于稀疏矩阵的存储和计算需要特殊的稀疏矩阵运算库或专用硬件支持,否则很难获得真正的加速。
非结构化剪枝的典型代表是权重级剪枝(Weight-level Pruning)。其操作流程为:首先训练一个完整的模型,然后根据某种重要性准则(如权重值大小、梯度信息、Hessian矩阵等)对每个权重进行排序,将低于阈值的权重置为零。例如,经典的“Optimal Brain Damage”和“Optimal Brain Surgeon”方法就是基于二阶导数信息来评估权重重要性。现代方法更常用的是简单有效的“幅度剪枝”(Magnitude Pruning),即直接删除值小于阈值的权重。
非结构化剪枝的优点是灵活性高、压缩率大,理论上可以达到极高的稀疏度而不显著影响精度。但其缺点也很明显:硬件不友好。通用GPU和CPU的矩阵乘法运算假设数据是密集排列的,稀疏矩阵会导致大量无效计算和内存访问开销。虽然NVIDIA的Ampere架构引入了稀疏张量核心(Sparse Tensor Core),但要求稀疏度恰好为50%且采用2:4结构化稀疏模式,这并非任意非结构化剪枝都能满足。
2.2.2 结构化剪枝(粗粒度剪枝)
结构化剪枝则完全不同,它要求被剪除的参数在空间上具有连续性,形成完整的结构单元。最常见的结构化剪枝是通道剪枝(Channel Pruning),即直接删除整个卷积核对应的输出通道。由于卷积神经网络的每一层输出是一个特征图(Feature Map),通道剪枝相当于减少特征图的通道数,从而直接减少下一层的输入通道数,实现计算量的实质性减少。
结构化剪枝还包括滤波器剪枝(Filter Pruning)(与通道剪枝本质相同,只是视角不同)、核剪枝(Kernel Pruning)(删除卷积核中的某些行或列)、层剪枝(Layer Pruning)(直接删除整个卷积层或全连接层)等。其中,通道/滤波器剪枝是最常用、最成熟的结构化剪枝方法,因为它不需要特殊的硬件支持,剪枝后的模型仍然是标准的密集张量运算,可以直接在现有深度学习框架和硬件上运行并获得加速。
结构化剪枝的优点是硬件友好、部署方便,剪枝后的模型可以立即获得推理加速和内存节省。缺点是灵活性较低,由于必须保持结构完整性,可剪枝的粒度较大,精度损失通常比非结构化剪枝更明显,需要更精细的重训练策略来恢复精度。
| 对比维度 | 非结构化剪枝(细粒度) | 结构化剪枝(粗粒度) |
|---|---|---|
| 剪枝单位 | 单个权重、单个连接 | 通道、滤波器、核、层 |
| 稀疏模式 | 不规则、零散分布 | 规则、连续分布 |
| 压缩率上限 | 极高(可达90%-95%) | 中等(通常30%-70%) |
| 硬件加速 | 需要专用稀疏硬件或库 | 通用硬件直接加速 |
| 精度恢复难度 | 相对容易(参数冗余多) | 较难(结构变化大) |
| 典型方法 | 幅度剪枝、OBD、OBS | 通道重要性评估、BN层γ稀疏 |
| 部署场景 | 移动端NPU(支持稀疏) | GPU/CPU/边缘设备通用 |
2.3 细粒度与粗粒度的进一步细分
在“结构化/非结构化”的二分法基础上,学术界和工业界还会根据剪枝的具体对象和尺度做更细致的划分。理解这些细分有助于在实际项目中精准选择剪枝策略。
2.3.1 细粒度剪枝的细分
细粒度剪枝(Fine-grained Pruning)通常指非结构化剪枝,但根据剪枝对象的不同,可以进一步分为:
- 权重级剪枝(Weight-level):对张量中的每一个标量权重独立判断是否置零。这是最细的粒度,灵活性最高。
- 神经元级剪枝(Neuron-level):以神经元为单位进行剪枝。对于全连接层,一个神经元对应一行权重;对于卷积层,一个神经元对应一个卷积核。神经元级剪枝实际上已经带有一定的结构性,因为删除一个神经元意味着删除其所有输入和输出连接。
- 向量级剪枝(Vector-level):按行或按列对权重矩阵进行剪枝。例如,删除权重矩阵中的某一行或某一列。这种剪枝方式介于非结构化与结构化之间,有时也被称为“半结构化剪枝”。
2.3.2 粗粒度剪枝的细分
粗粒度剪枝(Coarse-grained Pruning)即结构化剪枝,其细分维度更加丰富:
- 通道剪枝(Channel Pruning):删除整个输出通道。这是最流行的结构化剪枝方式,适用于卷积层。通道剪枝后,特征图的通道数减少,后续层的计算量呈线性下降。
- 滤波器剪枝(Filter Pruning):与通道剪枝等价,只是从卷积核的角度描述。一个滤波器对应一个输出通道。
- 核剪枝(Kernel Pruning):删除卷积核内部的某些空间位置(如3×3卷积核中的某一行或某一列)。这种剪枝方式保留了通道数,但减少了每个通道内的计算量。
- 层剪枝(Layer Pruning):直接删除整个卷积层或全连接层。层剪枝的粒度最大,对网络结构影响最剧烈,通常用于极深网络的压缩。
- 块剪枝(Block Pruning):删除Transformer中的某些注意力头(Attention Head)或前馈网络块(FFN Block)。这是近年来针对Transformer模型提出的结构化剪枝方式。
2.4 剪枝常见术语与度量指标
在剪枝相关的和工程实践中,以下术语和指标会频繁出现,必须准确理解:
- 稀疏度(Sparsity):被剪除(置零)的参数占总参数的比例。例如,稀疏度90%意味着90%的权重被置为零。稀疏度与压缩率(Compression Ratio)的关系为:压缩率 = 1 / (1 - 稀疏度)。
- 剪枝率(Pruning Ratio):与稀疏度含义相同,通常用百分比表示。剪枝率50%表示剪掉一半参数。
- 掩码(Mask):一个与权重张量形状相同的0/1矩阵,1表示保留该权重,0表示剪除。掩码是剪枝操作的核心数据结构,在联合训练中,掩码会参与前向传播和反向传播。
- 重训练(Fine-tuning / Retraining):剪枝后对模型进行少量轮次的训练,以恢复因剪枝造成的精度损失。重训练是剪枝流程中不可或缺的一步。
- 一次性剪枝(One-shot Pruning):训练完成后,直接根据重要性准则剪除参数,然后进行重训练。这种方法简单快速,但精度损失可能较大。
- 迭代剪枝(Iterative Pruning):剪枝-重训练-再剪枝-再重训练的循环过程。每次剪掉一小部分参数,然后重训练恢复精度,重复多次。迭代剪枝通常比一次性剪枝效果更好,但训练成本更高。
- FLOPs(浮点运算次数):衡量模型计算量的指标。剪枝的目标之一就是减少FLOPs。
- 实际加速比(Real Speedup):在特定硬件上实测的推理延迟减少比例。由于内存访问、并行度等因素,实际加速比通常低于理论FLOPs减少比例。
2.5 案例拆解:MobileNetV2的通道剪枝决策
为了帮助理解上述概念在实际项目中的应用,我们以一个典型的Edge AI场景为例进行拆解。假设我们需要将MobileNetV2模型部署到一款基于ARM Cortex-A76 CPU的嵌入式设备上,目标是将推理延迟从120ms降低到60ms以内,同时保证Top-1精度下降不超过2%。
初始分析与决策:MobileNetV2的核心结构是倒残差块(Inverted Residual Block),其中1×1卷积(扩展层)占据了大部分计算量。如果采用非结构化剪枝,虽然可以达到很高的稀疏度,但ARM CPU的通用矩阵乘法库(如Arm Compute Library)对稀疏矩阵的支持非常有限,实际加速几乎为零。因此,我们决定采用通道剪枝策略,直接减少倒残差块中扩展层的通道数。
关键输入数据:我们使用ImageNet验证集(50000张图片)作为评估基准。初始模型Top-1精度为71.8%,FLOPs为300M,推理延迟为120ms。我们设定剪枝率为30%(即剪掉30%的通道),目标FLOPs降至210M。
分析判断过程:我们首先对每个通道的重要性进行排序。采用BN层γ系数作为重要性指标——在训练过程中,BN层的γ参数会自适应调整,γ值接近0的通道被认为对后续层贡献较小。我们统计了所有倒残差块中BN层γ的分布,发现约30%的通道γ值小于0.01,这些通道可以被安全剪除。
实际操作步骤:
- 加载预训练的MobileNetV2模型,提取所有BN层的γ参数。
- 按γ值从小到大排序,确定全局剪枝阈值,使得剪除的通道数占总通道数的30%。
- 生成通道掩码,将对应通道的卷积核权重置零,并调整后续层的输入通道数。
- 对剪枝后的模型进行重训练,使用ImageNet训练集,学习率设为初始学习率的1/10,训练10个epoch。
- 在验证集上评估精度和延迟。
结果对比:剪枝后模型FLOPs降至215M(减少28%),推理延迟降至78ms(减少35%),Top-1精度为70.5%(下降1.3%),满足精度损失不超过2%的约束。但延迟仍未达到60ms的目标。进一步分析发现,延迟瓶颈在于前几层的通道数仍然较多,且内存访问开销较大。于是我们进行了第二轮迭代剪枝,对前5个倒残差块采用更高的剪枝率(40%),对后10个块采用较低的剪枝率(20%)。经过第二轮迭代后,延迟降至62ms,精度为69.8%,接近目标。
风险与代价:通道剪枝虽然获得了实际加速,但精度损失比非结构化剪枝更明显。为了恢复精度,我们增加了重训练的epoch数(从10增至20),并引入了知识蒸馏辅助训练(将原始模型作为教师模型),最终将精度恢复至70.9%。这一过程增加了约2小时的训练时间,但换来了满足部署要求的模型。
2.6 常见误区与总结复盘
在剪枝基础概念的理解和应用中,初学者常犯以下错误,需要特别警惕:
- 误区一:混淆稀疏度与加速比。稀疏度90%并不意味着推理加速90%。实际加速取决于硬件对稀疏计算的支持程度、稀疏模式(规则/不规则)以及内存带宽。在通用CPU上,90%稀疏度的非结构化剪枝可能只能获得10%-20%的加速。
- 误区二:忽视剪枝后的重训练。有些初学者认为剪枝后模型精度下降不多,就跳过重训练直接部署。实际上,剪枝会破坏网络中参数的分布平衡,即使精度下降不明显,模型的鲁棒性和泛化能力也会受损。重训练是恢复模型性能的必要步骤。
- 误区三:对所有层采用相同的剪枝率。不同层对剪枝的敏感度差异很大。浅层(靠近输入的层)通常提取的是低级特征(边缘、纹理),冗余较少,不宜过度剪枝;深层(靠近输出的层)提取的是高级语义特征,冗余较多,可以适当提高剪枝率。全局统一剪枝率往往导致精度损失过大。
- 误区四:将剪枝与量化、蒸馏割裂看待。在实际的Edge AI部署中,剪枝通常与量化(如INT8量化)、知识蒸馏联合使用。剪枝减少参数数量,量化减少参数位宽,蒸馏帮助恢复精度,三者协同才能达到最佳的压缩效果。这也是本课程后续章节将重点讲解联合训练的原因。