[控场AI]
· 5 分钟阅读· 2,928 字

MobileNetV2微调与层冻结实战指南

MobileNetV2微调与层冻结实战指南

MobileNetV2微调需按数据规模设计层冻结、BN处理与学习率策略。

文章结合 Reddit 开发者讨论,梳理 MobileNetV2 微调与层冻结的可操作思路。由于深度可分离卷积和倒残差结构使浅层通道数极少,照搬 ResNet「冻结全部卷积只训分类头」的做法在域差异大时效果受限,冻结比例应随数据规模与分布差异调整。层冻结有三种典型策略:只训练分类头、冻结浅层微调深层、分层学习率,各有适用场景。BatchNorm 统计量的处理是常被忽视的陷阱,小数据集小 batch 时建议冻结 BN 统计量。学习率通常比从头训练小一到两个数量级,渐进式解冻有助于保护预训练权重。文章最后总结四个常见误区,强调微调是需结合具体数据反复试错的工程手艺。

在移动端部署深度学习模型时,MobileNetV2 几乎是绕不开的选择。它足够轻量,精度也可接受。但真正把它用在自己的任务上,微调(fine-tuning)和层冻结(layer freezing)的策略设计,往往比模型选型更考验经验。Reddit 上有开发者专门就此展开讨论,本文结合这些实践反馈,梳理一套可操作的思路。

reddit source: Understanding Fine-Tuning and Layer Freezing in MobileNetV2

为什么 MobileNetV2 的微调需要区别对待

MobileNetV2 的核心是深度可分离卷积(depthwise separable convolution)和倒残差结构(inverted residual block)。这两点带来了参数量的大幅压缩,也带来一个副作用:浅层特征和深层特征的耦合方式与 ResNet 这类标准网络并不相同。

直接照搬「冻结全部卷积层、只训练分类头」的套路,在小数据集上可能还行,一旦目标任务与 ImageNet 分布差异较大,效果就会明显受限。Reddit 讨论中有开发者指出,MobileNetV2 的低层卷积核数量很少(第一层只有 32 个),冻结它们省下的计算有限,但损失的适应能力却不小。

一个更务实的判断标准是看数据规模:数据量越接近原始预训练分布、样本越少,冻结的比例可以越高;反之则应放开更多层参与训练。

深度可分离卷积将标准卷积拆分为两步:逐通道的 depthwise 卷积(每个输入通道单独使用一个卷积核)和 1×1 的 pointwise 卷积(负责通道间信息融合)。相比标准卷积,它的计算量可降至约 1/8 到 1/9,参数量也大幅减少。倒残差结构则与 ResNet 的「先降维再升维」相反:先用 1×1 卷积把通道数扩张(通常扩张 6 倍),在更高维空间做 depthwise 卷积,再用 1×1 卷积压缩回低维,并在低维处做残差连接。这种「两头窄、中间宽」的设计让 MobileNetV2 在极低参数量下保留了表达能力,但也意味着其浅层通道数极少、特征维度紧凑,冻结后可供任务适配的冗余空间远小于 ResNet,因此微调时更需要谨慎权衡冻结范围。

层冻结的三种典型策略

只训练分类头

把 backbone 全部冻结,只替换并训练最后的全连接层。这是最保守的做法,训练速度快、不易过拟合,适合样本量在几百到几千级别、且类别与 ImageNet 语义相近的场景。缺点是模型对域偏移的适应能力几乎为零。

冻结浅层、微调深层

保留前面的特征提取层,放开后几个倒残差块和分类头。这是讨论中出现频率最高的折中方案。理由在于:浅层学到的是边缘、纹理等通用特征,跨任务迁移性好;深层则更贴近具体语义,需要针对新任务调整。

分层学习率

不完全冻结,而是给不同深度的层设置递减的学习率。越靠近输入的层学习率越小,越靠近输出的层学习率越大。这种做法在讨论中被认为更灵活,但需要额外的超参数调优成本。

reddit source: Understanding Fine-Tuning and Layer Freezing in MobileNetV2

BatchNorm 层的隐藏陷阱

讨论中一个被反复提及的问题是 BatchNorm 层。很多教程只讲冻结卷积权重,却忽略了 BN 层的 running mean 和 running variance。

如果在微调时把 BN 层设为 eval 模式(冻结统计量),模型会更稳定,但可能无法适应新数据的分布;如果设为 train 模式,统计量会被小批量数据重新估计,在 batch size 偏小时容易剧烈波动,导致训练不稳定。

实践中的共识倾向是:小数据集、小 batch 时冻结 BN 统计量;数据量充足且 batch size 较大时,允许 BN 层更新。这一点在原始讨论中虽然没有给出统一结论,但多数经验分享都指向「按 batch size 决定」这个方向。

BatchNorm 的 running mean 和 running variance 是在预训练阶段由海量 ImageNet 数据统计得到的滑动平均值,推理时用它们对特征做归一化。微调时若把 BN 层设为 train 模式,这两个统计量会被当前小批量数据的均值和方差重新估计并覆盖。当 batch size 较小(如 8 或 16)时,单批统计量的估计方差很大,running 统计量会随之剧烈漂移,进而破坏已学到的归一化基准,表现为 loss 震荡甚至精度骤降。反之设为 eval 模式则统计量保持预训练值不变,训练更稳定,但若新数据分布与 ImageNet 差异显著,固定的归一化参数可能不再匹配。实践中也可采用折中方案:冻结 BN 统计量但保留其可学习的缩放参数 gamma 和偏移参数 beta,让模型在稳定归一化的前提下仍能适度调整。

学习率与训练节奏

微调 MobileNetV2 时,学习率通常要比从头训练小一到两个数量级。讨论中提到的常见起点在 1e-4 到 1e-5 之间,配合余弦退火或阶梯衰减。

另一个容易被忽视的点是:解冻层的时机。有开发者建议先冻结训练几轮让分类头收敛,再逐步解冻深层,避免一开始就用大梯度冲击预训练权重。这种渐进式解冻在讨论中被认为对最终精度有正向帮助,但会拉长训练周期。

余弦退火指学习率按余弦曲线从初始值平滑衰减到接近零,前期下降慢、后期下降快,有助于模型在训练末期精细收敛;阶梯衰减则是在预设的 epoch 节点上将学习率乘以一个衰减因子(如 0.1),实现分段式下降。渐进式解冻(progressive unfreezing)源自 ULMFiT 等迁移学习工作,核心思想是分阶段由浅入深地放开层:先只训练分类头,待其收敛后再解冻最后一个 block,如此逐层推进,每解冻一批层就重置一个较小的学习率。这样能避免随机初始化的分类头在训练初期产生的大梯度反向传播冲击预训练权重,同时让各层在解冻时都有一个平滑的适应过程,代价是训练轮次和调参复杂度上升。

常见误区小结

  • 把「冻结层数」当成固定公式,而不看数据规模和分布差异;
  • 只冻结权重、忘记处理 BN 层;
  • 解冻后沿用与冻结阶段相同的学习率,导致预训练特征被破坏;
  • 忽略输入分辨率的影响——MobileNetV2 对输入尺寸敏感,改变分辨率后浅层特征的适用性会下降。

这些点单独看都不复杂,但组合起来决定了微调能否真正见效。Reddit 上的这场讨论没有给出万能配置,反而说明了一件事:MobileNetV2 的微调更像是一门需要结合具体数据反复试错的工程手艺,而不是套模板就能解决的问题。

分享:

相关推荐