不进行交叉验证,仅依赖公开排行榜。实际上这样做效果很好。早期我尝试构建交叉验证,甚至浪费大量提交次数来进行排行榜探测。后来我发现交叉验证只是浪费时间。我假设未标注的声景、公开测试集和私有测试集在后续具有相似的数据分布。
仅使用 cutmix 和 mixup。仅使用一个模型并对时间和频率进行 mask 会导致过拟合。传统的数据增强往往会导致训练数据过拟合,因为它让模型对来自同一音频片段(单一领域知识)的数据输出相同的表示。而像 mixup 这类方法具有一定的跨领域知识,因为数据来自不同的音频片段。(不太确定,只是猜测)
与去年模型几乎相同。加入瓶颈层,使表示更紧凑。
self.bottleneck_layer = nn.Sequential(
nn.Linear(backbone_out, cfg.bottleneck_dim),
nn.BatchNorm1d(cfg.bottleneck_dim),
nn.ReLU())
bottleneck_dim=1024(实际上 512 更好)。这可以略微提升分数(不到 0.01)。
以 eca_nfnet_l0 为骨干网络并使用上述技巧,我的基线公开分数为 0.65(接近 0.66)。
出自论文《对协变量位移的最优表示》。
说实话,我不太理解其中的数学原理(如果感兴趣可以阅读论文)。实际上,它把数据领域作为标签(在我们的例子中,训练数据:0,未标注声景:1),把瓶颈层的输出作为特征进行 SupCon 学习。总损失是传统的 BCE 损失 + 权重 × SupCon 损失。权重和 SupCon 损失中的温度参数根据公开排行榜进行调节。
| 权重 | 公开 | 私有 |
|---|---|---|
| 1e-2 | 0.56 | 0.57 |
| 1e-3 | 0.66 | 0.63 |
| 1e-4 | 0.68 | 0.66 |
| 1e-5 | 0.65 | 0.64 |
| 温度 | 公开 | 私有 |
|---|---|---|
| 0.07 | 0.62 | 0.62 |
| 0.09 | 0.65 | 0.65 |
| 0.10 | 0.68 | 0.66 |
| 0.11 | 0.65 | 0.66 |
在早期阶段,BCE 损失占主导,随后 SupCon 损失开始起作用。
将预测与前后窗口进行平均。提升幅度取决于具体情况(0.01–0.02)。
我最好的集成实际上是两个使用不同数据划分和 SupCon 损失权重的 eca_nfnet_l0,在私有集上得分为 0.68,但我没有选择它。我进一步将这两个模型与 tf_efficientnetv2_b0(公开 0.65,私有 0.62,带时间与频率 mask)以及 rexnet_100(公开 0.63,私有 0.64)进行集成。由于时间不足,没有足够的微调这两个模型,也许它们还能提升。
这次比赛非常困难。在领域自适应/泛化排行榜 Domainbed 上,简单的基线很难被超越。在目前的学习表示方法中,没有一种能够普遍超越基线。我认为这就是大赛出现大幅波动的原因,也是公开笔记本比经过精心训练的模型表现更好的原因。