返回列表

13th place solution - How I survived the shakeup

473. PetFinder.my - Pawpularity Contest | petfinder-pawpularity-score

开始: 2021-09-23 结束: 2022-01-14 计算机视觉 数据算法赛
第13名方案 - 我如何在震荡中幸存

第13名方案 - 我如何在震荡中幸存

作者:Oleg Sidorshin (MASTER) | 比赛排名:第13名 | 发布时间:2022-01-15

公共榜排在400名开外,私有榜最终排名第13,让我们开始吧!

训练与验证

本次比赛中CV(交叉验证)与LB(排行榜)的相关性非常差,因此我决定专注于尽可能提高我的CV分数。我使用了10折分层交叉验证,目标值被分箱为20个bins,这比单纯使用KFold或基于目标的Stratified KFold提高了稳定性。

我在任何地方都没有使用早停,因为我担心这会给我带来严重偏差的OOF(袋外)分数,这会让我的CV更加不可靠。与其寻找OOF分数最好的模型,我更专注于寻找好的训练机制,以获得最佳且最稳定的平均CV分数。

在优化方面,使用带有余弦退火线性预热计划的AdamW效果不错。训练通常进行3-5个epoch。

模型集成

像比赛中的许多人一样,我一开始使用Swin模型,但后来更多地关注集成,并尝试了不同的模型(包括Transformer和CNN)。最终的集成模型如下:

模型名称 CV分数 (含水平翻转TTA)
swin_large_patch4_window7_224 17.520346
swin_large_patch4_window12_384 17.459443
swin_large_patch4_window12_384 CE loss 17.434677
vit_large_patch16_224 17.793921
vit_base_patch16_384 17.803793
ig_resnext101_32x8d 18.08631
tf_efficientnet_b4_ns 18.158774
Ridge OOF 集成 17.134049

最好的模型是使用交叉熵损失的swin_large_patch4_window12_384,加入ViT和ResNext确实提高了最终的集成分数。

最终集成是使用Ridge回归对OOF分数进行的。

损失函数

我尝试了不同的损失函数——MSELoss、L1Loss和HuberLoss效果都很差,BCELoss总体上最好。我还尝试使用多类交叉熵损失,将目标分箱为20个bins,并预测每个bin的平均值/中心值。这种情况有时效果不错——最好的模型就使用了它,但总体上它需要相当多的额外训练机制调整,并且在其他模型上效果不佳(或者我只是找不到适合它们的好的训练机制)。此外,出于某种原因,这个损失函数非常讨厌mixup(我尝试了不同的方法来使用它,确实如此)。

最后的笔记和建议

  • 专注于提高CV!
  • 在我看来,如果不小心使用,早停可能是有害的
  • Batch size为8在泛化能力上优于16或32(下次尝试降低batch size)
  • 尝试不同的模型并检查OOF集成分数,有时即使是CV分数相对较差的模型也能真正改善你的集成效果
  • 来自另一个Petfinder比赛的外部数据没有用处(在重叠数据上,Pawpularity与AdoptionSpeed、猫/狗或品种数据的相关性非常低(大约1500张图片))
  • CLIP标签没有用处(ImageNet预训练模型已经能很好地预测猫/狗甚至它们的品种)
同比赛其他方案