419. Rainforest Connection Species Audio Detection | rfcx-species-audio-detection
大家好,我想快速分享一下我的解决方案,以防有人感兴趣。
在我看来,关键问题在于存在大量缺失的标签。提供的正样本数据 (train_tp.csv) 只有约 1.2k 个标签。@cpmpml 做的 LB 探测显示平均每个片段有 4-5 个标签。如果训练数据遵循相同的分布,我们应该预期有约 21k 个标签,而这仅仅是片段层面的。我们预期会在同一个片段中听到同一只鸟的多次叫声,即每个片段标签对应多个帧标签。我最好的模型似乎认为标签数量接近 40k。
所以我的想法是做一些类似于 Noisy Student 的工作,其总体思路是进行渐进式伪标签化,每个后续的模型都更大,并且对训练数据施加更多的噪声。单靠 Noisy Student 效果并不是很好,所以我使用了其他一些技巧。
我的第一个设置看起来与 Mean Teachers Find More Birds 中的非常相似。我使用一致性损失和 BCE 损失,在居中的正样本和随机无标签样本的组合上进行训练。在这里,我使用了 SED + resnet34 和一些轻量级增强:高斯噪声、帧/频率 dropout。这让我在公共 LB 上达到了 0.865。
使用 5 折 mean-teacher 模型,我进行 OOF(Out-of-Fold)预测以获取整个训练数据集上的伪标签。
现在我想在伪标签上进行训练,但可以安全地假设它们噪声很大。为了处理新噪声标签引入的偏差,我做了一些类似于 Co-Teaching 的工作。简而言之,想法是在相同的数据上同时训练 2 个模型,但对每个模型应用不同的增强。然后,在模型 B 中进行反向传播时,忽略模型 A 损失最高的样本,反之亦然。被忽略样本的百分比会缓慢增加。理论是模型会在训练早期学习正确的标签,并在后期开始过拟合噪声。通过丢弃潜在的噪声标签,我们避免了从伪标签中引入不良偏差。
针对比赛,我稍微修改了作者的想法。在我的设置中,任何一个模型都不可能忽略来自 train_tp 或 train_fp 的良好标签。只有伪标签可以被忽略。我相信这有助于解决类别不平衡问题。
使用这个设置,配合更激进的增强和 densenet 121,我能够在公共 LB 上达到 0.906。
最后,使用第二轮生成的伪标签,我从所有训练数据中随机采样片段进行训练。在这里,我应用了更激进的增强,并在 60% 的时间里添加了 mixup,混合权重从 Beta(5,5) 中采样(通常在 0.5 左右)。对于 mixup,任一音频片段中存在的任何标签都被设置为 1.0。我运行了 80 个 epoch。之前的 2 个模型运行了大约 32 个 epoch。使用 densenet 121 的 5 折集成设置让我在公共 LB 上达到了 0.940。
通过对约 90 个模型取几何平均进行集成,我能够达到 0.943。
augmenter = A.Compose([
A.AddGaussianNoise(p=0.5, max_amplitude=0.033),
A.AddGaussianSNR(p=0.5),
A.FrequencyMask(min_frequency_band=0.01, max_frequency_band=0.5, p=0.5),
A.TimeMask(min_band_part=0.01, max_band_part=0.5, p=0.5),
A.Gain(p=0.5)
])