返回列表

9th place recap

612. BirdCLEF 2024 | birdclef-2024

开始: 2024-04-03 结束: 2024-06-10 生命科学 数据算法赛
第九名经验总结

第九名经验总结

作者:Aphysict(Kaggle Master) | 排名:第 9 名

验证策略

不进行交叉验证,仅依赖公开排行榜。实际上这样做效果很好。早期我尝试构建交叉验证,甚至浪费大量提交次数来进行排行榜探测。后来我发现交叉验证只是浪费时间。我假设未标注的声景、公开测试集和私有测试集在后续具有相似的数据分布。

数据增强

仅使用 cutmix 和 mixup。仅使用一个模型并对时间和频率进行 mask 会导致过拟合。传统的数据增强往往会导致训练数据过拟合,因为它让模型对来自同一音频片段(单一领域知识)的数据输出相同的表示。而像 mixup 这类方法具有一定的跨领域知识,因为数据来自不同的音频片段。(不太确定,只是猜测)

来自《对协变量偏移的最优表示》的精美图片

模型设计

与去年模型几乎相同。加入瓶颈层,使表示更紧凑。

self.bottleneck_layer = nn.Sequential(
    nn.Linear(backbone_out, cfg.bottleneck_dim),
    nn.BatchNorm1d(cfg.bottleneck_dim),
    nn.ReLU())

bottleneck_dim=1024(实际上 512 更好)。这可以略微提升分数(不到 0.01)。

以 eca_nfnet_l0 为骨干网络并使用上述技巧,我的基线公开分数为 0.65(接近 0.66)。

对比对抗域(CAD)瓶颈

出自论文《对协变量位移的最优表示》。

模型结构

说实话,我不太理解其中的数学原理(如果感兴趣可以阅读论文)。实际上,它把数据领域作为标签(在我们的例子中,训练数据:0,未标注声景:1),把瓶颈层的输出作为特征进行 SupCon 学习。总损失是传统的 BCE 损失 + 权重 × SupCon 损失。权重和 SupCon 损失中的温度参数根据公开排行榜进行调节。

权重 公开 私有
1e-2 0.56 0.57
1e-3 0.66 0.63
1e-4 0.68 0.66
1e-5 0.65 0.64
温度 公开 私有
0.07 0.62 0.62
0.09 0.65 0.65
0.10 0.68 0.66
0.11 0.65 0.66
训练SupCon损失

在早期阶段,BCE 损失占主导,随后 SupCon 损失开始起作用。

后处理技巧

将预测与前后窗口进行平均。提升幅度取决于具体情况(0.01–0.02)。

模型集成与选择

我最好的集成实际上是两个使用不同数据划分和 SupCon 损失权重的 eca_nfnet_l0,在私有集上得分为 0.68,但我没有选择它。我进一步将这两个模型与 tf_efficientnetv2_b0(公开 0.65,私有 0.62,带时间与频率 mask)以及 rexnet_100(公开 0.63,私有 0.64)进行集成。由于时间不足,没有足够的微调这两个模型,也许它们还能提升。

无效的方法(主要是过拟合)

  • 预训练(在 2022 与 2023 数据上,也许应该尝试在未标注声景上进行预训练)
  • 知识蒸馏(仅在训练数据上尝试,也许应该在未标注声景上进行知识蒸馏)
  • Entmin(完全无用)
  • DANN(没有改进)
  • Focal loss(单独使用确实有效,但与 CAD 结合没有改进)

最终思考

这次比赛非常困难。在领域自适应/泛化排行榜 Domainbed 上,简单的基线很难被超越。在目前的学习表示方法中,没有一种能够普遍超越基线。我认为这就是大赛出现大幅波动的原因,也是公开笔记本比经过精心训练的模型表现更好的原因。

同比赛其他方案