首先,感谢组织者举办这次比赛,恭喜所有获奖团队!
今年比赛的开端并不容易。起初使用去年的模型和训练方法效果不佳。几乎所有能提升本地 CV 的尝试都无法提高甚至降低了公开榜分数,我无法让单模型超过 0.64 AUC 或集成模型超过 0.69。
在几乎想要放弃的时候,我从头开始,使用了 @salmanahmedtamu 的公开 Notebook,并遵循了 @lihaoweicvch 讨论的 方法。感谢分享!
这使得单模型性能达到了 0.65/0.66 AUC。
原始 Notebook 使用了:
从这个基线开始,我尝试了不同的骨干网络、超参数、增强方法和图像大小。该模型的一个主要缺点是提交时间相对较长(> 1 小时)。因此,除了提高分数外,另一个目标是减少推理时间以容纳更多集成模型。为此,我 switched 到 EfficientNet B0 骨干网络 (tf_efficientnet_b0_ns) 并减小了图像大小。结果表明,关于 LB 分数 (0.62-0.66) 的结果相当不稳定,并且对 Mel 参数和输入大小的不同组合很敏感。但经过进一步调整,我能够创建推理时间低于 12 分钟的模型,同时保持约 0.65 AUC 的分数。
对原始 Notebook 的主要更改包括:
创建检查点平均遵循 model soups 的思想。但在这里,如果同一模型在不同 epoch (13-50) 的检查点权重在其中一个跟踪指标 (LRAP, cMAP, F1, AUC) 上显示出本地 CV 分数的提升,则对这些权重进行平均。这导致了更稳定甚至有时更好的 LB 分数。
通过上述所有修改,我现在能够创建一个由 6 个模型组成的集成,在公开榜上达到 0.70 AUC。虽然不是很好,但足以开始尝试使用从未标记数据集创建的伪标签。
使用来自测试域的伪标签及其在训练过程中的处理是进入 leaderboard 前 10 名的关键要素。伪标签是通过将具有最佳公开榜分数的模型集成应用于未标记数据,为每个文件的每个 5 秒间隔创建预测而生成的。
之后,在下一阶段的训练期间,从未标记测试集中随机选择的 5 秒音频片段以 25% 到 45% 的概率添加到训练样本中。在混合两个音频信号之前,两个波形的振幅都乘以一个随机因子。
训练样本的目标向量(主要和次要物种位置为 1.0,其余全为零)与伪标签(包含预测概率的向量)结合,通过取两者的最大值形成新的目标向量。
这种使用伪标记测试数据的方法结合了几个优势:
集成伪标签后,LB 分数显著增加。然后再次使用新的集成来创建一组新的伪标签。这个循环重复了 3 次,以迭代提高模型/集成性能。LB 分数 (公开 | 私有) 的进展如下表所示:
| 阶段 | 伪标签 | 单模型 (ID 4) | 集成 |
|---|---|---|---|
| 0 | - | 0.65735 | 0.59270 | 0.70065 | 0.61738 |
| 1 | 来自阶段 0 集成 | 0.69165 | 0.66119 | 0.71090 | 0.67084 |
| 2 | 来自阶段 1 集成 | 0.69936 | 0.67445 | 0.72528 | 0.69035 * |
| 3 | 来自阶段 2 集成 (归一化) | 0.71154 | 0.67683 | 0.71716 | 0.69527 |
在第 2 次迭代后,伪标签需要一些归一化(缩放到 0…1 范围),以便进行稳定的模型训练,因为标签最小值变得太大。此外,阶段 3 集成未被选用于最终排名,因为不幸的是公开榜分数没有显示出预期的改进。
第 2 名集成(上表中的第 2 阶段)的模型性能和参数如下表所示:
| 参数/模型 ID | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| seed | 42 | 42 | 42 | 42 | 70 | 42 |
| n_folds | 5 | 5 | 5 | 5 | 10 | 5 |
| fold | 4 | 1 | 4 | 4 | 0 | 4 |
| dataset | bc24 | bc24 | bc24 | bc24 | bc24+ | bc24 |
| n_mels | 128 | 128 | 128 | 64 | 64 | 64 |
| hop_length | 512 | 512 | 1024 | 1024 | 1024 | 1024 |
| image_height | 256 | 256 | 128 | 64 | 64 | 64 |
| image_width | 256 | 256 | 128 | 128 | 128 | 64 |
| pseudoLabelChance | 35 % | 40 % | 45 % | 30 % | 30 % | 25 % |
| ampExpMin | -0.5 | -1.0 | -0.5 | -0.5 | -0.5 | -0.5 |
| ampExpMax | 0.1 | 0.2 | 0.1 | 0.1 | 0.1 | 0.1 |
| 推理时间 | ~ 50 分钟 | ~ 50 分钟 | ~ 17 分钟 | ~ 12 分钟 | ~ 12 分钟 | ~ 11 分钟 |
| 公开 LB 分数 | 0.73270 | 0.71975 | 0.71104 | 0.69936 | 0.69124 | 0.69309 |
| 私有 LB 分数 | 0.68521 | 0.68533 | 0.68116 | 0.67445 | 0.64543 | 0.65862 |
集成中的模型多样性是通过不同的 Mel 参数、数据子集、图像大小、添加伪标签的概率以及改变训练和伪标签数据之间音量关系的振幅因子来实现的。参数 ampExpMin 和 ampExpMax 提供了乘以训练和伪标签样本以改变混合中音量的随机振幅因子的范围:ampFactor = 10**(random.uniform(ampExpMin,ampExpMax))
模型 5 是唯一使用外部数据的模型。为此,从 Xeno-Canto 下载了竞赛中 182 个物种的额外文件,并将每个文件的前 5 秒部分添加到训练集中(如果太短则用零填充)。
模型集成 simply 通过取每个单模型预测的平均值(sigmoid 输出的概率)来实现。最后一步,对于每个文件,给定窗口的预测与相邻两个窗口的预测相加,因子为 0.5。此后处理方法由 @theoviel 及其团队在 Cornell Birdcall Identification 竞赛的 第 3 名解决方案 中使用。
太多的事情了 ;) 不幸的是,我在比赛较晚的时候才发现使用伪标签的好方法。一些截止期后的提交表明,如果包含伪标签,许多起初无效的方法实际上非常有利于提高私有榜分数。希望在下一届比赛中继续这些实验……