作为一名长期关注计算机视觉模型优化的从业者,我最近被MobileNet-V4论文中一个有趣的发现所吸引:他们重新训练MobileNet-V1基线模型时,准确率从原来的71%提升到了74%。这个提升幅度相当可观,促使我深入研究了他们的训练方法。经过一系列实验,我不仅复现了他们的结果,还进一步优化了训练方案,最终在MobileNet-V1上取得了75.4%的ImageNet top-1准确率(224x224分辨率),甚至将这个训练方案应用到了EfficientNet-B0上,使其达到了78.6%的准确率。
MobileNet-V4论文中最引人注目的调整之一是优化器参数的变化。他们将AdamW的beta1参数从默认的0.9降低到了0.6,这使得优化器的行为更接近RMSProp。这种调整背后的逻辑是:
在实际训练中,我发现这个调整确实能带来明显的性能提升,尤其是在训练初期。
论文中另一个反直觉的做法是对小型模型使用了相对较强的正则化:
通常我们会认为小型模型容易欠拟合,应该减少正则化。但作者们发现,配合适当的优化器调整,更强的正则化反而能帮助小模型学习到更鲁棒的特征。我在复现时采用了2400个epoch(而非原文的9600),同样取得了73.8%的准确率,说明训练效率可以进一步提高。
基于MobileNet-V4的发现,我设计了自己的训练方案来优化MobileNet-V1:
优化器配置:
数据增强:
训练设置:
这套方案最终使MobileNet-V1达到了75.4%的top-1准确率(224x224),在256x256分辨率下达到76%。重要的是,在ImageNet-V2、Sketch等OOD数据集上的表现也很稳健,说明这不是过拟合的结果。
受到MobileNet结果的鼓舞,我将类似的训练方案应用到了EfficientNet-B0上,取得了78.6%的top-1准确率。这个数字有几个值得注意的地方:
这表明,即使对于相对成熟的架构,通过精心设计的训练方案仍能获得显著提升。
在我的实现中,对标准的RandAugment做了几项关键改进:
颜色变换的调整:
几何变换的优化:
这些改进细节最初是在"Resnet Strikes Back"论文的附录A中提出的,它们帮助避免了原始RandAugment中一些可能损害训练效果的问题。
重复增强(Repeated Augmentation)是我采用的另一个关键技术,它的核心思想是:
具体实现时,我通常使用4次重复,这在不显著增加计算开销的情况下,能带来明显的性能提升。
在正则化方面,我采用了多层次的策略:
Dropout:
权重衰减:
标签平滑:
这种组合式的正则化策略对于防止过拟合、提高模型泛化能力非常有效。
下表比较了不同MobileNet变体的性能表现:
| 模型 | 实现来源 | 准确率(%) | 参数量(M) | GMACs |
|---|---|---|---|---|
| MobileNet-V1 1.0 | Google原版 | 70.9 | 4.2 | 0.6 |
| MobileNet-V1 1.0 | MNV4论文 | 74.0 | 4.2 | 0.6 |
| MobileNet-V1 1.0 | 本方案 | 75.4 | 4.2 | 0.6 |
| MobileNet-V2 1.0 | Google原版 | 71.8 | 3.5 | 0.3 |
| MobileNet-V2 1.0 | timm实现 | 73.0 | 3.5 | 0.3 |
| MobileNet-V4 Small | MNV4论文 | 73.8 | 3.8 | 0.2 |
从表中可以看出,仅通过改进训练方案,MobileNet-V1的性能就提升了4.5个百分点,超过了MobileNet-V2和接近MobileNet-V4 Small的表现。
对于EfficientNet-B0,不同训练方案的对比更加明显:
| 训练方案 | 准确率(%) | 数据来源 |
|---|---|---|
| 原始实现 | 76.7 | ImageNet-1k |
| AutoAugment | 77.1 | ImageNet-1k |
| AdvProp+AA | 77.6 | ImageNet-1k |
| RandAugment | 77.7 | ImageNet-1k |
| 本方案 | 78.6 | ImageNet-1k |
| NoisyStudent | 78.8 | ImageNet-1k+JFT |
特别值得注意的是,本方案仅使用ImageNet-1k数据就接近了使用额外JFT数据的NoisyStudent模型的性能,这充分证明了训练方案改进的价值。
对于想要复现或借鉴这些结果的同行,以下是我的具体训练配置:
python复制# 优化器配置
optimizer = AdamW(
params=model.parameters(),
lr=3e-4,
betas=(0.6, 0.999),
weight_decay=0.05
)
# 学习率调度
scheduler = CosineLRScheduler(
optimizer,
t_initial=3600,
lr_min=1e-6,
warmup_t=50,
warmup_lr_init=1e-6
)
# 数据增强配置
augmentation = [
RandAugment(
magnitude=9,
magnitude_std=0.5,
num_layers=2,
),
RandomGaussianBlur(p=0.1),
RandomGrayscale(p=0.1),
RandomErasing(
probability=0.25,
mode='pixel',
max_count=1,
noise_range=(0, 255)
)
]
在实际训练中,有几个关键观察点:
训练初期:
中期阶段(100-1000epoch):
后期阶段(1000+epoch):
在复现这类长周期训练时,常会遇到以下问题:
训练不稳定:
验证集性能停滞:
过拟合迹象:
虽然目前的方案已经取得了不错的效果,但我认为还有进一步优化的空间:
自适应增强策略:
优化器改进:
训练效率提升:
这些改进可能会将EfficientNet-B0推至79%以上的准确率,进一步缩小与大型模型的差距。