返回列表

4th Place Solution

432. Shopee - Price Match Guarantee | shopee-product-matching

开始: 2021-03-09 结束: 2021-05-10 商品理解 数据算法赛
第4名解决方案

第4名解决方案

作者: Pascal Pfeiffer | 团队: Psi, Pascal Pfeiffer, Dieter | 排名: 第4名

简介

感谢 Kaggle 和主办方举办了这场非常有趣的比赛,比赛设置颇具技巧性,并且为实验和调优提供了很大的空间。一如既往,这是一次伟大的合作成果,也请大家为 @christofhenkel@philippsinger 点赞。在下文中,我们将简要概述我们的解决方案。

设置与交叉验证 (CV)

最初,虽然按 label_group 进行分割在 LB/CV 一致性方面表现不错,但在比赛后期,随着模型变得更好,特别是引入了集成和后处理方法后,找到一个好的 CV 变得越来越难。

因此,我们关注了三个不同的 KPI:

  1. 在 OOF(Out-of-Fold)上评估的 F1 分数。
  2. 在 OOF 上评估 F1 分数,但同时使用折叠内嵌入作为噪声。
  3. 在 OOF 上评估 F1 分数,使用折叠内嵌入作为噪声,并对假阳性加权 2 倍。

方法 2 和 3 已知存在泄露问题,因为我们混入了折叠内嵌入,这些嵌入可能比 OOF 嵌入更容易区分。此外,它们会有更好的交叉链接,这为特定的后处理方法增加了额外的泄露。方法 1 没有泄露,但在 5 折验证中,我们评估的行数少于 7k(约占测试集的 10%)。这样无法进行合理的参数调优,而且某些后处理方法在小数据集上表现出色,但在大数据集上会失效(例如总是选择排名第 2 的预测)。因此,我们通常同时查看所有这些验证方法,并主要在方法 3 上调整阈值参数。

模型

在最终提交中,我们使用了基于 Bert 的文本编码器和具有不同主干网络(主要是 nfnet, effnet)的图像编码器。正如许多其他团队一样,我们确实看到在调整训练和主干网络时单模型有一些改进,但在融合模型中,这种效果几乎微乎其微,我们在那里遇到了瓶颈。在主干网络之后,使用了 GeM 和 Avg 池化。Neck 部分由一个用于维度调整的线性层组成,随后是批归一化和 PReLu 激活函数。我们的嵌入长度通常在 1024 左左右,较大的嵌入在 CV/LB 上得分略高。我们还将 Tfidf(字符和词)添加到嵌入组合中,尽管 CV 变化不大,但似乎在 LB 上提高了一些分数。由于 Tfidf 生成非常大的嵌入,且我们在内核中受到 RAM 和 VRAM 的限制,我们使用随机稀疏投影来减少维度。

single_models

我们使用 ArcFaceLoss 训练了图像和文本模型。ArcFace margin 需要根据模型进行大量调整,我们也发现 batch size 在训练期间很重要。一些模型似乎对学习率非常敏感,正如其他人报道的那样,梯度裁剪可能也有助于稳定训练。

集成

在我们的集成中,我们将图像嵌入、文本嵌入(基于 bert)和 tfidf 嵌入进行拼接并归一化。针对这些向量,我们计算成对余弦相似度,得到三个矩阵(图像 cossim、bert cossim、tfidf cossim)。我们将这三个矩阵结合,首先对它们进行平方,然后取加权平均值。

ensemble

后处理

虽然在使用适当阈值的情况下,平均后的 cossim 矩阵已经让我们在金牌区获得了非常有竞争力的分数,但我们仍然应用了几个后处理步骤来挤出更多的分数。最大的贡献者是:

  • 阈值处理
  • Rank2 匹配(如果 A 的排名第 2 是 B,且 B 的排名第 2 是 A,则将它们互相添加)
  • Rank2 和 Rank3 差异较大 -> 添加 rank2 id
  • 群体合并:如果有一个包含 X 个成员的组,而我们有另一行数据在前 X 个预测中包含了这 X 个预测值,则合并为一个更大的组。
  • 至少一个其他匹配(除非 rank2 的余弦相似度极低)
  • 查询扩展
  • 重新匹配未匹配的行
同比赛其他方案