返回列表

4-th place solution: Over9000 optimizer

353. Kannada MNIST | Kannada-MNIST

开始: 2019-09-18 结束: 2019-12-17 计算机视觉 数据算法赛

第4名方案:Over9000 优化器

作者:Iafoss | 比赛排名:第4名

恭喜所有参赛者。我在本次比赛中的主要目标是探索有效使用新优化器的方法,例如 RAdamOver9000。尽管相关研究承诺这些优化器的效果远好于 Adam,但我对这些优化器的初步测试结果却相当令人失望:RAdam 的结果与 Adam 大致相同,而 Over9000 的效果则差得多。在我参加的上一次云分割比赛中,观察到了一个有趣的现象:如果使用 RAdam,余弦退火中不应包含 warm-up(预热)。正如 这里 所预期的那样,Over9000 配合这种调度器的效果甚至比 RAdam 还要好。在 fast.ai 中,可以通过以下附加参数实现:learn.fit_one_cycle(36, max_lr=slice(0.2e-2,1e-2), pct_start=0.0, div_factor=100)。因此,本次比赛提供的小数据集和快速训练周期非常适合进行优化器和调度器的实验。

在本次比赛中,我使用了 3 个模型:

  1. 来自 CIFAR-pretrained-models(以及相应的 数据集)的 Resnet20,输入为 32x32x1 图像(我替换了第一个卷积层,并对相应的预训练权重进行了求和)。
  2. 预训练的 DenseNet121DenseNet169,输入为 64x64x1 图像(因为第一层是步长为 2 的卷积层,后接 3x3 池化层,因此放大小图像非常有帮助)。

在所有模型中,ReLU 被 Mish 替代。模型头与 fast.ai 默认使用的类似:拼接池化 + Mish + BN + Dropout(0.5) + Linear + Mish + BN + Dropout(0.5) + Linear。

使用的其他技术

  • Over9000 单循环调度器(无 warm-up)
  • 分类交叉熵
  • 梯度裁剪
  • 最佳模型选择
  • 差异化学习率,将模型分为骨干网络和头部
  • 标准的 fast.ai 数据增强,不包含翻转 get_transforms(do_flip=False,max_zoom=1.2)
  • 5 折交叉验证(5 fold CV),忽略公共排行榜

可能有效的方法

  • 伪标签可以轻松将私人排行榜分数提升至 0.995+
  • 更多模型

无效的方法

  • ArcFace Loss(我原本期望它能让类别表示更紧凑,对训练/测试数据不匹配更鲁棒)
  • 冻结骨干网络并先训练头部(即使没有将 ReLU 替换为 Mish)
  • CIFAR-pretrained-models 中的 ResNet44 和 ResNet56 效果不如 ResNet20
  • 使用 Dig-MNIST 数据集

关于训练/测试数据不匹配的问题:我推测每个人都提供了几个手写数字。当同一个人书写的数字被分割到训练集和验证集时,就会发生泄露。我试图假设每个人提供一个或多个(固定数量)数字实例。这对我来说没有奏效,因为很可能人们提供的手写样本数量不同,一切仍然混杂在一起。

可以通过此 实用脚本 将 RAdam 和 Over9000 添加到你的内核中。

同比赛其他方案