4. 模型压缩基础
TinyML 的核心矛盾在于:模型精度通常随参数量和计算量增长而提升,但 MCU 的 Flash、SRAM、算力与功耗预算极其有限。模型压缩不是单一技巧,而是一组从“参数数量、数值位宽、知识表示、矩阵秩”四个维度削减模型成本的方法。理解它们的原理与适用边界,才能在给定硬件约束下选择正确的组合策略。
剪枝——减少“有多少参数在参与计算”;
量化——降低“每个参数占多少位”;
知识蒸馏——用大模型的知识指导小模型训练;
低秩分解——用更少的基向量近似原权重矩阵。
一、剪枝:去掉冗余连接
剪枝基于一个观察:深度网络中大量权重接近零,对输出贡献很小。剪枝通过移除这些权重或整个通道,降低参数量和计算量。常见做法是先训练一个较大模型,再按权重绝对值、通道范数或梯度敏感度排序,逐步剪除低重要性部分,最后微调恢复精度。
剪枝分为非结构化剪枝与结构化剪枝。非结构化剪枝把单个权重置零,压缩率高,但产生稀疏矩阵,通用 MCU 没有稀疏加速指令,实际推理速度未必提升,反而可能因索引开销变慢。结构化剪枝直接删除整个卷积核、通道或层,得到规整的小模型,能真实减少计算量,是 TinyML 更实用的选择。
# 结构化剪枝示意(按通道L2范数排序)
for layer in model.conv_layers:
scores = l2_norm(layer.weight, dim=[1,2,3])
keep = topk_indices(scores, ratio=0.7)
layer.weight = layer.weight[keep]
next_layer.weight = next_layer.weight[:, keep]
剪枝的适用性:适合参数量大、冗余度高的模型;对已经很小、每层都关键的模型收益有限。剪枝后必须重新评估精度与延迟,不能只看参数量下降。
二、量化:降低数值位宽
量化把 FP32 权重和激活映射到 INT8、INT4 甚至二值。它同时压缩模型体积、减少内存带宽、并让 MCU 使用整数乘加指令,通常带来数倍加速。TinyML 最常用的是训练后量化(PTQ)和量化感知训练(QAT)。
PTQ 只需校准数据统计激活范围,流程简单;QAT 在训练中插入伪量化节点,让模型适应量化误差,精度更稳。量化公式可表示为:
q = round(x / scale) + zero_point
x_approx = (q - zero_point) * scale
其中 scale 和 zero_point 由校准集的最小最大值或移动平均确定。INT8 通常精度损失小于 1%,INT4 需要更精细的逐通道量化与 QAT。量化对 TinyML 的适用性最高,几乎是默认选项,但要注意激活动态范围大的层(如 Softmax 前)容易掉点。
三、知识蒸馏:让小模型学会大模型的“软标签”
知识蒸馏不直接压缩已有模型,而是训练一个小型学生模型去模仿大型教师模型的输出分布。教师输出的软标签包含类别间相似性信息,比硬标签提供更丰富的监督信号。损失函数通常由蒸馏损失和真实标签损失加权组成:
loss = alpha * CE(student_logits, hard_label)
+ (1 - alpha) * T^2 * KL(student_soft, teacher_soft)
温度 T 用于平滑教师分布,alpha 控制两者权重。蒸馏的适用性在于:当目标任务数据充足、允许重新训练时,它能显著提升小模型精度;但它不减少已有模型的体积,必须与剪枝、量化配合使用。对 MCU 部署而言,蒸馏是“训练阶段”的压缩手段,推理阶段无额外开销。
四、低秩分解:用矩阵分解近似权重
低秩分解假设权重矩阵存在低秩结构,可用两个小矩阵相乘近似。例如全连接层 W(m×n)分解为 U(m×r)和 V(r×n),r 远小于 m、n。卷积层可分解为深度可分离卷积或张量分解。参数量从 m×n 降到 r(m+n),当 r 较小时压缩明显。
低秩分解适合权重矩阵维度大、秩低的层,如全连接分类头。对已经使用深度可分离卷积的轻量模型,进一步低秩分解收益有限,且分解后可能引入额外算子,需评估实际延迟。
五、四种方法的对比与TinyML适用性
| 方法 | 压缩对象 | 典型压缩率 | 是否需重训练 | TinyML适用性 |
|---|---|---|---|---|
| 结构化剪枝 | 通道/卷积核 | 2~4× | 需要微调 | 高,直接减少计算量 |
| 非结构化剪枝 | 单个权重 | 5~10× | 需要微调 | 低,稀疏无加速 |
| INT8量化 | 数值位宽 | 4× | PTQ可免,QAT需 | 极高,默认选项 |
| INT4量化 | 数值位宽 | 8× | 通常需QAT | 中高,需验证精度 |
| 知识蒸馏 | 知识表示 | 不直接压缩 | 需要 | 高,提升小模型精度 |
| 低秩分解 | 矩阵秩 | 2~5× | 需要微调 | 中,适合大矩阵层 |
六、组合策略与常见误区
实际 TinyML 项目很少只用一种方法。典型流水线是:先训练教师模型,用知识蒸馏训练小模型,再做结构化剪枝,最后 INT8 量化并部署。顺序很重要:先剪枝后量化通常比先量化后剪枝更稳,因为量化后的离散权重难以再判断重要性。
1. 只看参数量下降,不看实际推理延迟;
2. 对已经很小的模型强行高比例剪枝,导致精度崩塌;
3. 忽略量化校准集分布,导致部署后精度骤降;
4. 把知识蒸馏当成压缩手段,却未配合剪枝量化;
5. 低秩分解后引入额外算子,反而增加推理时间。
复盘时建议建立“压缩-精度-延迟-内存”四维记录表,每做一步压缩都重新测量。只有同时满足精度阈值与硬件预算的方案,才是可部署的方案。