432. Shopee - Price Match Guarantee | shopee-product-matching
恭喜所有的获奖者,感谢主办方提供了这个有趣的数据集,也感谢 Kaggle 组织了这场比赛!同时,非常感谢我的队友 @limerobot,他总是能提出绝妙的想法并且从不放弃。我从他身上学到了很多东西。
标题定为“从嵌入到匹配”,因为我们通过正确利用图像/文本嵌入来搜索匹配项获得了巨大的 CV(交叉验证)/ LB(排行榜)提升。另一方面,单个模型的改进帮助较小,也就是说,当我们有了不错的模型后,“从输入到嵌入”这一步的重要性就降低了。即使每个图像/文本模型的 CV 增加了很多,集成后的 CV 和 LB 也没有增加多少。
我将首先分享我们在公共排行榜上的得分历史。我只写下那些显著提高我们分数的内容。请注意,模型/训练优化也在此处提高了分数。
现在我将详细介绍我们的解决方案。
我们使用了来自 timm 的两个 eca_nfnet_l1 作为图像编码器,以及来自 huggingface 的 xlm-roberta-large、xlm-roberta-base、cahya/bert-base-indonesian-1.5G、indobenchmark/indobert-large-p1、bert-base-multilingual-uncased 作为文本编码器。
我们使用 ArcFace 来训练模型。在从图像/文本编码器进行池化后,我们应用了批归一化和特征归一化来输出嵌入。按照 ArcFace 论文,归一化的嵌入与归一化的权重矩阵相乘以产生余弦值,然后我们应用弧度边距和 softmax。
这是我们两人第一次使用 ArcFace,所以起初我们在调整它时遇到了困难。足够大的边距对嵌入的质量很重要,但当我们增加边距时,模型会遇到收敛问题。我们找到了几种克服这个问题的方法,并最终应用了这些选项。
图像模型的最佳边距为 0.8~1.0,文本模型为 0.6~0.8。当使用增加边距的方法时,我们从 0.2 的边距开始,增加到图像模型的 1.0 和文本模型的 0.8。
此外,我们尝试了类大小自适应边距,这在 Google 地标识别竞赛方案 (论文链接) 中被引入。图像模型最好将边距设置为 class_size^-0.1,文本模型设置为 class_size^-0.2。然而,由于类别比 Google 地标识别竞赛更平衡,改进并不明显。
对 cosine head 使用更大的学习率和使用梯度裁剪不仅使模型收敛,还稍微提高了 CV 分数。
在全局平均池化之后添加额外的全连接层会损害模型性能,而在特征归一化之前添加批归一化则提高了分数。
本次比赛中我们有图像和文本输入,因此很好地