返回列表

8th place solution [SBERT + LightGBM]

498. Foursquare - Location Matching | foursquare-location-matching

开始: 2022-04-14 结束: 2022-07-07 商品理解 数据算法赛
第8名方案 [SBERT + LightGBM]

第8名方案 [SBERT + LightGBM]

作者: kkanayj (Kita-kyushu Lovers)
比赛: Foursquare - Location Matching
排名: 8th Place

大家好。

这是让我们获得第8名的解决方案。
因为使用了自动翻译,如果英语有误请见谅。
另外,这是我第一次在讨论区发帖,可能总结得不够好。如果有任何问题,请留言评论。

概览

像许多其他参赛者一样,我们的方法包含三个步骤:

  1. 创建候选匹配对。
  2. 二分类判断位置是否相同。
  3. 后处理。

基本流程复制自 @guoyonfan 的基线。(感谢这个很棒的基线。)

以下是我们在每个步骤中设计的一些要点:

创建候选匹配对

除了基线中使用的基于距离的 k近邻,我们还增加了使用微调后的 SentenceBERT 生成的嵌入向量进行的 k近邻。

最终提交使用的 k 参数是:距离 kNN 为 10,嵌入 kNN 为 20。
在训练数据上模拟的理想 IoU 为 0.986。

嵌入 kNN 非常重要,它在下文描述的二分类中作为特征发挥了主要作用。

SentenceBERT 嵌入细节

嵌入模型是基于 sentence-transformers/all-MiniLM-L12-v2 进行微调的。

要在嵌入 kNN 中获得良好性能,关键点在于:

  • 不使用多语言模型
    • 实际上,我们也使用多语言模型来为二分类步骤创建特征,但基于英语的模型无疑是最重要的。
  • 损失函数的选择
  • 两阶段微调
不使用多语言模型

模型的输入是将名称、地址、城市、州、国家、类别和经纬度拼接而成的字符串。
由于基础模型不是多语言模型,日语名称和地址通过 pykakasi 进行标准化,其他语言通过 unidecode 进行标准化。

我们不使用多语言模型的原因是,带有标准化输入的英语模型表现更好,但我们认为原因在于多语言模型的参数量非常大,而微调的数据量不足。
通常,度量学习需要大量的训练数据,但本次比赛可用的基础数据只有约 110 万条,这不足以从数十种语言表达的数据中获得不变的表达,甚至单一语言的数据量也不够。

另一个无法成功训练多语言模型的原因可能是,由于 GPU 内存限制,我们不得不减小训练时的小批量大小。

模型是在 Google Colab 上使用单个 GPU 训练的,如果有更多的资源和时间,多语言模型可能会表现更好。

损失函数选择

对于微调的损失函数,我们使用了 sentence-transformer 库中实现的 Contrastive Loss(对比损失)

我们选择这个函数是因为它与 TripletLoss 和 CosineSimilarityLoss 相比性能最好。

两阶段微调

为了获得更好的性能,进行了两个阶段的微调。

在第一阶段,使用距离 kNN 创建的对集作为训练数据进行微调。
在第二阶段,在训练数据上进行微调,除了距离 kNN 外,还使用了第一阶段学习到的模型生成的嵌入 kNN 创建的对集。

我们认为第二阶段的微调作为困难负例对训练数据做出了贡献,因为通过嵌入 KNN 添加的具有相似名称和地址的位置被加入到了训练数据中。

比较第一阶段和第二阶段的模型,理想 IoU(召回率)从 0.97 提高到了 0.986。

二分类判断是否为同一位置

对于二分类,我们使用了由 kFold 创建的 7 个 LightGBM 模型。
以下是对我们来说重要的特征以及我们的训练工作。

对预测有效的特征

除了基线中使用的特征外,我们还添加了以下内容:

  • 三种 SentenceBERT 创建的嵌入向量的余弦相似度