AutoDL 图像竞赛调参实验记录

这段时间一直在参与 AutoDL 的图像分类赛道(Auto_Image),线下测试数据全部使用 Pedro 数据集。整体思路是在有限的时间预算内,探索不同 backbone、归一化层、激活函数、精度格式以及预训练权重对最终得分的影响。以下按实验顺序做一个系统整理。

Backbone 选择:ResNet18 vs. ResNet34

第一个问题是 backbone 的选择。从线上数据的走势来看,得分在前期上升很快,这个阶段用 ResNet18 是合理的;后期上升幅度趋于平缓,增量比较小,理论上可以尝试更大的 backbone 或换用不同的 pipeline。

但线下数据的测试结果显示,ResNet34 相比 ResNet18 并没有明显优势。下图左边是 ResNet18,右边是 ResNet34:

Pedro 任务上 ResNet18 与 ResNet34 的学习曲线对比
图 1:Pedro 任务的学习曲线,左 ResNet18(ALC=0.6163)、右 ResNet34(ALC=0.6169),两者差距不显著

差距不显著,暂时维持 ResNet18 作为基准。

激活函数:用 CELU 替代 ReLU

尝试将网络中的 ReLU 全部替换为 CELU。线下数据上两者差不多,CELU 稍差;线上数据的差距则明显扩大,CELU 方案得分反而低了不少。

线下 CELU 结果:

CELU 替换 ReLU 的线下学习曲线
图 2:CELU 替换 ReLU 的线下学习曲线(Pedro,ALC=0.5834)

线上对比(左边是新的 baseline,右边是 CELU):

Apollon 任务上新 baseline 的线上学习曲线
图 3:线上新 baseline 的学习曲线(Apollon,ALC=0.7059)
Apollon 任务上 CELU 方案的线上学习曲线
图 4:线上 CELU 方案的学习曲线(Apollon,ALC=0.6438),明显低于 baseline

CELU 在这个场景下没有收益,放弃。

归一化层实验

重置所有 BN 层

尝试把预训练模型的所有 Batch Normalization 层重置,期望让统计量更快适配新数据。线下结果显示,重置 BN 之后前期(第一个检查点)效果确实较好,收敛更快,但最终精度并不高。右边是重置 BN 的结果:

重置 BN 前后的线下学习曲线对比
图 5:重置 BN 前后的线下学习曲线,左为不重置(ALC=0.6086)、右为重置 BN(ALC=0.5972),重置后早期收敛更快但最终精度略低

线上结果也略低于不重置的 ResNet18 基准:

重置 BN 的线上学习曲线
图 6:重置 BN 的线上学习曲线(Apollon,ALC=0.6936),略低于不重置的 ResNet18 基准

ResNet34 + 重置所有 BN

将两者组合,期望兼顾更强的 backbone 和更快的早期收敛。线下第一个检查点变慢了很多,推测是系统 IO 不稳定导致的,不作为参考。线上结果是前期速度确实快了很多,但后期精度依旧不够高,目测是 overfit 导致的。

线上测试结果:

ResNet34 + 重置 BN 的线上学习曲线
图 7:ResNet34 + 重置 BN 的线上学习曲线(Apollon,ALC=0.6844),前期快但后期精度不足、疑似 overfit

Precise Norm(Group Norm)替代 Batch Norm

另一个方向是用 Group Norm(Precise Norm)完全替代 BN:

Precise BatchNorm 与 Group Norm 在大 batch 训练下的误差曲线示意
图 8:Precise BatchNorm 的动机示意——左为常规 BN(大 batch 下 train/val 误差曲线),右为 Group Norm(IJCV 版)在不同 batch 下的验证误差曲线

最终效果不好,不予考虑。

混合精度训练(FP16)

在本地测试了 FP16。结果出乎意料:没有 FP16 的版本(左)反而比开启 FP16(右)更快,同时 FP16 对精度的影响也比较大。

未开启 FP16 的本地学习曲线
图 9:未开启 FP16 的本地学习曲线(Pedro,ALC=0.5570)
开启 FP16 的本地学习曲线
图 10:开启 FP16 的本地学习曲线(Pedro,ALC=0.5202),反而更慢且精度受损

FP16 在当前配置下得不偿失,暂不引入。

其他杂项实验

Scan 循环展开(unroll):将 scan 中的循环展开(unroll=2)测试时间开销,结果没什么用,原始 test scan 时间约 43s,改动意义不大。

加大 batch size:适度加大 bs 会增加一些时间开销,但对稳定性帮助不大——线上不稳定的根本原因还是 overfit,调 bs 治标不治本。

学习率调整:目前还在尝试前期和后期用不同 pipeline 的思路,尚未得出确定结论。

预训练模型:ReID 与行人属性数据集

尝试用行人重识别(ReID)的预训练权重替换 ImageNet 预训练,分别测试了 MSMT 数据集和 Market 数据集的预训练版本。

MSMT 数据集预训练线下结果:

MSMT 数据集 ReID 预训练的线下学习曲线
图 11:MSMT 数据集 ReID 预训练的线下学习曲线(Pedro,ALC=0.3906),明显劣于 ImageNet 预训练

此外还测试了 PA-100K 预训练模型(行人属性识别),线上线下都不好用,试了几个数据集的预训练都不理想。

不同场景下 ImageNet 预训练的适用性

分别在行人、医疗和卫星图像三类场景上测试了 ImageNet 预训练的效果。

卫星图像:

卫星图像场景下 ImageNet 预训练的学习曲线
图 12:卫星图像场景(Decal)下 ImageNet 预训练的学习曲线,ALC=0.6412

医疗图像:

医疗图像场景下 ImageNet 预训练的学习曲线
图 13:医疗图像场景(Hammer)下 ImageNet 预训练的学习曲线,ALC=0.6977

不同领域差异明显,ImageNet 预训练并不能在所有场景上保持一致的优势。

CV Final 数据集预判

根据目前 feedback 阶段出现的情况,对 final 阶段可能出现的数据集做一个预判:

  • Loukoum(手写体):cv 与 cv2 的 final 都出现过,AutoCLINT 结果很好,不用担心。

    Loukoum 手写体任务上 AutoCLINT 的学习曲线
    图 14:Loukoum(手写体)任务上 AutoCLINT 的学习曲线,ALC=0.9256,效果很好
  • Tim(通用物体):ImageNet 预训练已经足够。

  • Apollon(行人):已出现在 feedback 阶段。

  • Ideal(航拍/卫星):已出现在 feedback 阶段。

  • Ray(医疗):只出现在 cv 的 final,需要关注。

线上数据 Reshuffle 实验

测试线上数据有无 reshuffle 的影响:

线上数据不 reshuffle 时的学习曲线
图 15:线上数据不 reshuffle 时的学习曲线(Apollon,ALC=0.6888)
线上数据 reshuffle 后的学习曲线
图 16:线上数据 reshuffle 后的学习曲线(Apollon,ALC=0.6577)

最后,尝试用 self-attention 来处理数据分布问题,结果并不 work。