本篇文章为比赛第一名方案解析,该比赛涉及到CV-图像分类-天文
介绍:在本次竞赛中,参赛者使用自己的数据科学技能来帮助识别突破性聆听目标扫描中的异常信号。
网址:www.kaggle.com/competition…
摘要
我们的解决方案基于针对此特定任务微调的大型最先进分类模型。我们通过清理背景来预处理图像,以增强信噪比。在训练过程中,我们采用了 Mixup 形式的强烈增强。为了加快训练迭代速度,我们只使用了 ON 通道。我们只依赖提供的竞赛数据,不利用任何外部数据。此外,我们使用随机信号发生器添加了一个仅在测试文件中出现的额外信号——一个“S 形”信号——来增强训练数据。
交叉验证和预处理
该比赛的 CV 设置非常简单,使用了新训练数据的 5 折划分。我们还发现,如果使用旧泄露数据训练,仍然能给我们带来显著的提升,因此我们将全部旧训练数据和旧测试数据添加到每个训练折中。为了尽可能减少训练中的泄露影响,我们在加载图像后将其转换为 float32,并随后应用通道归一化。
CV/LB 间隔
大多数参赛者都在比赛早期就发现了 CV 和 LB 分数之间存在重大差异。虽然在理论上这并不一定总是问题,LB 可能确实更难(确实如此),我们没有观察到 CV 越高和 LB 越高的明确相关性。这导致我们探索了理解这些差异的不同方式,并试图解释它们。我们在 LB 上与第二名之间的巨大差距似乎主要基于这些见解,我们将在下文中详细阐述。
魔法 #1
如上所述,我们发现某些模型在 CV 分数相似的情况下,LB 分数差异显著。这促使我们开始调查单个预测,其中不同模型在 LB 分数不同的情况下意见不一。在比较了几个模型后,我们发现更好的 LB 模型对具有“S 形”信号的图像的概率要高得多,如下所示。
该类型的信号仅在测试集中出现,一些模型能够识别出该信号为非典型信号,而其他模型则不能。后来,主办方也确认测试数据中包含额外的信号类型。为了更好地预测这些信号并更好地推广到测试数据,我们添加了一个信号生成器(代码库调整自github.com/bbrzycki/se…),将这些信号添加到训练集中。我们调整了概率(p=0.01)并随机化了形状和信噪比,以获得最大的 LB 分数,同时确保 CV 分数保持不变。下面图表展示了这种注入信号的示例。
魔法 #2
许多人在比赛结束前几周注意到我们的公共排行榜分数有一个大幅度的提升。我们当时的分数已经相当高,接近 0.800,在 LB 上排名第二,我们很有信心进一步改进我们的解决方案,因为我们只做了非常简单的单折混合,甚至还没有将注意力转向像伪标签这样的进一步改进,这在这次比赛中看起来很有希望。为了进一步改进我们的解决方案,我们继续调查在注入 S 形信号后仍然存在的大的 CV/LB 差距。
竞赛中一个明显的方面是训练数据和测试数据之间的背景非常不同。这不仅从视觉检查或简单区分训练和测试的二分类器中可以看出,也从前期的伪标签实验中可以看出。在这里,我们只从测试数据中添加了非常确定的目标=1 样本到训练数据中,尽管交叉验证看起来不错,但我们的模型突然只预测了整个测试数据的目标=1,这意味着模型完美地学习了目标=1 总是来自测试数据。
因此,我们开始推测模型有时过于关注背景而不是信号。在下图中,我们以示例展示了按训练相似度分组的输出 logits 直方图。在这里,训练相似度仅基于图像数据(均值、标准差、唯一计数、最小值、最大值),但很明显,如果模型“了解背景”,它们就会更有信心。因此,我们探索了减少背景噪声影响或减少对背景噪声过度拟合的方法。
进一步调查发现,图像之间甚至存在显著的重叠。这意味着如果模型只看到该背景的目标=0 或目标=1,它也可能对单个背景过度拟合。因此,我们决定尝试从数据中移除一些常见的背景伪影(即清理数据),以提高信号并减少噪声和过度拟合的可能性。
然而,由于图像通道归一化,利用这一属性远非易事。不能仅仅比较一张图像与另一张图像的原始值。为了允许图像之间的比较,我们按列进行归一化,并计算了每张图像的第一列与其他所有图像和列的平均像素差异。由于舍入误差和可能的列信号,我们收到了大于 0 的列距离。我们利用重叠部分来增加信噪比,通过用多个匹配样本之间归一化区域之间的差异替换原始数据。这从匹配样本中存在的信号中产生了阴影(差异远小于 0),我们的模型能够将其与实际信号区分开来。在下图中,显示了两个样本之间归一化重叠区域的差异。黄色针(值> 0)来自样本 1,蓝色针(值< 0)来自匹配样本。
基于此过程,我们尽可能地对所有图像进行了清理;请参见以下示例:
原始样本带信号:
清洗后的含信号样本:
原始无信号样本:
清洗后的无信号样本:
最初,当我们开始清理数据时,我们只是快速尝试使用在未清理数据上训练的现有模型,并用清理后的数据增强推理。立即,我们在 LB 上看到了大幅提升,获得了 0.853 的分数。由于这已经与 LB 上下一个最高分数有显著差异,我们联系了 Kaggle,以详细说明我们的方法,并确认我们可以继续使用它。在那之后,我们开始直接在我们的建模方法中利用清理后的数据,以显著提升我们的性能。
模型
我们对自己的解决方案非常有信心,因此决定不提交大量混合或使用伪标签,这使得我们的解决方案更适合实际应用。因此,我们最好的最终提交是基于对全部数据的单一拟合。
我们的模型架构和训练方案适用于未清洗和已清洗的数据(即几乎复制训练数据)。因此,我们决定在所有可用的数据上训练数据:
- 旧火车(未清洗 & 已清洗)
- 旧测试(未清洗和已清洗)
- 新列车(未清洗 & 已清洗)
对于推理,我们始终选择可用的清洗后的图像,否则选择未清洗的图像。
早期,我们发现无范数模型表现出略好的 CV/LB 相关性,这可能是由于缺乏受数据分布差异影响的批量归一化。我们的最终最佳模型使用了 eca_nfnet_l2 骨干网络和可训练的 GeM 池化。
模型和分辨率方面,我们在计算机视觉领域看到越大越好。因此,正如之前提到的,我们只输入全图和仅连接的 ON 通道,不做任何调整大小。
为了进一步“扩大”图像,我们将第一层卷积的模型步长更改为(1,2),这是在计算机视觉竞赛中常用的一个技巧,基本上是为了进一步扩大图像分辨率。这允许模型通过主干网络在更高的分辨率上进行训练。Christof 和 Philipp 在 ALASKA2 隐写分析竞赛中也使用了这个技巧,动机是类似的数据设置(在图像中找到隐藏数据)。这个“高分辨率”模型的训练时间大约为 15 小时,使用 DDP 在 8xV100 上。
我们训练模型 20 个周期,除了随机垂直翻转外,我们还采用 mixup。我们随机混合两个图像,从 alpha=beta=5 的贝塔分布中抽取,所以混合程度大致相等。我们始终取两个标签的最大值作为最终标签,因为一旦数据中出现某种形式的信号,最终标签应该始终是 target=1。我们只在未清洗和清洗的图像之间进行混合。我们还发现,在混合后重新归一化图像也很有帮助,以保持数据性质不变,便于推理。我们还采用 4xTTA(常规、水平翻转、垂直翻转、水平翻转+垂直翻转)。
我们的最终单折验证分数为 0.976,公共 LB 分数为 0.965,私有 LB 分数为 0.964(几乎关闭了 cv/lb 差距)。在所有数据上使用相同参数训练的 fullfit(完全拟合)的公共 LB 分数和私有 LB 分数均为 0.967。
Outlook
我们已经在开始额外清理图像背景之前,就有一个非常好的解决方案,公共 LB 分数接近 0.800。我们很快意识到这会对解决方案产生重大影响,并专注于充分利用这些信息。因此,由于训练时间较长,我们没有探索每一种方法:在比赛的早期阶段,我们还训练了基于 OFF 通道激活的一种自我注意力的模型。虽然它本身并没有带来更好的分数,但当它用于混合时,这似乎增加了多样性,这被证明是有价值的。我们还注意到,伪标签有积极的影响,因为它可能有助于处理训练/测试域偏移。我们还探索了其他技术和研究来应对域偏移。