553. BirdCLEF 2023 | birdclef-2023
大家好,Kagglers!
让我们开始探索鸟类音频数据与建模的奇妙世界,但在开始前,有几句非常重要的话要说:
我要感谢乌克兰武装部队、乌克兰安全局、乌克兰国防情报局和乌克兰国家紧急服务局,感谢他们提供安全保障,使我能够参与这场精彩的竞赛,完成这项工作,并帮助科学、技术和商业继续前进。
我成功运行了294个实验:其中一半使用5折交叉验证,另一半使用全数据训练。所以总体而言,我们验证了许多假设,当然,大多数都被拒绝了 :) 让我们来一探究竟。
如果您查看 train_metadata["primary_label"].value_counts(),您会注意到一些奇怪的最大魔法数字:
barswa 500
wlwwar 500
thrnig1 500
eaywag1 500
comsan 500
...
lotcor1 1
whctur2 1
whhsaw1 1
afpkin1 1
crefra2 1
Name: primary_label, Length: 264, dtype: int64
为什么某些物种最多只有500个代表?我不知道100%确定的答案,但我有一个强有力的假设——XC API 中存在一个bug。我无法准确回忆起代码中的具体位置,但整体问题出在数据加载流程中。它的工作方式如下:
但如果您某个物种有超过500个文件——在第一阶段,您会有多个JSON文件(每个JSON元文件最多包含500个文件),这就是问题所在!在第二阶段,API只考虑每个物种的一个JSON文件,而忽略后续的文件,因此每个物种最多只能获得500个文件。
注意:我不确定最新版本中是否已修复此问题,但我使用的是去年的提交版本,当时确实存在这个问题。
从这个bug我们可以清楚地看到,使用修复后的API可以极大地丰富我们的训练数据集。
为了使验证更加稳健:
从2023/2022/2021/2020竞赛数据加上Xeno-Canto数据中,我只选择了今年主要标签的文件,并将它们添加到最终训练阶段。
当我在最终训练阶段只使用2023年训练数据时,在2022/2021/2020竞赛数据上进行预训练极大地提升了分数。但在添加额外训练数据后,预训练在排行榜上不再奏效(尽管它仍然提高了本地验证分数)。在最后一周,我决定重新进行预训练实验。这使我在公共排行榜上上升了一位,在私人排行榜上上升了两位——所以,Kagglers们,别忘了重新审视那些被拒绝的假设 :)
为什么以及何时它开始有效?与之前的预训练实验相比,我做了以下改进:
我选择了nocall区域,并将它们用作背景增强。
终于!我们不必在完全不同的训练数据上选择阈值,不必想出超级复杂的方案,也不必跌落19个名次(就像我在2021年那样)
我使用了与往年竞赛几乎相同的验证方案:
重要提示:对于Padded cmAP,取各折的平均值非常重要,而不是做Out Of Fold!!!
当然,CV和LB的绝对数值是不同的:
但排名相关性相当好。CV提升0.0x(及以上)会导致LB提升。我几乎所有实验都有CV结果,所以希望有时间发表一篇详细的消融研究和CV-LB相关性研究的论文。
我看了@philippsinger的演讲,才明白自己一直在严重过拟合。
由于时间和设备的限制,我选择了以下方案:
训练细节:
sample_weights = (
all_primary_labels.value_counts() /
all_primary_labels.value_counts().sum()
) ** (-0.5)阶段:
由于计算限制,我们无法使用深度学习的金科玉律:堆叠更多层!
所以我研究了一些推理优化技术:
总的来说,我的最终提交是由3个声音事件检测(SED)模型集成的,其骨干网络如下:
为不同架构调整起始学习率非常重要!!!
我对增强的选择非常挑剔,所以我的最终模型使用了以下增强:
pred = (pred**2).mean(axis=0) ** 0.5所有这些只带来了边际改进,但正是前三名的关键 :)
这个部分将远不完整,但让我添加一些我现在想到的内容:
希望您读到这里时还没有睡着。最后,我要感谢整个Kaggle社区,祝贺所有参与者和获胜者。特别感谢康奈尔鸟类学实验室、LifeCLEF、谷歌研究、Xeno-canto、@stefankahl、@tomdenton、@holgerklinck。你们所有人都在讨论中非常活跃,分享了数据集和有趣的材料,回答了所有问题,当然,还准备了如此酷的竞赛!