3、模型稀疏化基础:权重稀疏、激活稀疏、结构化稀疏与非结构化稀疏
TinyML 模型部署到微控制器(MCU)时,最稀缺的资源通常是 Flash(存放权重)和 RAM(存放中间激活值)。模型稀疏化正是针对这两类存储瓶颈的核心手段:通过制造大量零值,让模型在存储和计算时跳过无效数据,从而显著压缩文件体积并降低推理功耗。本章将系统梳理稀疏化的四个基本维度——权重稀疏、激活稀疏、结构化稀疏与非结构化稀疏,厘清它们各自的原理、适用场景与工程代价,为后续章节的剪枝、量化与编码压缩打下概念基础。
上图展示了本章的核心框架:模型稀疏化从对象上分为权重稀疏与激活稀疏,从组织形态上分为非结构化稀疏与结构化稀疏。两条维度相互交叉,例如“非结构化权重稀疏”是最常见的剪枝结果,而“结构化激活稀疏”则较少单独讨论。下面逐一展开。
3.1 权重稀疏:静态压缩的主要来源
核心原理
权重稀疏指的是在训练完成后(或训练过程中),将神经网络中一部分权重参数直接置为 0。由于这些零值不再携带有效信息,在存储时可以通过稀疏编码(如 CSR、CSC 或位图)大幅减少文件体积;在推理时,零值对应的乘法累加运算(MAC)可以被跳过,从而降低计算延迟和功耗。权重稀疏的粒度可以从单个元素到整个卷积核不等,粒度越细,理论上压缩率越高,但索引开销也越大。
判断方法与操作流程
判断一个权重张量是否适合稀疏化,通常看两个指标:权重分布和稀疏率。权重分布接近拉普拉斯分布或高斯分布且大量数值接近 0 时,剪枝后精度损失较小。操作流程一般如下:
- 训练基准模型:先训练一个精度达标的稠密模型,记录其验证精度作为基线。
- 剪枝策略选择:按绝对值大小剪枝(magnitude pruning)、按梯度贡献剪枝或按 Hessian 信息剪枝。
- 迭代剪枝与微调:每剪掉一定比例(如 10%~20%)后微调几个 epoch,恢复精度。
- 稀疏率评估:在验证集上测试精度,找到精度下降可接受范围内的最大稀疏率。
- 编码与存储:将稀疏权重转换为稀疏格式,计算实际文件大小。
案例拆解:8 倍压缩的 Keyword Spotting 模型
某智能语音设备团队需要将 200KB 的 KWS 模型压缩到 30KB 以内以适配 32KB Flash 的 MCU。初始模型为 3 层卷积 + 2 层全连接,权重分布显示大量全连接层参数集中在 ±0.05 附近。团队采用 magnitude pruning,以 5% 步长从 10% 剪到 70%,每步微调 3 个 epoch。结果发现:卷积层剪到 50% 时精度下降 1.2%,全连接层剪到 85% 时精度下降 2.8%。最终选择卷积层 50% + 全连接层 80% 的混合稀疏率,整体稀疏率 72%,使用 CSR 编码后文件从 200KB 降至 31KB,精度损失 3.1%,满足唤醒词 95% 准确率要求。代价是推理时需额外解析索引,单次推理时间增加 0.8ms,但整体功耗下降 22%。
3.2 激活稀疏:动态节省 RAM 与算力
核心原理
激活稀疏是指神经网络中间层的输出特征图中,大量数值为 0。这种现象通常由 ReLU 激活函数天然产生——负输入被截断为 0。与权重稀疏不同,激活稀疏是输入相关的动态稀疏:同一模型处理不同输入时,零值的位置和比例都不同。激活稀疏的价值在于:推理时如果检测到某通道或某块激活全为 0,可以跳过后续对应通道的计算;同时,稀疏激活图可以用压缩格式存储在 RAM 中,降低峰值内存占用。
判断方法与操作流程
评估激活稀疏潜力,需要统计代表性输入集上的激活零值比例。操作流程:
- 收集代表性输入:从验证集或实际部署场景中采样 100~1000 个样本。
- 逐层统计:在推理时记录每层输出的零值比例,绘制稀疏度热力图。
- 识别高稀疏层:通常浅层卷积稀疏度较低(10%~30%),深层和全连接层较高(50%~90%)。
- 设计跳过逻辑:对稀疏度超过 70% 的层,考虑使用稀疏卷积或跳过全零通道。
实战场景:MCU 上的实时音频分类
一个 1D 卷积音频分类模型在 Cortex-M4 上运行,RAM 预算仅 16KB。原始模型第 2 层卷积输出 32 通道 × 64 帧,需 8KB RAM。通过统计发现,实际推理时平均 68% 的激活值为 0,但分布极不均匀——部分帧全零,部分帧密集。团队实现了一个简单的“稀疏行存储”方案:只存储非零行及其行号,RAM 占用降至 3.2KB。同时,由于跳过全零行的 MAC 运算,推理时间从 45ms 降至 28ms。代价是代码复杂度增加,且最坏情况(输入全是噪声)下 RAM 占用仍可能达到 7.5KB,因此保留了 1KB 的余量。
3.3 非结构化稀疏:高压缩率与索引开销的权衡
核心原理
非结构化稀疏(也叫细粒度稀疏)是指零值在权重矩阵中随机分布,没有固定模式。这种稀疏方式最容易达到高稀疏率,因为剪枝时每个权重独立判断。但代价是存储时需要用额外的数据结构记录非零值的位置。常用的编码格式包括 CSR(Compressed Sparse Row)、CSC(Compressed Sparse Column)和位图(bitmap)。以 CSR 为例,对于稀疏率 75% 的 4×4 矩阵,需要存储 4 个非零值、4 个列索引和 5 个行偏移,总存储量约为稠密的 60%,压缩收益有限;当稀疏率达到 90% 以上时,压缩比才显著。
判断方法与操作流程
判断是否适合非结构化稀疏,主要看目标硬件是否支持不规则内存访问。如果 MCU 没有缓存或缓存极小,随机访问索引会导致大量 cache miss,反而更慢。操作上,需要对比三种编码格式的存储效率:
| 编码格式 | 存储开销(稀疏率 s) | 访问模式 | 适用场景 |
|---|---|---|---|
| CSR | 2×nnz + rows+1 | 行顺序访问 | 全连接层、行优先存储 |
| CSC | 2×nnz + cols+1 | 列顺序访问 | 卷积权重、列优先存储 |
| 位图 | N/8 + nnz×sizeof(T) | 随机访问 | 稀疏率极高(>90%)且值分布均匀 |
案例拆解:CSR 与位图在 2D 卷积中的对比
某视觉唤醒模型最后一层卷积权重为 3×3×64×64,共 36,864 个参数。剪枝后稀疏率 85%,非零值 5,530 个。使用 CSR 编码:存储 5,530 个 float(22,120B)+ 5,530 个 uint16 索引(11,060B)+ 64 行偏移(128B),总计 33,308B,压缩比 2.26 倍。使用位图编码:位图 36,864/8=4,608B + 非零值 22,120B,总计 26,728B,压缩比 2.76 倍。但位图在推理时需要逐位检查,MCU 上每 32 位可并行检查,实际速度比 CSR 快 15%。最终选择位图方案,代价是稀疏率低于 80% 时位图反而比稠密存储更大。
3.4 结构化稀疏:硬件友好的规则模式
核心原理
结构化稀疏(也叫粗粒度稀疏)将剪枝单位从单个权重提升到块(block)、通道(channel)、核(kernel)甚至整个滤波器。其核心优势是:零值排列规则,无需额外索引即可跳过计算,且能充分利用 MCU 的 SIMD 指令或 DMA 传输。常见的结构化模式包括:通道剪枝(删除整个输出通道)、核剪枝(删除 3×3 卷积核中的某个 2×2 子块)、向量剪枝(按 4 或 8 个连续权重为一组剪枝)。
判断方法与操作流程
选择结构化稀疏的粒度,需要平衡压缩率与硬件效率。操作流程:
- 硬件能力评估:确认 MCU 是否支持 SIMD(如 Cortex-M4 的 SIMD 指令一次处理 4 个 int16)。
- 粒度选择:若支持 4 路 SIMD,优先按 4 元素向量剪枝;若使用 DMA,优先按通道剪枝。
- 重训与微调:结构化剪枝后必须重训,因为删除整个通道会改变网络结构。
- 性能验证:在真实硬件上测量推理时间和 Flash 占用,而非仅看理论压缩率。
实战场景:Cortex-M7 上的图像分类
一个 MobileNetV1 风格的模型在 Cortex-M7(支持 SIMD)上部署,原始 Flash 占用 480KB。团队采用通道剪枝:对每个卷积层计算各通道的 L2 范数,删除范数最小的 30% 通道。重训 10 个 epoch 后精度从 91.2% 降至 89.5%。由于通道剪枝后每层输出通道数变为原来的 70%,后续层的输入通道也相应减少,整体 MAC 运算量下降 51%。Flash 占用降至 210KB,推理时间从 120ms 降至 58ms。关键收益是:无需任何索引解析,代码路径与稠密模型完全一致,只是循环边界改变。
3.5 常见误区与工程复盘
误区一:混淆“稀疏率”与“文件压缩率”
稀疏率 90% 并不意味着文件缩小 90%。编码格式、索引类型、对齐填充都会影响最终大小。例如,一个 128×128 的权重矩阵稀疏率 90%,用 CSR 存储时,非零值 1,638 个,索引 1,638 个 uint16,行偏移 129 个,总计约 6.5KB,而原始稠密为 64KB,实际压缩比约 9.8 倍,接近理论值。但如果稀疏率只有 70%,CSR 存储约 19.5KB,压缩比仅 3.3 倍,远低于 70% 的直觉预期。
误区二:忽略激活稀疏的“最坏情况”
激活稀疏是动态的,不能只按平均稀疏度设计 RAM。某团队按平均 60% 稀疏度分配缓冲区,结果在噪声输入下稀疏度骤降至 20%,导致内存溢出。正确做法是统计 P95 或 P99 稀疏度,并预留 20% 余量。
误区三:在无硬件加速的 MCU 上强行使用非结构化稀疏
如果 MCU 没有缓存且内存总线宽度只有 16 位,非结构化稀疏的随机访问会导致每次读取都浪费总线周期。实测表明,在无缓存 MCU 上,稀疏率 80% 的非结构化模型比稠密模型慢 15%,因为索引解析和跳转开销超过了计算节省。
复盘清单
- 剪枝前先测量权重分布,确认是否存在大量接近 0 的值。
- 用目标编码格式(CSR/位图/通道剪枝)估算实际文件大小,而非仅看稀疏率。
- 激活稀疏必须用真实部署数据验证,并考虑最坏情况。
- 结构化稀疏优先选择与硬件 SIMD 宽度匹配的粒度(如 4、8、16)。
- 每次剪枝后记录精度、文件大小、推理时间三个指标,绘制权衡曲线。