4. 学生模型设计:轻量化网络设计原则
好,到了学生模型设计这一节。说实话,这是整个蒸馏流程里最容易被低估的一环。很多人觉得,学生模型嘛,随便找个小的就行。但我告诉你,学生模型选得好不好,直接决定了你蒸馏的天花板在哪里。
我个人习惯把学生模型设计分成两条路:一是直接拿现成的轻量网络,比如 MobileNet、ShuffleNet 这些;二是根据任务自己魔改。今天咱们重点聊前者,因为这是最稳妥的起步方式。
4.1 轻量化设计的核心原则
先说说轻量化网络到底在追求什么。说白了,就是用更少的算力,保住更多的精度。这里有几个关键原则,我在项目里反复验证过:
- 减少通道数:通道数一多,计算量是平方级上涨。能用 32 通道就别用 64。
- 降低特征图分辨率:分辨率大,FLOPs 直接翻倍。早点下采样,后面就轻松了。
- 用深度可分离卷积代替标准卷积:这是 MobileNet 的精髓,后面细说。
- 控制网络深度:不是越深越好,太深了梯度容易消失,蒸馏时教师也带不动。
核心公式速记:标准卷积的 FLOPs = K² × C_in × C_out × H × W;深度可分离卷积的 FLOPs = K² × C_in × H × W + C_in × C_out × H × W。后者大约是前者的 1/C_out + 1/K²,省得不是一星半点。
4.2 三大主流轻量网络对比
我这些年用过不少轻量网络,最常用的就是下面这三个。它们的设计哲学各有千秋,我分别说说我的体会。
| 网络 | 核心思想 | 参数量 (1.0x) | FLOPs (224x224) | 我的评价 |
|---|---|---|---|---|
| MobileNetV2 | 倒残差 + 线性瓶颈 | ~3.4M | ~300M | 最稳,适合大多数场景 |
| ShuffleNetV2 | 通道重排 + 分组卷积 | ~2.3M | ~146M | 速度快,适合移动端 |
| EfficientNet-Lite | 复合缩放 + NAS 搜索 | ~5.3M (B0) | ~390M (B0) | 精度高,但稍重 |
我的经验:如果你做分类任务,MobileNetV2 是首选,社区支持好,蒸馏时也容易调。如果是检测或分割,ShuffleNetV2 的推理速度优势会更明显。
4.3 参数量与 FLOPs 的计算方法
嗯,这里要重点说一下。很多新手搞不清参数量和 FLOPs 的区别。我简单解释一下:
- 参数量:模型有多少个可学习的参数,决定模型大小和内存占用。
- FLOPs:一次前向推理需要多少次浮点运算,决定计算速度。
举个例子,一个标准卷积层,输入通道 C_in,输出通道 C_out,卷积核大小 K×K,输出特征图 H×W:
参数量 = K × K × C_in × C_out + C_out(偏置)
FLOPs = 2 × K × K × C_in × C_out × H × W(乘加各算一次)
我曾经在项目里踩过一个坑:只关注参数量,忽略了 FLOPs。结果模型是变小了,但推理速度反而慢了,因为用了太多分组卷积,内存访问开销太大。所以,两个指标要一起看。
4.4 如何选择学生模型
这里我给出一个我自己的决策流程,你可以参考:
- 先看任务:分类还是检测?分类用 MobileNet,检测用 ShuffleNet 或 EfficientNet-Lite。
- 再看资源:手机端还是服务器端?手机端参数量控制在 5M 以内,FLOPs 在 500M 以内。
- 最后看教师:教师模型大不大?如果教师本身只有几十 M,学生选太轻了反而学不到东西。
避坑指南:我曾经选了一个参数量只有 1M 的学生模型去蒸馏 ResNet-152,结果精度掉了 8 个点。后来换成 MobileNetV2(3.4M),精度只掉了 2 个点。学生模型不能太弱,否则教师的知识装不下。
4.5 轻量化网络结构图
下面这张图是我自己整理的三大轻量网络的核心结构对比,方便你一眼看清它们的差异。
4.6 实战中的选择建议
最后,我结合自己的项目经验,给你几个具体建议:
- 如果你刚入门蒸馏:直接用 MobileNetV2,社区资料多,踩坑少。
- 如果你做移动端部署:ShuffleNetV2 是首选,推理速度快,省电。
- 如果你追求精度:EfficientNet-Lite B0 或 B1,虽然重一点,但精度确实高。
- 如果你需要自定义:参考 MobileNetV2 的倒残差结构,自己调整通道数和层数。
一个小技巧:选好学生模型后,先不做蒸馏,直接训练一下看看基线精度。如果基线精度太低,说明学生模型容量不够,需要换大一点的版本。我一般要求基线精度不低于教师模型的 70%。