3、模型剪枝概述:剪枝类型(结构化/非结构化)、剪枝粒度(权重/通道/层)、剪枝流程(训练-剪枝-微调)
TinyML 模型部署到微控制器(MCU)时,面临的首要矛盾是:模型精度要求与硬件资源(Flash、RAM、算力)之间的冲突。模型剪枝(Pruning)是解决这一矛盾最有效的模型压缩手段之一。与量化(Quantization)和知识蒸馏(Knowledge Distillation)不同,剪枝直接移除模型中冗余的权重、通道甚至整个层,从根本上减少计算量(MACs)和参数量(Params)。本章将系统梳理剪枝的核心概念:剪枝类型、剪枝粒度以及标准的三阶段剪枝流程,为后续章节中具体评估剪枝前后 MACs 与参数量的变化打下坚实的理论基础。
3.1 剪枝类型:结构化与非结构化的本质区别
3.1.1 核心原理
剪枝类型的划分依据是权重移除后是否破坏原始张量的规则结构。非结构化剪枝(Unstructured Pruning)针对单个权重值进行操作,将绝对值低于阈值的权重置零,产生细粒度的稀疏矩阵。这种剪枝方式在数学上保留了原始矩阵的维度,但矩阵内部大量元素变为0。结构化剪枝(Structured Pruning)则按规则块(如整个通道、整个滤波器或整层)进行移除,直接改变张量的维度形状。
3.1.2 判断方法:如何选择剪枝类型
| 对比维度 | 非结构化剪枝 | 结构化剪枝 |
|---|---|---|
| 粒度 | 单个权重(Weight-level) | 通道/滤波器/层(Channel/Filter/Layer-level) |
| 稀疏模式 | 不规则稀疏(Random Sparsity) | 规则稀疏(Regular Sparsity) |
| MACs 减少 | 理论减少,实际需专用稀疏库 | 直接减少,硬件天然支持 |
| 参数量减少 | 显著(可达90%以上) | 中等(通常30%-70%) |
| 硬件加速 | 需要特殊稀疏推理引擎 | 标准 CNN 加速器直接受益 |
| TinyML 适用性 | 低(MCU 缺乏稀疏计算单元) | 高(CMSIS-NN 等标准库支持) |
实战判断准则:在 TinyML 场景中,如果目标芯片是 ARM Cortex-M 系列(如 STM32、RP2040),优先选择结构化剪枝。因为 CMSIS-NN 和 TensorFlow Lite Micro 的卷积实现是基于密集矩阵运算的,非结构化稀疏矩阵反而会增加索引开销,导致推理速度不升反降。
3.1.3 案例拆解:两种剪枝在 MCU 上的表现差异
假设我们有一个 3×3 卷积层,输入通道 32,输出通道 64,特征图尺寸 16×16。原始 MACs = 3×3×32×64×16×16 = 4,718,592。若采用 50% 稀疏度的非结构化剪枝,参数量减半,但 CMSIS-NN 执行时仍需按密集矩阵计算,MACs 不变。若采用 50% 通道剪枝(输出通道从 64 减至 32),MACs 直接降至 2,359,296,且无需任何特殊库支持。
3.1.4 常见误区与复盘
误区:认为非结构化剪枝的压缩率更高就一定更好。实际上,在 MCU 上非结构化剪枝后的模型文件虽然变小,但推理延迟几乎无改善,甚至因稀疏索引计算而变慢。复盘要点:评估剪枝效果必须同时关注 Params(存储占用) 和 MACs(计算延迟) 两个指标,而非仅看压缩率。
3.2 剪枝粒度:从权重到层的多层级操作
3.2.1 核心原理
剪枝粒度决定了剪枝操作的最小单元。权重级剪枝(Fine-grained)逐个评估权重的重要性;通道级剪枝(Channel-level)评估整个特征图通道的重要性并整体移除;层级剪枝(Layer-level)则直接删除冗余的卷积层或全连接层。粒度的选择直接影响模型的压缩上限和精度恢复难度。
3.2.2 操作流程与判断标准
- 权重级剪枝:计算每个权重的 L1/L2 范数,低于阈值(如 0.01)的置零。适用于全连接层较多的模型。
- 通道级剪枝:对每个通道的输出特征图计算平均激活值或 BN 层缩放因子 γ,γ 接近 0 的通道可移除。适用于 CNN 主干网络。
- 层级剪枝:分析各层对最终精度的贡献度(如通过 Layer-wise Relevance Propagation),删除冗余层。适用于深度较大的网络(如 ResNet 的某些残差块)。
3.2.3 案例拆解:MobileNetV1 的通道剪枝
以 TinyML 常用的 MobileNetV1 为例,其深度可分离卷积中 1×1 逐点卷积占 MACs 的 90% 以上。对逐点卷积进行通道剪枝时,我们关注 BN 层的 γ 参数分布。若某通道的 γ 值小于 0.01,说明该通道输出接近常量,对后续层贡献极小。通过设定剪枝率 30%,将 256 个通道剪至 179 个,模型参数量从 4.2M 降至 2.1M,MACs 从 569M 降至 398M,精度仅下降 0.8%(ImageNet 上从 70.6% 降至 69.8%)。
| 剪枝粒度 | 实现难度 | 精度恢复难度 | 硬件加速收益 | 典型应用层 |
|---|---|---|---|---|
| 权重级 | 低 | 低(微调即可恢复) | 无(需稀疏库) | 全连接层 |
| 通道级 | 中 | 中(需重训) | 高(直接减少 MACs) | 卷积层 |
| 层级 | 高 | 高(可能需知识蒸馏) | 极高(层数减少) | 残差网络 |
3.2.4 常见误区与总结
经验提醒:不要对所有层使用统一的剪枝率。浅层(靠近输入的层)包含更多底层特征(边缘、纹理),剪枝过多会导致精度骤降;深层(靠近输出的层)冗余度更高,可设置更高的剪枝率。建议采用敏感性分析(Sensitivity Analysis)逐层确定剪枝率。
3.3 剪枝流程:训练-剪枝-微调的标准范式
3.3.1 核心原理
标准的剪枝流程包含三个阶段:预训练(Pre-training)、剪枝(Pruning)、微调(Fine-tuning)。预训练阶段让模型充分收敛,学习到鲁棒的特征表示;剪枝阶段根据既定策略移除冗余结构;微调阶段让剩余权重重新适应剪枝后的网络结构,恢复因剪枝造成的精度损失。这一流程通常需要迭代多轮,逐步增加剪枝率。
3.3.2 操作流程清单
# 伪代码:标准剪枝流程
for round in range(num_rounds):
# 阶段1: 预训练(首次迭代)或继续训练(后续迭代)
model.train(train_dataset, epochs=warmup_epochs)
# 阶段2: 剪枝
importance = compute_importance(model) # 如 BN γ、权重范数
mask = generate_mask(importance, pruning_ratio)
model.apply_mask(mask) # 冻结被剪枝的权重/通道
# 阶段3: 微调
model.train(train_dataset, epochs=finetune_epochs, lr=lr*0.1)
# 评估
accuracy = evaluate(model, val_dataset)
if accuracy < target_accuracy:
break # 停止剪枝,回退到上一轮模型
3.3.3 案例拆解:关键词唤醒模型(KWS)的剪枝实战
背景与约束:某智能音箱产品需要将 12 类关键词唤醒模型部署到 Cortex-M4 内核的 MCU 上,Flash 限制 256KB,RAM 限制 64KB,推理延迟要求小于 50ms。原始模型为 4 层卷积 + 2 层全连接,参数量 1.2M,MACs 为 12.8M,Flash 占用 4.8MB,远超限制。
初始现象:直接量化后 Flash 仍达 1.2MB,无法满足要求。
分析判断:通过敏感性分析发现,第 3、4 层卷积的冗余度最高(剪枝 50% 后精度仅下降 0.5%),而第 1 层卷积对精度影响大(剪枝 20% 即下降 3%)。
实际操作步骤:
- 预训练 50 epochs,基线精度 94.2%;
- 第 1 轮剪枝:第 3、4 层剪枝 30%,微调 20 epochs,精度恢复至 93.8%;
- 第 2 轮剪枝:第 3、4 层剪枝至 50%,第 2 层剪枝 20%,微调 30 epochs,精度 93.1%;
- 第 3 轮剪枝:全连接层权重级剪枝 60%,微调 10 epochs,精度 92.7%。
结果对比:最终参数量降至 0.35M(减少 71%),MACs 降至 3.1M(减少 76%),Flash 占用 280KB(量化后),推理延迟 38ms,满足部署要求。
风险与代价:第 2 轮剪枝后出现过拟合现象(验证集精度下降快于训练集),通过增加 dropout 和降低学习率解决。
复盘经验:剪枝率应遵循"浅层小、深层大"的原则;微调学习率应设为初始学习率的 1/10 至 1/100;每轮剪枝后必须验证 MACs 和 Params 的实际减少量,防止某些框架自动填充导致收益缩水。
3.3.4 常见误区与总结
误区一:跳过预训练直接对随机初始化模型剪枝。此时权重尚未学习到有效特征,重要性评估不可靠。误区二:一次性剪枝到位(如直接剪 80%),导致精度崩溃且无法恢复。误区三:忽略微调阶段的学习率调整,使用原学习率导致损失震荡。
总结复盘:剪枝不是一次性的操作,而是一个"训练-剪枝-微调"的迭代优化过程。在 TinyML 场景下,推荐采用渐进式剪枝(Gradual Pruning),每轮增加 10%-20% 的剪枝率,配合短周期微调,既能保证精度,又能实时监控 MACs 与参数量的变化。下一章将深入探讨如何精确计算剪枝前后的 MACs 与参数量,为剪枝决策提供量化依据。