4、稀疏化训练原理:权重剪枝、掩码机制、梯度更新与稀疏正则化方法
TinyML 模型部署在微控制器(MCU)上时,面临 Flash 容量(通常 256KB~1MB)和 RAM(通常 64KB~512KB)的硬性约束。稀疏化训练的核心目标,是在训练阶段就让模型权重产生大量零值,从而利用 CSR(Compressed Sparse Row)或 Bitmask 等格式压缩存储,并跳过零值乘加运算以降低推理延迟。本章从权重剪枝的数学本质出发,深入剖析掩码机制如何与反向传播协同工作,并对比 L1 正则化、硬阈值正则化(HTR)与 ADMM 三种主流稀疏正则化方法的适用场景。
上图展示了稀疏化训练的整体框架。训练阶段维护权重矩阵 W 和二进制掩码矩阵 M(0/1),前向传播计算 W⊙M(逐元素相乘);剪枝决策阶段根据阈值或目标稀疏度更新 M;推理阶段则利用稀疏格式存储和计算。反向传播时,梯度仅通过 M=1 的位置回传,M=0 的位置梯度被屏蔽,这是掩码机制的核心。
4.1 权重剪枝的数学本质与粒度选择
权重剪枝的本质是寻找一个稀疏权重矩阵 Ws,使其与原始稠密矩阵 W 在某个范数意义下误差最小:min ||W - Ws||F,同时满足 ||Ws||0 ≤ k(k 为目标非零元素个数)。实际工程中,我们通常不直接求解这个 NP-hard 问题,而是采用贪心策略:按绝对值大小排序,保留 Top-k 个权重,其余置零。
剪枝粒度直接影响压缩率和硬件效率:
- 非结构化剪枝(细粒度):每个权重独立判断是否剪掉。压缩率最高,但产生的稀疏模式不规则,MCU 上需要查表或位图索引,可能引入额外寻址开销。
- 通道剪枝(粗粒度):整个卷积核或全连接层的一整列/行被移除。硬件实现简单,但精度损失较大,通常需要配合重训练。
- 块状剪枝(N:M 模式):每 M 个连续权重中保留 N 个(如 2:4)。NVIDIA 的 Ampere 架构和部分 MCU DSP 扩展支持这种模式,兼顾压缩率和规则性。
对于 TinyML 场景,推荐 2:4 块状剪枝或 4:8 模式,因为 Cortex-M 系列内核的 SIMD 指令可以高效处理这类规则稀疏模式,避免逐元素分支判断。
4.2 掩码机制:前向传播与反向传播的协同
掩码机制是稀疏化训练的核心工程实现。训练过程中,我们维护一个与权重同形状的二进制张量 M,其更新规则如下:
# 伪代码:每 T 个 epoch 更新一次掩码
def update_mask(weights, target_sparsity, T):
if epoch % T == 0:
threshold = torch.quantile(torch.abs(weights), target_sparsity)
mask = (torch.abs(weights) > threshold).float()
return mask
# 前向传播
output = torch.mul(weights, mask) # 或 weights * mask
# 反向传播(关键:梯度直通)
grad_weights = grad_output * input # 正常计算梯度
grad_weights = grad_weights * mask # 屏蔽被剪枝位置的梯度
这里有一个关键设计决策:被剪枝的权重是否允许在后续训练中“复活”? 有两种策略:
- 硬掩码(冻结):一旦 M=0,该权重永远不再参与前向和反向。优点是训练稳定,但可能错过最优解。
- 软掩码(允许复活):每次掩码更新时重新计算所有权重的绝对值,之前被剪掉的权重如果重新变大,可以恢复为 1。这需要保留完整的权重值(而非直接置零),仅在推理时压缩。
工程实践中,软掩码策略在 TinyML 中更常用,因为训练阶段 Flash/RAM 充足,可以保留完整精度权重;推理阶段再根据最终掩码生成稀疏模型。但要注意,软掩码需要额外的内存存储完整权重,训练时的内存峰值会略高。
4.3 稀疏正则化方法:从 L1 到 ADMM
掩码机制解决了“如何剪”的问题,而稀疏正则化解决“如何让权重自然趋向于零”的问题。三种主流方法各有优劣:
| 方法 | 数学形式 | 稀疏度控制 | 收敛速度 | 适用场景 |
|---|---|---|---|---|
| L1 正则化 | Loss + λ∑|w| | 间接(通过 λ 调节) | 慢(需要长时间训练) | 小模型、精度要求不高的场景 |
| 硬阈值正则化(HTR) | 每 T 步 Top-K 剪枝 | 直接(精确控制稀疏度) | 快(立即生效) | 大多数 TinyML 场景,推荐 |
| ADMM | 增广拉格朗日 + 投影 | 精确(硬约束) | 中(需要交替优化) | 对稀疏度有严格要求的场景 |
L1 正则化的梯度更新公式为:w ← w - η(∂L/∂w + λ·sign(w))。它会让所有权重以恒定速率向零收缩,但小权重收缩快、大权重收缩慢,最终产生自然的稀疏分布。缺点是 λ 需要仔细调参,且训练时间较长。
硬阈值正则化(HTR)是最直接的方法:每 T 个 epoch,将绝对值最小的 k 个权重置零。其变体包括:
- 渐进剪枝:从稀疏度 0 开始,每 T 步增加 Δs,直到目标稀疏度。避免一次性大幅剪枝导致精度崩溃。
- 自动学习率调整:剪枝后模型容量下降,需要降低学习率(通常乘以 0.1~0.5)以稳定训练。
ADMM(交替方向乘子法)将稀疏约束转化为:min f(W) + g(Z),s.t. W=Z,其中 g(Z) 是指示函数(Z 满足稀疏度约束时为 0,否则为 ∞)。通过增广拉格朗日乘子迭代求解。ADMM 的优点是能精确满足稀疏度约束,但需要额外维护对偶变量,内存开销增加约 30%,在 MCU 训练(如果有)时需谨慎。
4.4 案例拆解:关键词唤醒模型(KWS)的稀疏化训练
我们为一个 10 类关键词唤醒任务训练 CNN 模型,原始模型参数量 180K,部署在 Cortex-M4 上(Flash 256KB,RAM 64KB)。初始模型大小 720KB(FP32),远超 Flash 限制。
初始目标:将模型压缩到 100KB 以内,同时保持准确率下降不超过 2%。
训练配置:
- 数据集:Google Speech Commands v2(35K 条 1 秒音频)
- 基线准确率:94.2%
- 稀疏化策略:渐进 HTR,从第 10 个 epoch 开始,每 5 epoch 增加 10% 稀疏度,目标稀疏度 85%
- 掩码策略:软掩码,允许权重复活
- 学习率:初始 0.001,每 10 epoch 衰减 0.5
训练过程关键指标:
| Epoch | 稀疏度 | 验证准确率 | 损失值 | 备注 |
|---|---|---|---|---|
| 10 | 0% | 93.8% | 0.21 | 开始剪枝 |
| 15 | 10% | 93.5% | 0.23 | 轻微下降 |
| 25 | 50% | 92.9% | 0.27 | 下降 0.9% |
| 35 | 80% | 92.1% | 0.32 | 下降 1.7% |
| 40 | 85% | 91.8% | 0.35 | 最终结果 |
分析判断:在稀疏度 50% 之前,准确率下降平缓(<0.5%);超过 70% 后,每增加 5% 稀疏度,准确率下降约 0.3%。最终 85% 稀疏度时准确率 91.8%,下降 2.4%,略超目标。我们采取两个补救措施:
- 对最后两层全连接层降低剪枝力度(目标稀疏度 70%),因为靠近输出的层对分类边界更敏感。
- 增加 5 个 epoch 的微调,学习率降至 0.0001,仅更新未被剪枝的权重。
结果对比:调整后准确率回升至 92.5%,模型大小从 720KB 压缩至 108KB(CSR 格式),Flash 占用满足要求。推理时间从 12.3ms 降至 4.1ms(跳过零值 MAC),RAM 占用从 48KB 降至 22KB。
风险与代价:训练时间增加了约 40%(因为需要多次掩码更新和微调);CSR 格式在 MCU 上需要额外的索引数组,增加了 5% 的 Flash 开销;稀疏度 85% 时,部分卷积核完全被剪掉,导致特征提取能力下降,需要确保每层至少保留 30% 的通道。
4.5 稀疏化训练的调参策略与总结
稀疏化训练的核心超参数包括:目标稀疏度、剪枝步长(Δs)、掩码更新周期(T)、学习率衰减策略。以下是推荐的调参顺序:
- 先确定目标稀疏度:根据 Flash 容量反推。例如 Flash 256KB,模型原始 720KB,需要压缩 2.8 倍,对应稀疏度约 65%(考虑 CSR 索引开销)。
- 设置渐进剪枝步长:Δs 建议在 5%~10% 之间。步长太大(>20%)会导致精度骤降;太小则训练时间过长。
- 掩码更新周期 T:通常 3~10 个 epoch。T 太小,掩码频繁变化导致训练不稳定;T 太大,剪枝决策滞后。
- 学习率联动:每次增加稀疏度时,将学习率乘以 0.7~0.9。稀疏度越高,模型容量越小,需要更小的学习率避免震荡。
最后需要强调的是,稀疏化训练不是孤立的技术,它需要与量化(第 5 章)、蒸馏(第 6 章)结合使用。通常先做稀疏化(减少参数量),再做量化(减少位宽),最后进行联合微调。在 TinyML 工程中,稀疏化带来的收益不仅体现在存储上,更重要的是推理速度的提升——Cortex-M 系列内核的 DSP 指令可以跳过零值,实现 2~4 倍的加速。