3、模型剪枝基础:剪枝的定义、类型(结构化/非结构化)、剪枝粒度与常见术语
模型剪枝(Model Pruning)是 TinyML 模型压缩与加速中最核心的技术之一。它的基本思想非常直观:深度神经网络在训练完成后,大量权重参数的实际贡献极小,甚至趋近于零。将这些冗余参数移除,并不会显著影响模型精度,却能大幅减少模型的存储体积、内存占用和推理计算量。对于资源极度受限的微控制器(MCU)和边缘设备而言,剪枝往往是开启 TinyML 部署之旅的第一步。本章将系统梳理剪枝的定义、两大类型(结构化与非结构化)、剪枝粒度以及工程中必须掌握的术语,为后续的精度恢复与微调训练打下坚实的理论基础。
3.1 剪枝的核心原理:从“冗余”到“稀疏”
神经网络在训练过程中,由于梯度下降的随机性和数据分布的多样性,最终学习到的权重矩阵往往存在大量冗余。这些冗余表现为:一部分权重的绝对值非常小,对激活值的贡献微弱;另一部分权重之间高度相关,存在信息重叠。剪枝的本质就是有选择地移除这些冗余参数,将稠密(Dense)模型转化为稀疏(Sparse)模型。
从信息论的角度看,剪枝是一种有损压缩。它通过牺牲一定的精度上限,换取存储和计算效率的极大提升。在 TinyML 场景中,这种权衡往往是值得的——因为 MCU 的 Flash 通常只有几百 KB 到几 MB,RAM 更是以 KB 计,一个 1MB 的模型如果不剪枝,根本无法烧录到设备中。
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 的规则卷积做了深度优化,只有保持通道数的规则性,才能发挥硬件加速能力。
3.3 剪枝粒度:从权重到层的层次体系
剪枝粒度(Granularity)描述了剪枝操作的最小单元。从细到粗,可以分为以下四个层次:
- 权重级(Weight-level): 即非结构化剪枝,单个权重置零。
- 核内模式级(Intra-kernel Pattern): 在单个卷积核内,按固定模式(如 2x1 或 1x2 的条带)剪除权重。这是一种折中方案,兼顾一定的稀疏性和规则性。
- 通道/滤波器级(Channel/Filter-level): 删除整个通道或滤波器,属于结构化剪枝。这是 TinyML 中最常用的粒度。
- 层级(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%。
实际操作步骤:
- 加载预训练模型,逐层计算每个滤波器的 L2 范数。
- 按阈值剪除范数最小的滤波器,并同步删除对应的 BatchNorm 层参数和下一层的输入通道。
- 将剪枝后的模型导出为 TFLite 格式,并执行 8 位量化。
- 在 PC 端进行微调训练(学习率设为原始训练时的 1/10,训练 5 个 epoch)。
结果对比:
| 指标 | 原始模型 | 剪枝+量化后 | 变化 |
|---|---|---|---|
| 模型大小 | 2.0 MB | 280 KB | ↓ 86% |
| Top-1 精度 | 85.2% | 81.5% | ↓ 3.7% |
| 推理时间(MCU) | 无法运行 | 320 ms | — |
| RAM 占用 | — | 96 KB | — |
风险与代价: 剪枝后精度下降了 3.7%,但通过微调训练恢复到了 81.5%,满足 80% 的部署要求。代价是微调过程需要额外的训练时间和数据。
复盘经验: 结构化剪枝配合量化是 TinyML 部署的黄金组合。剪枝时切忌一刀切,必须结合逐层敏感性分析来分配剪枝率。此外,微调训练的学习率设置至关重要,过大会破坏已保留的权重,过小则恢复效果有限。