2、稀疏矩阵基础:稀疏性定义、稀疏度计算、常见稀疏模式(结构化/非结构化)及其来源
TinyML 模型在端侧设备上的部署,核心瓶颈之一在于权重与激活值的存储和计算开销。然而,经过剪枝、量化或特定训练策略后,模型中的绝大多数参数变为零值,这为稀疏矩阵表示提供了巨大空间。理解稀疏性的数学定义、量化指标以及稀疏模式的来源,是设计高效存储格式与推理加速方案的前提。本章将系统梳理稀疏矩阵的基础概念,并重点剖析结构化稀疏与非结构化稀疏的本质差异及其在真实模型中的分布规律。
2.1 稀疏性的数学定义与量化指标
在 TinyML 场景中,稀疏矩阵指的是矩阵中绝大多数元素为零值的矩阵。从线性代数角度看,一个 M×N 的矩阵 A,其非零元素个数记为 NNZ(Number of Non-Zero elements)。稀疏度(Sparsity)定义为零值元素占总元素的比例:S = 1 - NNZ/(M×N)。与之对应的密度(Density)为 NNZ/(M×N)。例如,一个 4×4 矩阵中只有 4 个非零元素,则 NNZ=4,总元素=16,稀疏度 S=75%,密度 D=25%。
在实际工程中,仅看稀疏度还不够,还需要关注有效计算密度——即去除零值后,实际参与乘加运算(MAC)的元素比例。因为某些存储格式虽然压缩了存储,但计算时仍需遍历索引结构,导致有效计算密度低于理论稀疏度。此外,压缩比(原始存储字节数/压缩后字节数)是衡量存储收益的直接指标,它与稀疏度、索引开销、对齐填充等因素相关。
| 指标 | 公式 | 典型值(TinyML) | 说明 |
|---|---|---|---|
| 稀疏度 S | 1 - NNZ/(M×N) | 70%~95% | 剪枝后常见范围 |
| 密度 D | NNZ/(M×N) | 5%~30% | 与 S 互补 |
| 压缩比 CR | 原始字节/压缩字节 | 2×~10× | 受索引开销影响 |
| 有效 MAC 密度 | 实际 MAC/理论 MAC | 与硬件支持相关 | 结构化稀疏更高 |
2.2 结构化稀疏与非结构化稀疏的本质区别
稀疏模式决定了零值在矩阵中的分布规律,直接影响存储格式选择和硬件加速策略。非结构化稀疏(Unstructured Sparsity)指零值随机散布在矩阵中,没有明显的行、列或块规律。这种稀疏通常由细粒度剪枝(如权重级剪枝)产生,虽然稀疏度可以很高,但需要额外的索引记录非零元素位置,且难以利用 SIMD(单指令多数据)或向量化指令进行批量跳过。
结构化稀疏(Structured Sparsity)则具有明显的几何规律,常见形式包括:通道稀疏(整个通道被剪掉)、块稀疏(固定大小的连续块被保留或丢弃)、N:M 稀疏(每 M 个连续元素中恰好有 N 个非零)。结构化稀疏的最大优势在于,硬件可以按块或按通道跳过零值区域,无需逐元素判断,从而大幅提升有效计算密度。
- 非结构化稀疏:零值位置随机,存储需记录每个非零元素的行列坐标(如 COO 格式)或行偏移+列索引(如 CSR 格式)。计算时需逐元素判断,控制开销大。
- 结构化稀疏:零值位置有规律,存储可仅记录块索引或通道掩码。计算时可按块跳过,控制开销小,适合硬件流水线。
- 半结构化稀疏:介于两者之间,如按行或按列剪枝,但行内仍有随机性。通常采用混合存储策略。
2.3 稀疏模式的来源:从训练到部署
稀疏性并非天然存在,而是通过特定方法人为引入或自然产生的。在 TinyML 工作流中,稀疏模式主要来自以下四个途径:
- 剪枝(Pruning):训练后或训练中移除权重值较小的连接。细粒度剪枝产生非结构化稀疏;通道剪枝、块剪枝产生结构化稀疏。例如,对 MobileNetV2 的深度可分离卷积层进行通道剪枝,可得到通道级稀疏。
- 激活函数:ReLU 及其变体将负值置零,导致激活值矩阵天然稀疏。在推理时,ReLU 后的特征图通常有 40%~60% 的零值,且分布与输入相关,属于动态非结构化稀疏。
- 量化归零:将浮点权重量化为 int8 或 int4 时,绝对值小于量化步长的值会被舍入为零。这种归零通常产生非结构化稀疏,但若配合剪枝则可能形成块状稀疏。
- 梯度稀疏(训练阶段):在联邦学习或分布式训练中,梯度交换时只传输大于阈值的梯度,产生稀疏梯度矩阵。这属于工程上的稀疏化,而非模型权重稀疏。
2.4 案例拆解:MobileNetV1 的稀疏模式分析
为更直观地理解不同稀疏模式的来源与影响,我们以 MobileNetV1 在 ImageNet 上的剪枝实验为例进行拆解。该模型主要由 1×1 卷积(逐点卷积)和 3×3 深度卷积组成,参数量约 420 万。
实验设置:采用 L1 范数剪枝,分别进行细粒度剪枝(权重级)和通道剪枝。目标稀疏度均为 75%。在细粒度剪枝中,保留每层权重绝对值最大的 25%;在通道剪枝中,按通道 L1 范数排序,移除贡献最小的 75% 通道。
结果对比:
| 指标 | 细粒度剪枝(非结构化) | 通道剪枝(结构化) |
|---|---|---|
| 实际稀疏度 | 75% | 75% |
| Top-1 精度损失 | 0.8% | 2.1% |
| 存储压缩比(CSR) | 3.2× | 3.8×(仅需通道掩码) |
| 推理加速(Cortex-M7) | 1.4× | 2.9× |
| 额外索引开销 | 每元素 2~4 字节 | 每通道 1 bit |
分析:细粒度剪枝虽然精度损失小,但在 Cortex-M7 这类无向量扩展的 MCU 上,由于需要逐元素判断零值并读取索引,实际加速仅 1.4 倍。而通道剪枝虽然精度损失较大,但硬件可以跳过整个通道的计算,加速效果显著。后续通过知识蒸馏将通道剪枝模型的精度损失从 2.1% 降至 1.2%,同时保持 2.9 倍加速。
复盘经验:在 TinyML 场景中,结构化稀疏的硬件收益远大于非结构化稀疏。如果目标设备是 MCU 或 DSP,建议优先考虑通道剪枝或块剪枝;如果目标设备是带有稀疏加速单元的 NPU,则细粒度剪枝也能获得较好加速。此外,剪枝后必须进行微调(Fine-tuning)以恢复精度,且微调时建议保持稀疏掩码固定。
2.5 常见误区与设计要点
在稀疏矩阵的实际应用中,工程师常陷入以下误区:
- 误区一:稀疏度越高越好。当稀疏度超过 95% 时,索引开销和负载不均衡问题会急剧增加,实际收益可能下降。建议根据硬件能力选择目标稀疏度。
- 误区二:所有稀疏模式都适合 CSR。CSR 适合非结构化稀疏,但对于块稀疏或通道稀疏,使用块压缩(BCSR)或通道掩码更高效。
- 误区三:忽略负载均衡。在并行计算中,如果各处理单元分配到的非零元素数量差异过大,会导致计算单元闲置。结构化稀疏更容易实现负载均衡。
- 误区四:激活值稀疏不可利用。虽然激活稀疏是动态的,但可以通过预测或运行时检测,在 ReLU 后跳过全零通道或块,这在图像分类任务中可节省 20%~40% 的计算量。
综上所述,稀疏矩阵的基础概念是 TinyML 高效推理的基石。稀疏度量化了压缩潜力,而稀疏模式决定了硬件加速的上限。在实际工程中,应结合目标设备的计算特性,选择合适的稀疏引入方式和存储格式,才能最大化推理收益。