450. SETI Breakthrough Listen - E.T. Signal Search | seti-breakthrough-listen
感谢 Kaggle 和伯克利 SETI 研究中心举办这场有趣的比赛。在下文中,我们将总结 Watercooled 战队的获胜方案。一如既往,感谢所有团队成员对解决方案的同等贡献。
我们的解决方案基于针对此特定任务微调的大型最先进分类模型。我们通过清理背景来预处理图像,以提高信噪比。在训练期间,我们采用了 Mixup 形式的重度增强。为了加快训练迭代速度,我们只使用了 ON 通道。我们仅依赖提供的比赛数据,不使用任何外部数据。我们还通过使用随机信号生成器,在训练数据中增加了一种仅出现在测试文件中的额外信号——“s形”信号。
本次比赛的 CV 设置非常简单,对新训练数据使用了 5 折划分。我们还发现,如果用于训练,旧的泄漏数据仍然能给我们带来显著的提升,因此我们将完整的旧训练数据和旧测试数据添加到每个训练折中。为了尽可能减少训练中泄漏的影响,我们在加载图像后将其转换为 float32,随后应用通道归一化。
与大多数参赛者一样,我们在比赛初期经历了 CV 分数和 LB 分数之间的巨大差异。虽然理论上这不一定总是个问题,LB 可能只是更难(而且确实如此),但我们没有观察到更高的 CV 和更高的 LB 之间存在明确的相关性。这促使我们探索不同的方法来理解这些差异并试图解决它们。我们在 LB 上与第二名的巨大差距似乎主要基于这些见解,接下来我们将详细阐述。
如前所述,我们观察到某些模型尽管 CV 分数相似,但 LB 分数却表现出显著差异。这促使我们开始调查单个预测,即不同 LB 分数的模型之间存在分歧的地方。在比较了几个模型后,我们观察到更好的 LB 模型对带有“s形”信号的图像具有更高的概率,如下所示。
这种类型的信号只出现在测试集中,一些模型能够识别出该信号是异常的,而其他模型则不能。后来主办方也证实,测试数据包含额外的信号类型。为了更好地预测这些信号并更好地泛化到测试数据,我们添加了一个信号生成器(代码库改编自 https://github.com/bbrzycki/setigen),将这些信号添加到训练集中。我们调整了概率(p=0.01)并随机化了形状和信噪比,以获得最大的 LB 分数,同时确保 CV 分数保持不变。下方展示了这种注入信号的示例。
许多人在比赛结束前几周注意到了我们在公共排行榜分数的大幅跳跃。我们已经达到了接近 0.800 的相当不错的分数,当时在 LB 上排名第二,我们非常有信心进一步改进我们的解决方案,因为我们当时只是提交非常简单的单折融合,甚至还没有关注像伪标签这样在本次比赛中看起来很有希望的进一步改进。为了进一步改进我们的解决方案,我们继续调查注入 s 形信号后仍然存在的巨大 CV/LB 差距。
本次比赛一个明显的方面是训练数据和测试数据之间的背景非常不同。这不仅通过视觉检查或简单的二元分类器可以明显看出(它们可以轻松区分训练和测试),而且从我们进行的早期伪标签实验中也可以看出。在这里,我们只从测试集中添加了非常确定的 target=1 样本到训练集,虽然 CV 看起来不错,但我们的模型突然只对整个测试集预测 target=1,这意味着模型完美地学习到了 target=1 总是来自测试集。
所以我们开始推测,模型有时过于关注背景而不是信号。在下图中,我们展示了按训练相似性分组的输出 logits 直方图。这里的训练相似性仅基于图像数据(均值、标准差、唯一计数、最小值、最大值),但很明显,如果模型“认识背景”,它们会更加确定。因此,我们探索了减少背景噪声影响或减少对背景噪声过拟合的方法。
进一步的调查表明,甚至一张图像与另一张图像之间存在显著的重叠。这意味着如果模型对于某个背景只看到 target=0 或 target=1,它也可能潜在地过拟合到单个背景。作为这项调查的结果,我们决定尝试从数据中移除一些常见的背景伪影(即清理数据),以增加信号并减少噪声和过拟合潜力。
然而,由于逐图像通道归一化,利用这一特性绝非易事。不能仅仅比较一张图像与另一张图像的原始值。为了允许图像之间的比较,我们按列归一化,并计算每张图像第一列与所有其他图像和列的平均像素差异。由于舍入误差和列中可能存在的信号,我们接收到的列距离大于 0。我们利用重叠来提高信噪比,方法是用多个匹配样本之间归一化区域的差异替换原始数据。这会导致匹配样本中存在的信号产生阴影(差异远小于 0),我们的模型能够将其与实际信号区分开来。在下图中,显示了两个样本之间归一化重叠区域的差异。黄色针状图(值 > 0)源自样本 1,蓝色针状图(值 < 0)源自匹配样本。
基于这个过程,我们尝试在可能的情况下清理所有图像;请看以下示例:
带有信号的原始样本:

带有信号的清理后样本:

不带信号的原始样本:

不带信号的清理后样本:

最初,当我们开始清理数据时,我们只是快速尝试使用在未清理数据上训练的现有模型,并用清理