3、模型压缩概览:剪枝、量化、知识蒸馏、低秩分解等主流方法
TinyML 的核心挑战在于:如何在资源极度受限的微控制器(MCU)上部署原本为服务器设计的深度学习模型。模型压缩正是解决这一矛盾的关键技术集合。本章将系统梳理四种主流压缩方法——剪枝、量化、知识蒸馏与低秩分解,从原理、操作流程到实战场景逐一拆解,帮助你在精度与资源占用之间找到最佳平衡点。理解这些方法的本质差异与适用边界,是后续进行误差分析与回归测试的基础。
3.1 剪枝:从结构上消除冗余
核心原理:剪枝的核心假设是神经网络中存在大量冗余参数,移除这些参数不会显著影响模型表达能力。根据粒度不同,剪枝可分为非结构化剪枝(移除单个权重)和结构化剪枝(移除整个通道、滤波器或层)。非结构化剪枝能获得更高的压缩率,但产生的稀疏矩阵在通用硬件上难以获得实际加速;结构化剪枝则能直接减少计算量和内存占用,更适合 TinyML 场景。
操作流程:典型剪枝流程包括以下步骤:
- 训练基准模型:先训练一个精度达标的完整模型作为剪枝起点。
- 重要性评估:计算每个权重或通道的重要性分数,常用指标包括权重绝对值、梯度幅度、BN 层缩放因子等。
- 剪枝执行:按重要性分数从低到高移除指定比例的参数。
- 微调恢复:在原始数据集上对剪枝后的模型进行少量 epoch 的微调,恢复精度损失。
- 迭代剪枝:重复步骤 2-4,逐步增加剪枝比例,直到精度下降超过阈值。
| 剪枝类型 | 粒度 | 压缩效果 | 硬件加速 | TinyML 适用性 |
|---|---|---|---|---|
| 非结构化剪枝 | 单个权重 | 高(可达 90%+) | 差(需稀疏计算库) | 低(MCU 不支持) |
| 通道剪枝 | 整个通道 | 中高(50%-70%) | 好(直接减少计算量) | 高(推荐) |
| 层剪枝 | 整层 | 中(20%-40%) | 好 | 中(需评估层重要性) |
3.2 量化:用更少的比特表示数值
核心原理:量化将浮点权重和激活从 FP32 映射到低比特表示(如 INT8、INT16 或甚至 INT4)。其数学基础是仿射变换:q = round(r / scale) + zero_point,其中 r 为浮点值,scale 为缩放因子,zero_point 为零点偏移。量化误差主要来源于舍入误差和裁剪误差,合理的校准策略能显著降低精度损失。
三种量化方案对比:
- 训练后量化(PTQ):无需重新训练,仅需少量校准数据确定量化参数。实现简单,但精度损失相对较大。
- 量化感知训练(QAT):在训练过程中模拟量化误差,让模型自适应低比特表示。精度保持最好,但需要完整训练流程。
- 动态量化:权重离线量化,激活在线量化。适合 LSTM/Transformer 等结构,但 MCU 上实现复杂度较高。
案例拆解:在 Cortex-M4 内核的 nRF52840 上部署图像分类模型 MobileNetV1。原始 FP32 模型大小 16MB,推理延迟 2.3s。采用 INT8 PTQ 后,模型大小降至 4MB,延迟降至 580ms,Top-1 精度从 70.4% 降至 68.9%。进一步采用 QAT 后,精度恢复至 69.8%,但训练时间增加了 3 天(在 GPU 服务器上)。最终选择 QAT 方案,因为精度损失控制在 1% 以内,且 4MB 的 Flash 占用满足板载资源限制。
3.3 知识蒸馏:让大模型教小模型
核心原理:知识蒸馏(KD)通过让小型学生模型学习大型教师模型的输出分布,而非仅学习硬标签,从而迁移"暗知识"——包括类别间相似性、特征表示等丰富信息。其核心是软标签损失函数:L = α * L_hard + (1-α) * L_soft,其中软标签使用温度参数 T 软化概率分布:p_i = exp(z_i/T) / Σ_j exp(z_j/T)。
关键设计决策:
- 温度 T 的选择:T 越大,软标签分布越平滑,能提供更多类别间关系信息。常用范围 3-10,需通过实验调优。
- 损失权重 α:平衡硬标签与软标签的贡献,通常 α 在 0.7-0.9 之间。
- 教师模型选择:教师模型应显著强于学生模型,否则蒸馏收益有限。
- 特征蒸馏:除输出层外,还可匹配中间层特征图,进一步提升学生模型表达能力。
| 蒸馏类型 | 匹配对象 | 实现复杂度 | 效果提升 |
|---|---|---|---|
| 输出蒸馏 | Softmax 输出 | 低 | 中等 |
| 特征蒸馏 | 中间层特征图 | 中 | 较高 |
| 关系蒸馏 | 样本间关系 | 高 | 高(小数据集) |
3.4 低秩分解:用矩阵分解压缩权重
核心原理:低秩分解基于矩阵秩的数学性质,将高维权重矩阵 W(m×n)近似分解为两个低秩矩阵的乘积:W ≈ U·V,其中 U 为 m×r,V 为 r×n,且 r << min(m,n)。这样参数量从 m×n 降至 r×(m+n),当 r 远小于 m 和 n 时,压缩效果显著。全连接层和卷积层均可应用此方法。
操作流程:
- 权重矩阵提取:从训练好的模型中提取目标层的权重矩阵。
- SVD 分解:对权重矩阵进行奇异值分解,得到 U、S、V 三个矩阵。
- 秩选择:根据奇异值分布确定保留的秩 r,通常保留前 r 个最大奇异值,使能量保留比例达到 95%-99%。
- 重构与微调:用 U·S_r·V 近似原矩阵,替换原层后进行微调。
案例拆解:在 Raspberry Pi Pico(RP2040)上部署语音命令识别模型。模型包含 3 个全连接层(权重矩阵分别为 256×256、256×128、128×32),总参数量 96K。对第一层进行 SVD 分解,奇异值分布显示前 64 个奇异值贡献了 97% 的能量,故取 r=64。分解后参数量降至 64×(256+256)=32K,压缩率 66.7%。模型大小从 384KB 降至 128KB,推理延迟从 45ms 降至 28ms,精度从 92.5% 降至 91.8%,微调 5 个 epoch 后恢复至 92.1%。
3.5 方法对比与选型策略
| 方法 | 压缩率 | 精度保持 | 硬件友好度 | 实现成本 | 适用场景 |
|---|---|---|---|---|---|
| 剪枝(结构化) | 2-4× | 良好 | 高 | 中 | CNN 为主,MCU 推理 |
| 量化(INT8) | 4× | 优秀 | 极高 | 低 | 几乎所有模型 |
| 知识蒸馏 | 5-10× | 优秀 | 高 | 高(需训练教师) | 有预训练大模型 |
| 低秩分解 | 2-3× | 良好 | 中 | 低 | 全连接层为主 |
组合策略建议:实际 TinyML 项目通常组合使用多种方法。推荐流程为:先进行知识蒸馏(从大模型获得紧凑模型),再应用结构化剪枝(去除冗余通道),最后进行量化(INT8 或混合精度)。此组合可在保持精度的同时实现 10-20 倍压缩。但需注意:每种方法引入的误差会累积,因此每步后都应进行误差评估,确保累计精度损失在可接受范围内。