3、模型剪枝基础:剪枝的定义、类型(结构化/非结构化、稀疏/通道)、剪枝粒度与效果对比

模型剪枝(Model Pruning)是 TinyML 模型压缩中最核心的技术之一,其本质是在尽量保持模型精度的前提下,移除神经网络中冗余的权重、神经元或通道,从而减少模型的存储体积、内存占用和推理计算量。对于部署在 MCU、Cortex-M 系列处理器或专用 NPU 上的 TinyML 模型而言,剪枝不是可选项,而是工程落地的必经之路。本章将系统梳理剪枝的定义、分类体系、粒度选择以及不同剪枝策略对硬件部署的实际影响,帮助你在“精度-体积-速度”三角约束下做出合理决策。

模型剪枝分类体系与粒度对比 模型剪枝 非结构化剪枝(细粒度) 结构化剪枝(粗粒度) 权重置零 随机稀疏 通道剪枝 向量/核剪枝 剪枝粒度与硬件效率对比 粒度 权重级 核级 通道级 层级 硬件加速 高 低

3.1 剪枝的核心定义与数学表达

剪枝的本质是对神经网络参数张量施加稀疏性约束。设原始权重矩阵为 W ∈ R^(C_out × C_in × K_h × K_w),剪枝操作定义为一个掩码矩阵 M 与 W 的逐元素乘积:W_pruned = W ⊙ M,其中 M 的元素为 0 或 1。被置为 0 的权重在推理时不再参与计算,从而减少乘加运算(MAC)次数。从信息论角度看,剪枝利用的是神经网络参数的冗余性——许多权重对最终输出的贡献极小,移除后仅造成可忽略的精度损失。

在实际 TinyML 工程中,剪枝的目标函数通常表示为:

min Loss(f(x; W ⊙ M))
s.t. ||M||_0 ≤ κ · ||W||_0

其中 κ 为目标稀疏率(如 0.3 表示保留 30% 的权重)。这个约束优化问题通常通过迭代剪枝-微调(Iterative Pruning & Fine-tuning)来近似求解,而非一次性剪枝到位。

核心要点:剪枝不是简单的“删掉不重要的权重”,而是要在稀疏性约束下重新优化剩余权重,使其补偿被剪掉部分的信息损失。因此,剪枝后必须进行再训练(微调),这也是本章后续“再训练流程”的铺垫。

3.2 剪枝类型:结构化与非结构化

根据剪枝的最小操作单元,剪枝可分为两大类:非结构化剪枝(Unstructured Pruning)和结构化剪枝(Structured Pruning)。两者的核心区别在于:剪掉的权重是否形成规则、连续的硬件可识别模式。

3.2.1 非结构化剪枝(细粒度/权重级)

非结构化剪枝对每一个独立权重进行重要性评估,将低于阈值的权重置零。其优点是压缩率上限高,理论上可以达到极高的稀疏度(如 90% 以上)而保持精度。但缺点是产生的稀疏模式是随机、不规则的,普通硬件无法直接利用这种稀疏性加速。在 Cortex-M 等常规 MCU 上,非结构化剪枝后的模型仍需以稠密矩阵方式存储和计算,实际推理速度几乎没有提升,甚至因为稀疏索引的额外开销而变慢。

对比维度非结构化剪枝结构化剪枝
最小剪枝单元单个权重通道/滤波器/向量/层
稀疏模式随机、不规则规则、连续
理论压缩率高(可达 90%+)中(通常 30%-70%)
硬件加速适配差(需专用稀疏加速器)好(可直接减少 MAC 运算)
内存布局需额外索引表保持稠密张量布局
典型应用场景学术研究、专用 AI 芯片TinyML 边缘部署、MCU/NPU

3.2.2 结构化剪枝(粗粒度)

结构化剪枝以滤波器(Filter)、通道(Channel)、卷积核(Kernel)或向量(Vector)为基本单元进行整体移除。剪枝后模型的张量维度发生变化(如通道数从 64 减为 48),但剩余权重仍然保持规则的稠密排列。这种规则性使得硬件可以直接跳过被剪掉的通道,从而真实减少计算量和内存访问。对于 TinyML 部署,结构化剪枝是首选方案,尤其是通道剪枝——因为它不需要特殊的稀疏推理库,标准 CMSIS-NN 或 TFLite Micro 即可直接受益。

经验之谈:在 TinyML 项目中,如果目标硬件是 ARM Cortex-M 系列,优先考虑通道剪枝或滤波器剪枝;如果目标硬件是带有稀疏加速引擎的专用 NPU(如某些 AIoT 芯片),则可以考虑非结构化剪枝以追求更高压缩率。

3.3 剪枝粒度:从权重到层的四级体系

剪枝粒度决定了剪枝操作的“颗粒大小”,从细到粗可分为四个层级:权重级(Weight-level)、核级(Kernel-level)、通道级(Channel-level)、层级(Layer-level)。粒度越细,灵活性越高,但硬件友好度越低;粒度越粗,硬件加速效果越明显,但精度损失风险也越大。

3.3.1 权重级剪枝(Fine-grained)

即非结构化剪枝,每个权重独立判断去留。适用于全连接层或 1x1 卷积层。在 TinyML 中,权重级剪枝通常作为预压缩步骤,配合量化使用。例如,先将模型剪枝到 70% 稀疏度,再对非零权重进行 8bit 量化,可进一步减少存储。

3.3.2 核级剪枝(Kernel-level)

以单个卷积核(K_h × K_w 的二维矩阵)为单元。例如,一个 3×3 的卷积核被整体移除。这种粒度介于权重和通道之间,保留了部分规则性。但核级剪枝后,同一输出通道的不同输入通道对应的核可能被部分剪除,导致计算时仍需处理不完整的卷积核,硬件加速效果不如通道剪枝直接。

3.3.3 通道级剪枝(Channel-level)

以整个输出通道(即一个滤波器对应的所有输入通道的核)为单元。剪掉一个输出通道后,下一层的输入通道数同步减少。这是 TinyML 中最推荐的粒度,因为:

  • 直接减少卷积层的 MAC 数量(输出通道数减少,计算量线性下降);
  • 不影响张量存储布局,无需稀疏索引;
  • 可与 Batch Normalization 融合,利用 BN 的缩放因子 γ 作为重要性指标。

3.3.4 层级剪枝(Layer-level)

直接移除整个层(如跳过某个冗余的卷积块)。这种粒度最激进,通常用于深层网络(如 ResNet 的某些残差块),但在 TinyML 的小型模型(如 MobileNetV2 的倒残差块)中需谨慎使用,因为层间依赖性强,移除一层可能导致特征传递断裂。

粒度类型剪枝单元精度保持能力硬件加速收益实现复杂度
权重级单个权重高(可达 90%+ 稀疏)低(需专用硬件)低
核级单个卷积核中高中中
通道级整个输出通道中(通常 30%-60% 剪枝率)高(直接减少 MAC)中高
层级整个层低(需谨慎评估)极高(层数减少)高

3.4 剪枝效果对比与硬件适配分析

为了直观理解不同剪枝策略在 TinyML 部署中的实际效果,我们以一个典型的 2D 卷积层(输入通道 32,输出通道 64,3×3 卷积核)为例进行对比分析。假设该层原始 MAC 数为 32×64×3×3×H×W(H、W 为特征图尺寸)。

原始层:输入 32 通道 → 输出 64 通道,3×3 卷积
MAC 数 = 32 × 64 × 9 × H × W = 18432 × H × W

方案A(非结构化剪枝 50%):权重稀疏率 50%
- 存储:减少 50%(但需额外索引表,实际节省约 40%)
- 计算:MAC 数不变(硬件仍按稠密计算)
- 推理速度:几乎无提升

方案B(通道剪枝 50%):输出通道从 64 减为 32
- 存储:减少 50%(无额外开销)
- 计算:MAC 数 = 32 × 32 × 9 × H × W = 9216 × H × W(减少 50%)
- 推理速度:约提升 1.8-2.0 倍(受内存带宽影响)

从上述对比可以看出,在标准 MCU 上,通道剪枝的实际收益远大于非结构化剪枝。但通道剪枝的精度损失通常更大,因为一次性移除了大量参数。因此,工程上常采用渐进式通道剪枝:每次剪掉 10%-20% 的通道,然后微调恢复精度,再继续剪枝,直到达到目标压缩率。

风险提示:通道剪枝后,模型的 Batch Normalization 层参数(均值、方差)需要重新统计,因为剩余通道的激活分布已经改变。如果直接使用原 BN 参数,会导致精度骤降。正确做法是在剪枝后、微调前,用少量校准数据重新计算 BN 统计量。

3.5 案例拆解:关键词唤醒模型的通道剪枝实战

下面通过一个完整的案例,展示通道剪枝在 TinyML 关键词唤醒(KWS)模型上的应用过程。

背景与约束:某智能语音设备需要部署一个 2 类关键词分类模型(“你好”和“关闭”),目标硬件为 Cortex-M7 内核 MCU,Flash 限制 256KB,RAM 限制 128KB,推理延迟要求小于 50ms。原始模型为 3 层卷积 + 2 层全连接,参数量 180KB,推理延迟 78ms,超出预算。

初始现象:模型精度为 96.2%(验证集),但体积和速度均不达标。直接量化到 8bit 后,体积降至 45KB,但延迟仍为 65ms(MAC 数未减少)。

关键输入数据:

  • 第一层卷积:输入 1 通道,输出 32 通道,3×3 卷积,MAC 数 = 1×32×9×T×F(T=49 时间帧,F=10 频带)
  • 第二层卷积:输入 32 通道,输出 64 通道,MAC 数 = 32×64×9×T×F
  • 第三层卷积:输入 64 通道,输出 64 通道,MAC 数 = 64×64×9×T×F

分析判断过程:通过 BN 层 γ 值统计发现,第二层卷积的 64 个输出通道中,有 18 个通道的 γ 值小于 0.01,说明这些通道的激活贡献极低。同时,第三层卷积的 64 个通道中,有 12 个通道的 γ 值接近 0。因此,决定对第二层剪枝 25%(64→48 通道),对第三层剪枝 20%(64→52 通道)。

实际操作步骤:

  1. 使用 TensorFlow 的 tfmot.sparsity.keras.prune_low_magnitude 结合 tfmot.sparsity.keras.ConstantSparsity 进行通道级剪枝调度;
  2. 设置剪枝计划:前 5 个 epoch 逐步将通道数从 64 减至 48,后 5 个 epoch 微调;
  3. 剪枝完成后,用 1000 条校准音频重新计算 BN 统计量;
  4. 进行 8bit 量化感知训练(QAT),补偿量化误差。

结果对比:

指标原始模型仅量化通道剪枝+量化
参数量180KB45KB28KB
MAC 数2.1M2.1M1.3M
推理延迟78ms65ms38ms
精度96.2%95.8%95.1%

风险与代价:通道剪枝后精度下降了 1.1 个百分点,但仍在产品可接受范围(>95%)。主要风险在于剪枝比例过高时可能触发精度悬崖,因此采用了渐进式剪枝策略,每轮剪枝后评估验证集精度,若下降超过 0.5% 则回退并减少剪枝比例。

复盘经验:通道剪枝与量化是互补的——剪枝减少 MAC 数,量化减少存储和内存带宽。两者结合使用,才能在 TinyML 硬件上获得最佳效果。此外,BN 层 γ 值是最简单有效的通道重要性指标,无需额外计算梯度或 Hessian 矩阵。

3.6 常见误区与总结复盘

在模型剪枝的工程实践中,以下误区需要特别注意:

  • 误区一:追求极致稀疏率。在 TinyML 场景中,90% 以上的稀疏率往往导致精度不可逆下降,且硬件无法加速。建议以硬件实际加速效果为导向,而非以稀疏率为目标。
  • 误区二:剪枝后不微调。剪枝后权重分布已改变,必须进行再训练(至少 3-5 个 epoch)让剩余权重适应新的网络结构。
  • 误区三:忽略 BN 层影响。通道剪枝后 BN 统计量失效,需重新校准。否则即使微调,精度恢复也很慢。
  • 误区四:对所有层使用相同剪枝比例。不同层对精度敏感度不同,浅层通常更敏感。建议使用敏感性分析(逐层剪枝并评估精度损失)来确定每层的剪枝比例。
总结:模型剪枝是 TinyML 部署中“性价比”最高的压缩技术。对于边缘 MCU 设备,通道剪枝 + 8bit 量化是最稳健的组合方案。剪枝粒度的选择应基于目标硬件的计算特性:如果硬件支持稀疏加速(如某些 NPU),可考虑非结构化剪枝;如果使用通用 MCU,则必须采用结构化剪枝。在实际项目中,建议采用“渐进式剪枝-微调-评估”的迭代流程,以精度损失为约束,逐步逼近体积和延迟目标。