返回列表

39th place solution [top1 at public]

399. Cornell Birdcall Identification | birdsong-recognition

开始: 2020-06-15 结束: 2020-09-15 环境监测 数据算法赛
第39名解决方案 [Public LB 排名第1]

第39名解决方案 [Public LB 排名第1]

作者: Iafoss | 团队: YuryBolkonsky, Kirill Shipitsyn, ll, Iafoss, KhanhVD

摘要

  1. 噪声是关键
  2. 测试集可能是以 16 kHz 采样率录制的
  3. 通过 logsumexp 池化将序列预测转换为全局和 5 秒块的预测(在 20-40 秒片段上训练,在完整文件上推理)
  4. 对整个序列应用多头自注意力机制

祝贺所有参与者,并感谢主办方举办这次比赛。同时,我要感谢我的队友们与我一起应对这一挑战。下面我将分享我们解决方案中使用的一些想法。由于我在本次比赛中使用的方法与大多数人截然不同,我决定针对我的部分写一份说明。

数据探究

这可能是最重要的事情,尤其是对于这样的比赛。
测试集可能是以 16 kHz 采样率录制的。请看测试数据的示例:
Test Spectrogram 8 kHz 以上存在频率间隙,这可能表明数据是以 16 kHz 采样率录制然后上采样到 32 kHz,或者使用了某种噪声滤波器(这不太可能)。同时,1 kHz 以下的噪声太高,无法识别任何内容。因此,我选择使用 128 个 mel 滤波器组,选择了 1-8 kHz 范围作为 mel 频谱图。根据 CV(交叉验证)分数的下降,8 kHz 以上的频率可能很重要,但它们不存在于测试数据中,高 CV 分数可能会产生误导。如果使用 8 kHz 以上的频率,模型可能会学习测试集中不存在的特征。

噪声是关键。上面描述的测试数据噪声很大,信号总强度比训练集弱(而训练集和测试集中的噪声+信号总和相似)。因此使用了几种方法:添加白噪声,以及使用 @theoviel 提取并发布在 这里 的测试集噪声。在第二种情况下,训练信号乘以一个限制在 [0.1,1] 范围内的 lambda 为 0.25 的指数随机变量,并添加到从连接的噪声数组中随机选择的测试噪声块中。
Noise Comparison 生成的训练样本看起来与测试样本非常相似(下图)。同时,原始训练数据(上图)具有许多在高噪声水平下无法识别的特征,这容易导致创建一个 CV 表现好但在测试集表现差的模型。即使只用噪声训练几个 epoch 也能显著提高模型质量,因此测试样本上的前 5 个预测开始变得有意义:
Noise Effect

模型

我使用了与大多数参与者截然不同的方法,我在下面示意性地描述:
Model Architecture 我没有处理 5 秒的片段,而是处理序列:训练时使用 20 秒和 40 秒,推理时使用整个音频。我将频率域折叠为大小为 1 的维度,然后将生成的张量视为序列,并对其应用多头自注意力块,就像在 Transformers 中一样。生成的步长约为 0.3 秒的输出通过 logsumexp 池化合并,以生成整个音频片段的预测或在测试集上运行时的 5 秒间隔预测。在训练期间,损失是基于全局标签计算的。我在下面附上了几个示例,显示了我最佳模型对两个测试样本前 40 秒的前 5 类预测随时间的变化。

同比赛其他方案