3、模型剪枝基础:剪枝的定义、类型(结构化/非结构化)、剪枝粒度与常见术语

模型剪枝(Model Pruning)是 TinyML 模型压缩与加速中最核心的技术之一。它的基本思想非常直观:深度神经网络在训练完成后,大量权重参数的实际贡献极小,甚至趋近于零。将这些冗余参数移除,并不会显著影响模型精度,却能大幅减少模型的存储体积、内存占用和推理计算量。对于资源极度受限的微控制器(MCU)和边缘设备而言,剪枝往往是开启 TinyML 部署之旅的第一步。本章将系统梳理剪枝的定义、两大类型(结构化与非结构化)、剪枝粒度以及工程中必须掌握的术语,为后续的精度恢复与微调训练打下坚实的理论基础。

模型剪枝核心概念与分类体系 模型剪枝 非结构化剪枝 细粒度 · 权重级 结构化剪枝 粗粒度 · 通道/核/层 粒度:单个权重 • 稀疏矩阵存储 • 需要专用硬件/库加速 • 压缩率高但硬件不友好 粒度:通道/滤波器/层 • 规则稀疏,保持原始结构 • 通用硬件直接加速 • 压缩率相对较低 精度恢复难度:较高 微调训练敏感,需学习率调度 精度恢复难度:较低 结构规则,微调更稳定

3.1 剪枝的核心原理:从“冗余”到“稀疏”

神经网络在训练过程中,由于梯度下降的随机性和数据分布的多样性,最终学习到的权重矩阵往往存在大量冗余。这些冗余表现为:一部分权重的绝对值非常小,对激活值的贡献微弱;另一部分权重之间高度相关,存在信息重叠。剪枝的本质就是有选择地移除这些冗余参数,将稠密(Dense)模型转化为稀疏(Sparse)模型。

从信息论的角度看,剪枝是一种有损压缩。它通过牺牲一定的精度上限,换取存储和计算效率的极大提升。在 TinyML 场景中,这种权衡往往是值得的——因为 MCU 的 Flash 通常只有几百 KB 到几 MB,RAM 更是以 KB 计,一个 1MB 的模型如果不剪枝,根本无法烧录到设备中。

核心公式理解: 剪枝率(Pruning Ratio)= 被剪除的权重数量 / 总权重数量。例如,一个卷积层有 100 万个参数,剪掉 80 万个,则剪枝率为 80%。但剪枝率并不等于实际加速比——非结构化剪枝的加速比取决于硬件对稀疏运算的支持程度。

3.2 剪枝的两大类型:非结构化与结构化

根据剪枝的最小单位不同,剪枝分为非结构化剪枝(Unstructured Pruning)和结构化剪枝(Structured Pruning)。这是工程选型时最重要的分水岭。

3.2.1 非结构化剪枝:细粒度、高压缩、硬件不友好

非结构化剪枝针对单个权重进行操作。训练完成后,将绝对值低于阈值的权重直接置零。这种方式的优点是:剪枝粒度最细,理论上可以达到极高的压缩率(90% 以上),精度损失相对较小。但缺点是:置零后的权重在内存中呈不规则分布,需要采用稀疏矩阵存储格式(如 CSR、CSC)来压缩存储,且推理时无法直接利用通用的矩阵乘法库(如 CMSIS-NN),必须依赖专门的稀疏卷积库或硬件支持。

对比维度非结构化剪枝结构化剪枝
剪枝单位单个权重(Weight)通道(Channel)/滤波器(Filter)/层(Layer)
存储格式稀疏矩阵(CSR/CSC)规则稠密矩阵
硬件加速需专用稀疏加速器通用硬件直接加速
压缩率高(可达 90%+)中(通常 30%-70%)
精度恢复难度较难,微调敏感较易,微调稳定
TinyML 适用性低(MCU 不支持稀疏运算)高(CMSIS-NN 直接支持)

3.2.2 结构化剪枝:粗粒度、规则稀疏、部署友好

结构化剪枝以整个通道、整个滤波器或整个层为单位进行移除。例如,在卷积神经网络中,如果一个滤波器(Filter)的 L2 范数很小,说明该滤波器提取的特征对最终输出贡献微弱,可以直接删除该滤波器及其对应的输出特征图。删除后,网络结构变得“窄”了,但仍然是规则的稠密结构,可以直接部署到任何标准推理引擎上。

在 TinyML 中,结构化剪枝是首选方案。因为 Cortex-M 系列处理器上的 CMSIS-NN 库针对 4x4 或 8x8 的规则卷积做了深度优化,只有保持通道数的规则性,才能发挥硬件加速能力。

经验之谈: 对于 8 位量化后的 TinyML 模型,建议优先采用结构化剪枝。因为非结构化剪枝产生的稀疏模式在量化后往往会被破坏,导致压缩失效。

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

剪枝粒度(Granularity)描述了剪枝操作的最小单元。从细到粗,可以分为以下四个层次:

  1. 权重级(Weight-level): 即非结构化剪枝,单个权重置零。
  2. 核内模式级(Intra-kernel Pattern): 在单个卷积核内,按固定模式(如 2x1 或 1x2 的条带)剪除权重。这是一种折中方案,兼顾一定的稀疏性和规则性。
  3. 通道/滤波器级(Channel/Filter-level): 删除整个通道或滤波器,属于结构化剪枝。这是 TinyML 中最常用的粒度。
  4. 层级(Layer-level): 直接删除整个网络层(如丢弃某个冗余的卷积层或残差块)。这种粒度最粗,但容易造成精度骤降,通常只在极深网络中谨慎使用。

3.4 常见术语与工程指标

在剪枝相关的论文和工程实践中,以下术语频繁出现,需要准确理解:

  • 剪枝率(Pruning Ratio): 被剪除参数占总参数的比例。例如 50% 剪枝率意味着移除一半参数。
  • 稀疏度(Sparsity): 与剪枝率等价,指零值参数占总参数的比例。
  • FLOPs(浮点运算次数): 衡量模型计算量的指标。剪枝的目标之一就是降低 FLOPs。
  • 模型大小(Model Size): 指模型文件在 Flash 中占用的空间,通常以 KB/MB 为单位。
  • Top-1 / Top-5 精度: 分类任务中常用的精度指标,用于评估剪枝前后的精度变化。
  • 重训练(Retraining)/ 微调(Fine-tuning): 剪枝后为了恢复精度而进行的二次训练过程。这是本课程后续章节的核心内容。

3.5 案例拆解:基于结构化剪枝的 TinyML 视觉模型压缩

下面通过一个具体的工程案例,展示结构化剪枝在 TinyML 项目中的完整应用流程。

背景与约束: 某智能家居项目需要在 Cortex-M4 内核的 MCU(主频 80MHz,Flash 512KB,RAM 128KB)上部署一个图像分类模型,用于识别 10 种室内物体。初始模型采用 MobileNetV1(alpha=0.5),参数量约 0.5M,模型大小约 2MB(FP32),远超 Flash 容量限制。

初始现象与目标: 模型在 PC 上 Top-1 精度为 85.2%,但无法部署到 MCU。目标是将模型压缩至 300KB 以内,同时保证 Top-1 精度不低于 80%。

关键输入数据与参数:

  • 原始模型:MobileNetV1(alpha=0.5),输入尺寸 96x96x3。
  • 剪枝策略:对深度可分离卷积的 3x3 逐通道卷积层进行通道级结构化剪枝。
  • 剪枝阈值:计算每个通道的 L2 范数,设定剪枝率为 40%。

分析判断过程: 首先对模型进行逐层敏感性分析,发现最后几个卷积层的通道冗余度较高,而浅层通道对精度影响较大。因此决定对后 60% 的卷积层施加 50% 剪枝率,对前 40% 的层施加 30% 剪枝率,整体剪枝率约 40%。

实际操作步骤:

  1. 加载预训练模型,逐层计算每个滤波器的 L2 范数。
  2. 按阈值剪除范数最小的滤波器,并同步删除对应的 BatchNorm 层参数和下一层的输入通道。
  3. 将剪枝后的模型导出为 TFLite 格式,并执行 8 位量化。
  4. 在 PC 端进行微调训练(学习率设为原始训练时的 1/10,训练 5 个 epoch)。

结果对比:

指标原始模型剪枝+量化后变化
模型大小2.0 MB280 KB↓ 86%
Top-1 精度85.2%81.5%↓ 3.7%
推理时间(MCU)无法运行320 ms—
RAM 占用—96 KB—

风险与代价: 剪枝后精度下降了 3.7%,但通过微调训练恢复到了 81.5%,满足 80% 的部署要求。代价是微调过程需要额外的训练时间和数据。

复盘经验: 结构化剪枝配合量化是 TinyML 部署的黄金组合。剪枝时切忌一刀切,必须结合逐层敏感性分析来分配剪枝率。此外,微调训练的学习率设置至关重要,过大会破坏已保留的权重,过小则恢复效果有限。

3.6 常见误区与总结复盘

误区一:盲目追求高剪枝率。 在 TinyML 中,剪枝率并非越高越好。当剪枝率超过 70% 时,精度往往呈断崖式下跌,且微调难以恢复。建议从 30% 开始尝试,逐步增加。
误区二:忽略硬件特性。 在 MCU 上,非结构化剪枝几乎无法带来实际加速,反而可能因为稀疏索引计算而变慢。务必选择结构化剪枝。
误区三:剪枝后不进行微调。 剪枝必然造成精度损失,直接部署会导致用户体验下降。必须进行微调训练(即本课程的核心主题)。