419. Rainforest Connection Species Audio Detection | rfcx-species-audio-detection
感谢 Kaggle 和主办方提供了这个非常有趣且设置巧妙的比赛。一如既往,这是一次伟大的合作努力,也请给 @christofhenkel 和 @ilu000 点赞。在下文中,我们将简要介绍我们的获胜方案。
我们的解决方案是多个 CNN 的集成,这些 CNN 以录音的梅尔语谱图表示作为输入,并使用“弱标签”在录音级别进行预测,或使用“硬标签”在更细粒度的时间级别进行预测。我们建模的关键在于将掩码作为损失函数的一部分,仅计算提供的注释部分的损失。为了解决大量缺失注释以及训练数据和测试数据标记方式不一致的问题,我们对模型预测应用了复杂的缩放处理。
正如大多数参与者所知,与测试数据相比,训练数据的标记方式存在显著差异,且训练标签非常稀疏。因此,建立一个合适的验证设置非常棘手,几乎是不可能的。我们尝试了很多方法,例如在计算 LWLRAP 时将所有前 3 个预测标签视为 TP(因为我们知道平均一段录音有 3 个 TP),或者仅在我们知道标签的片段上计算 AUC(掩码 AUC),但最终我们发现与公共 LB 没有良好的相关性。这意味着我们必须完全依赖公共 LB 作为选择模型和提交的反馈。值得庆幸的是,这是从完整测试集中随机拆分出来的,否则其他任何方式可能都没有太大意义。
值得注意的是,对于大多数模型,我们还在 GPU 上执行了梅尔语谱图转换和增强(如 mixup 或粗粒度 dropout),使用的实现可以在 torchlibrosa 中找到 (https://github.com/qiuqiangkong/torchlibrosa/blob/master/torchlibrosa/stft.py)。
我们的最终模型包含硬标签模型和弱标签模型,具体解释如下。
我们将硬标签定义为在录音内部具有硬时间边界的标签。我们的硬标签模型在提供的 TP(目标 = 1)和 FP(目标 = 0)标签上进行了训练,并采用了时间感知损失评估。我们将可变时间长度的对数语谱图张量作为 EfficientNet 骨干网络的输入,并将池化层限制为仅在频率轴上进行平均池化。池化后,每个物种的输出有 24 个通道和一个时间维度。
然后,我们将模型的时间轴映射到 TP 和 FP 的时间标签,并仅对具有提供标签的部分评估 BCE 损失。对于所有其他片段(实际上是大多数),损失被忽略,因为我们对那里是否存在物种没有先验知识。在下图中,我们展示了掩码标签的样子:黄色表示目标=1,绿色表示目标=0,紫色表示忽略。
对于某些模型,我们添加了训练集的手工标记部分,但在标记被 TP/FP 检测器遗漏的物种时,收益递减,这让我们想知道测试标记是如何完成的。此外,我们想知道背景歌曲的切割点在哪里(例如,物种 2 在几段录音的背景中有一些叫声,但这些部分被标记为 FP)。最值得注意的是,为物种 18 添加 TP 标签使 LB 分数大幅提升,我们相信在混合模型中加入一些手工标签有助于多样性和泛化。
对于某些模型,与其他表现顶尖的团队类似,我们训练了第二阶段,其中我们将标签的掩码部分替换为第一阶段的伪预测,但以 0.5 的因子进行降权。这里与其他团队的主要区别在于,我们以与缩放测试预测相同的方式缩放伪预测。
作为增强,我们使用了 lambda=3 的 mixup、SpecAugment 和高斯噪声。
这部分混合中的模型基于弱标签模型。输入是音频录音完整 60 秒的对数语谱图,包括该片段的所有标签。因此,它直接适应需要进行最终预测的格式。由于标签缺失,仅拟合已知的 TP 效果不佳,因为我们本质上引入了错误的标签。我们也无法使用 FP,因为即使 FP 可能存在于录音的一部分,并不意味着另一位置可能没有 TP。
因此,这里拟合的模型包括来自我们硬标签模型的伪标签(见上文)以及一些部分手工标签。对于伪标签,我们获取硬标签模型的原始输出,但将其缩放到我们预期的真实分布(见后处理)。对于