498. Foursquare - Location Matching | foursquare-location-matching
恭喜所有的参赛者,虽然结局有些奇怪,但我相信这次比赛中的一些技术可以在未来被复用。
我的解决方案基于利用NLP深度学习模型的两阶段方法。第一阶段模型是一个度量学习模型,使用ArcFace损失函数在原始输入数据上进行训练,预测记录的兴趣点,从而将相似记录放入相似的嵌入空间。第二阶段基于第一阶段提出的候选对,额外训练了一个双编码器NLP模型。最终的提交是第一阶段和第二阶段模型的融合。
在第一阶段,我在大部分由SEP标记分隔的输入列上拟合ArcFace模型。我直接将经度和纬度输入到字符串中,但每隔3位数字拆分一次,以便分词器能更好地处理它。一个样本记录如下所示:
<s> Tesco HQ</s></s> Offices</s></s> 18 963 587</s></s> 47 450 562</s></s> 2040</s></s> Budaörs</s></s> Kinizsi út 1-3.</s>
如果某个字段是NAN,我只是填入一个空字符串,没有特殊标记或其他改动有帮助。
让ArcFace模型工作仍然很棘手,需要一些努力才能使训练稳定并收敛。我在这里只依赖xlm-roberta-large模型。起初我尝试了类似Triplet的模型,它们更容易上手,但在让这些模型工作后,ArcFace显然更胜一筹。
然后我计算所有配对的相似度,并在低于某个阈值时截断。所有高于阈值的配对进入第二阶段,我们也保留预测概率用于融合。
对于训练,我使用第一阶段的结果作为候选对。我使用各种双编码器模型来训练配对的TP/FP(真阳性/假阳性)。一条记录如下所示:
<s> Tesco HQ</s></s> Novo Nordisk</s></s> 18 963 587</s></s> 12 449 657</s></s> 47 450 562</s></s> 55 751 928</s></s> Offices</s></s> Offices</s></s> HU</s></s> DK</s></s> Pest</s></s> Bagsværd</s></s> Budaörs</s></s> Bagsværd</s></s> 2040</s></s> 2880</s></s> Kinizsi út 1-3.</s></s> Novo Allé</s></s></s></s></s></s></s></s>
也就是将两条记录的每一列粘贴在一起,然后训练双编码器模型。我总是将所有TP添加到训练数据中,然后如果时间允许,逐渐添加更多的FP。
本次比赛的测试集约包含60万条记录,整个训练数据大约包含两倍的数据。检索/识别类型的问题总是严重依赖于可供选择的候选列表,因此自然地,拥有更多未知候选者的可能性会降低分数。
因此,最合理的CV设置是分出60万条具有唯一兴趣点的记录作为验证集,并在剩余数据上训练模型。这样做时,我看到CV和LB之间有很好的相关性,但是这种方法有一个大问题,即你错过了一半数据的模型训练。因此,我在比赛截止日期前大约六周决定只在公共LB上进行评估,在我看来,由于以下原因,这是评估我模型的最佳集合: