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 如何选择学生模型

这里我给出一个我自己的决策流程,你可以参考:

  1. 先看任务:分类还是检测?分类用 MobileNet,检测用 ShuffleNet 或 EfficientNet-Lite。
  2. 再看资源:手机端还是服务器端?手机端参数量控制在 5M 以内,FLOPs 在 500M 以内。
  3. 最后看教师:教师模型大不大?如果教师本身只有几十 M,学生选太轻了反而学不到东西。

避坑指南:我曾经选了一个参数量只有 1M 的学生模型去蒸馏 ResNet-152,结果精度掉了 8 个点。后来换成 MobileNetV2(3.4M),精度只掉了 2 个点。学生模型不能太弱,否则教师的知识装不下。

4.5 轻量化网络结构图

下面这张图是我自己整理的三大轻量网络的核心结构对比,方便你一眼看清它们的差异。

三大轻量网络核心结构对比 MobileNetV2 1×1 升维 (扩展层) 3×3 深度可分离卷积 1×1 降维 (线性瓶颈) 倒残差结构:升维 → 卷积 → 降维 ShuffleNetV2 通道分割 (一半走捷径) 1×1 + 3×3 分组卷积 通道重排 (Channel Shuffle) 分组卷积 + 通道重排,减少内存访问 EfficientNet-Lite MBConv (Mobile Inverted) SE 注意力模块 (轻量版) 复合缩放 (Depth/Width/Res) NAS 搜索 + 复合缩放,精度优先 关键指标对比 参数量:MobileNetV2 ~3.4M | ShuffleNetV2 ~2.3M | EfficientNet-Lite ~5.3M FLOPs:MobileNetV2 ~300M | ShuffleNetV2 ~146M | EfficientNet-Lite ~390M 推理速度:ShuffleNetV2 > MobileNetV2 > EfficientNet-Lite 适用场景:MobileNetV2 通用 | ShuffleNetV2 移动端 | EfficientNet-Lite 高精度 蒸馏友好度:MobileNetV2 ★★★★ | ShuffleNetV2 ★★★ | EfficientNet-Lite ★★★★

4.6 实战中的选择建议

最后,我结合自己的项目经验,给你几个具体建议:

  • 如果你刚入门蒸馏:直接用 MobileNetV2,社区资料多,踩坑少。
  • 如果你做移动端部署:ShuffleNetV2 是首选,推理速度快,省电。
  • 如果你追求精度:EfficientNet-Lite B0 或 B1,虽然重一点,但精度确实高。
  • 如果你需要自定义:参考 MobileNetV2 的倒残差结构,自己调整通道数和层数。

一个小技巧:选好学生模型后,先不做蒸馏,直接训练一下看看基线精度。如果基线精度太低,说明学生模型容量不够,需要换大一点的版本。我一般要求基线精度不低于教师模型的 70%。