返回列表

26th Place Solution : Effective Cluster Separation and Neighbour Search

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

开始: 2021-03-09 结束: 2021-05-10 商品理解 数据算法赛
第26名方案:有效的聚类分离与邻域搜索

第26名方案:有效的聚类分离与邻域搜索

作者: Mr_KnowNothing | 比赛排名: 第26名 | 发布时间: 2021-05-11

大家好,
祝贺所有的获胜者,我已经阅读了一些顶尖的解决方案,简直让我脑洞大开。不过,我觉得我们的方案和其他方案一样独特。以下是我们解决方案的详细步骤说明:

模型训练

我们使用了与我所有分享的内核相同的策略来训练模型。我们将图像和文本分开,分别通过各自的架构,然后经过 Arcface 再通过 Softmax,将其与给定的标签进行比较。

交叉验证 (CV)

我们根据标签进行了一次单次分层切分,一部分用于训练,另一部分用于验证。为了找到最佳阈值和最终的 CV 分数,我们使用了完整的训练集,正如 Chris 在他的内核中所建议的那样。

推理策略

我们策略中主要且独特的部分在于推理过程以及我们准备提交文件的方式。
由于某些原因,我无法在这里上传图片,请点击这里查看我们方案的简单示意图。

第一步:获取图像嵌入

我们使用了两个模型来获取图像嵌入:

  • NFnet L0
  • Efficient Net B0

LB 分数:合计 0.731

两者都在 512 的图像尺寸上训练,但这里使用的技巧是我们在 544 的图像尺寸上运行推理,并获得了不错的提升。这种在稍大的图像尺寸上运行推理的想法来自于 @philippsinger 的 Google 地标识别获胜方案。

第二步:获取文本嵌入

我们也使用了两个文本模型:

  • 印尼语 DistillBERT
  • 多语言释义 SBERT 模型

LB 分数:合计 0.644

这两个模型都是在翻译后的印尼语数据上训练的,推理时使用的技巧是:我们将测试集中的主要英语单词通过 @rohit singh 分享的字典转换成了印尼语

第三步:预处理层:有效的聚类分离

LB 分数从 0.736 提升到 0.752

当我们正准备放弃这场比赛时,我的队友 @nischaydnk 意识到我们在 LB 上表现不佳,因为简单拼接文本和图像的预测结果会增加预测值的数量,从而降低召回率。因此,@nischaydnk 提出了这个想法来平衡预测和召回率。

我们从每个图像模型中提取嵌入,并将其通过预处理层。在预处理层中,我们使用 KNN 为每一行找出前 3 个邻居,并在对数空间中以递减的权重将其相乘,以便将这前 3 个嵌入移动到嵌入空间中的另一个聚类,而其他嵌入保持不变(我们尝试了许多数字代替 3,但取前 3 个最佳邻居似乎效果最好)。

我们对文本嵌入做了同样的处理,最终我们从四个模型中得到了四个修改后的嵌入。

第四步:后处理层:邻域搜索

LB 分数:0.752 -- 0.759

现在我们有五个不同的模型和五个不同的嵌入,我们尝试了许多不同的集成策略都没有效果,然后 @drthrevan 提出了这个想法:

我们选取每个模型,为每个 posting id 找到 100 个邻居,并为每个模型制作单独的数据框。例如:我们取 nfnet 模型,为每个 posting_id 获取 100 个邻居并形成一个数据框,现在我们的数据框包含 posting_id、邻居的索引及其距离。

现在我们取所有 5 个数据框,它们并不相同,因为不同的模型对于不同的 posting_id 有不同的邻居,因此我们进行外连接,所以不是拼接嵌入,而是拼接距离。现在我们有了最终的数据框,在其中我们使用某个阈值搜索最终的预测结果。

第五步:最终阈值技巧

LB 分数:0.759 -- 0.764

我们将最终的预测结果分为热门和非热门 posting id。热门 posting id 是指预测匹配数超过 100 的 id,而非热门 posting id 是指匹配数少于 2 的 id

同比赛其他方案