3、模型轻量化基础:模型剪枝、权重量化、知识蒸馏原理

各位同学,咱们今天聊聊模型轻量化。说实话,在电池供电设备上跑AI,最头疼的就是功耗和内存。你想想看,一个智能手表或者无线传感器,电池就那么点容量,你还想让它跑个大模型?不现实。

我最早做嵌入式AI的时候,踩过不少坑。有一次在STM32上部署一个简单的分类网络,模型才几百KB,结果一跑起来,内存直接爆了。后来才明白,不是模型参数多,而是中间激活值太大。嗯,从那以后,我就开始认真研究模型轻量化了。

今天咱们重点讲三个技术:模型剪枝权重量化知识蒸馏。这三兄弟,说白了就是给模型「减肥」、「降精度」、「学精华」。

3.1 模型剪枝(Pruning)

模型剪枝,顾名思义,就是把模型里「不重要」的权重或神经元剪掉。为什么能剪?因为神经网络里有很多冗余参数。我见过一个训练好的模型,90%的权重都接近0,你说留着它们干嘛?

剪枝分两种:

  • 非结构化剪枝:直接剪掉单个权重。优点是灵活,缺点是剪完后模型稀疏,硬件不友好。
  • 结构化剪枝:剪掉整个通道或卷积核。硬件友好,但精度损失可能大一些。

我个人习惯用结构化剪枝,尤其是在MCU上部署时。为什么?因为非结构化剪枝后的稀疏矩阵,在普通ARM Cortex-M上跑起来反而更慢。你想想看,硬件没有专门的稀疏计算单元,你剪了也是白剪。

剪枝流程:训练 → 评估重要性 → 剪掉不重要部分 → 微调恢复精度

评估重要性有很多方法。最简单的就是看权重绝对值大小。绝对值小的,说明它对输出影响小,可以剪。我在项目中遇到过,直接用L1范数排序剪枝,效果还不错。但要注意,别一次剪太多,否则模型直接崩了。我建议每次剪10%-20%,然后微调一下。

小技巧:剪枝后的模型,微调时学习率要调小。我一般用原学习率的十分之一,不然容易震荡。

3.2 权重量化(Quantization)

权重量化,说白了就是把模型参数从高精度(比如FP32)降到低精度(比如INT8)。为什么能降?因为神经网络对噪声有一定容忍度。你想想看,人眼都分不清256和257的区别,模型其实也差不多。

量化分两种:

  • 训练后量化(PTQ):模型训练完后,直接转成低精度。简单快速,但精度可能掉一点。
  • 量化感知训练(QAT):在训练过程中模拟量化误差。精度更高,但训练更复杂。

我记得第一次做量化时,直接用了PTQ,结果模型精度从95%掉到了80%。当时我一脸懵,后来才发现是激活值范围没校准好。嗯,这里要注意:PTQ需要准备一小批校准数据,用来统计激活值的动态范围。

量化公式其实很简单:

// 量化:浮点转定点
q = round(r / scale) + zero_point

// 反量化:定点转浮点
r = (q - zero_point) * scale

其中scale和zero_point是根据权重或激活值的范围算出来的。我建议用对称量化(zero_point=0),因为计算更简单,硬件实现也方便。

避坑指南:我曾经在量化一个MobileNet时,发现某些层的激活值范围特别大,导致量化误差爆炸。后来加了「范围裁剪」,把异常值截断,才稳住精度。

3.3 知识蒸馏(Distillation)

知识蒸馏,就是让一个小模型(学生)去学一个大模型(老师)的知识。为什么有效?因为老师模型不仅知道正确答案,还知道「接近正确答案」的分布。比如分类猫和狗,老师模型可能输出猫0.9、狗0.1,但更精细的分布可能是猫0.85、狗0.12、兔子0.03。这些「软标签」包含了丰富的知识。

蒸馏的损失函数一般有两部分:

  • 硬损失:学生输出与真实标签的交叉熵
  • 软损失:学生输出与老师输出的KL散度

软损失里有个关键参数——温度T。T越大,软标签分布越平滑,学生能学到更多「暗知识」。我一般把T设在3-5之间,效果比较好。

蒸馏公式:Loss = α * HardLoss + (1-α) * SoftLoss

其中α是平衡系数,我习惯设0.7,软损失为主,硬损失为辅。

我在项目中遇到过,用蒸馏把ResNet50的知识传给MobileNetV2,精度从70%提到了78%,而模型大小只有原来的十分之一。你说值不值?

3.4 三种技术的对比与选择

这三种技术不是互斥的,可以组合使用。我一般这么选:

技术 优点 缺点 适用场景
模型剪枝 直接减少计算量 需要微调,硬件支持要求高 有专用NPU或稀疏计算单元的设备
权重量化 减少存储和带宽,加速明显 精度可能下降,需要校准 几乎所有嵌入式设备,尤其是MCU
知识蒸馏 提升小模型精度 需要大模型,训练时间长 有充足算力训练,但部署时资源受限

我个人习惯的流程是:先剪枝,再量化,最后用蒸馏微调。但也不是绝对的,具体看项目需求。你想想看,如果设备内存只有256KB,那量化是必须的;如果算力够但内存小,剪枝可能更合适。

实战建议:在电池供电设备上,我建议优先做量化。因为量化不仅减小模型体积,还能降低功耗。剪枝和蒸馏可以作为锦上添花的优化手段。

好了,今天的内容就到这里。下一章咱们会讲如何在STM32上实际部署一个量化后的模型,到时候我会带大家一步步操作。有什么问题,欢迎在课程群里讨论。