导读:今天分享一下Facebook发表在KDD 2020的一篇关于社交网络搜索中的embedding检索问题的工作,干货很多,推荐一读。
论文:Embedding-based Retrieval in Facebook Search
地址:https://arxiv.org/abs/2006.11632
摘要
相对于传统的网页搜索来说,社交网络中的搜索问题不仅需要关注输入query的信息,还需要考虑用户的上下文信息,在Facebook搜索中用户的社交图网络便是这种上下文信息中非常重要的一部分。虽然embedding的检索技术在传统的搜索引擎中得到了广泛应用,但是Facebook搜索之前主要还是使用布尔匹配模型。本文讨论了如何将embedding检索技术应用在Facebook搜索的技术方案,我们提出了一套统一的embedding框架用于建模个性化搜索中的语义embedding,以及基于经典的倒排索引进行在线embedding检索的系统。同时讨论了整个系统中很多端对端的优化技巧,例如ANN调参经验、全链路的优化等。最后,我们在FaceBook垂直搜索场景下验证了本文方法的有效性,在线A/B实验取得了显著的收益。
背景
从query中准确计算出用户的搜索意图以及准确表达文档的语义含义是非常困难的,因此之前的搜索算法主要还是通过关键词匹配的方式进行检索。但是如何处理用户想要的搜索结果和输入query并不能通过关键词匹配的方式获取呢,语义匹配(也就是embedding匹配)应运而生。所谓embedding就是将高维稀疏的id映射成为一个低维稠密的向量,这样就可以在同一个向量空间中同时表示query和候选集文档从而进行譬如计算相似度等方面的操作。embedding技术就是一种表示学习,能学习到query或者候选集文档的语义信息。
一般来说,搜索主要包含检索和排序两个阶段,尽管embedding技术可以同时被应用在两个阶段,但相对来说应用在召回阶段可以发挥出更大的作用。embedding技术在搜索检索层的应用通常被称为基于embedding的检索或者简称为EBR。简单来说,EBR就是用embedding来表示query和doc,然后将检索问题转化为一个在Embedding空间的最近邻搜索的问题。它要解决的问题是如何从千万个候选集中找到最相关的top-K个,难点有如下的两个:一方面是如何构建千万级别的超大规模索引以及如何在线上进行服务;另一方面是如何在召回阶段同时考虑语义信息和关键词匹配的信息。
本文从如下的三个方面详细讲述了在Facebook搜索中应用Embedding检索技术遇到的挑战:modeling、serving以及full-stack optimization。modeling方面本文提出了一种统一的Embedding方式,也就是经典的双塔结构,一侧是query、user以及context特征;另一侧则是候选document。serving方面的系统架构图如下所示,本文采用Faiss库来进行embedding向量的最近邻搜索。
系统建模
本文将搜索引擎中的检索任务建模为一个召回优化问题。从离线指标的角度,我们希望最大化Top-K返回结果的recall指标。给定一个query,以及候选集T,我们的优化目标则是如下图所示的recall@K。
另外,在模型训练的损失函数上,本文定义了一个三元组损失函数:最近的向量对和最远的向量的距离差。损失函数这样定义的初衷是为了更好的区分正负样本对之间的距离。我们认为在使用三元组损失函数的情况下,使用随机的负样本对可以近似求解召回优化问题。
Unified Embedding Model的思路来说还是比较简单的沿用经典的双塔结构,左边是query、user以及context的塔;右边是document的塔,如下图所示。大部分的特征都是类别型特征,进行one-hot或者multi-hot的向量化;连续型特征则是直接输入到各自的塔中。
对于训练语义召回模型来说,如何定义正负样本对于模型的效果至关重要。点击样本作为正样本这个没有疑问,针对负样本我们采用了如下的两种的策略进行试验。本文发现前者作为负样本的效果要明显好于后者作为负样本的效果,原因是前者可以有效消除负样本偏差bias。
另外,本文还实验了随机选择曝光但是未点击的样本作为正样本来实验发现并没有带来额外的收益。
特征工程
Unified Embedding模型架构的一个最明显的优势是可以任意扩展加入text文本特征之外的各种各样的特征。Facebook推出的工业界实战论文都比较注重特征工程的东西,Unified Embedding大体上采用了如下三个方面的特征:
在线Serving
前面的章节都是在讲如何进行离线建模以及特征工程,这一节在主要讲如何进行在线实时检索,Facebook采用了自家的Faiss库进行线上的ANN的查询。本文花了大量的篇幅讲解了离线以及在线的几个重要参数的含义以及如何调参的tricks技巧,详细的调参经验请参考原始论文。
一个query可以表示为某种在多个term上的布尔表达式,譬如john和smithe住在seattle或者menlo_park可以用下面的布尔表达式来表示。本文在实际使用中,模型在faiss的基础上,加上了对location和term text的索引。
离线训练完成后通过spark构建候选集document的索引,当用户请求过来时,query的embedding在线进行计算,进行top-K召回。针对全量的候选集document进行索引是非常耗存储和费时的,所以本文在构建索引的时候,只选择了月活用户,近期事件,热门的事件,以及热门group。这块大部分公司在构建索引的时候都会采取这样的策略,很多长时间不活跃的可以不构建索引。
Full-stack优化
Embedding作为排序层的特征
搜索包含了召回和排序两个阶段,召回分数高的用户不一定会点击,而且召回和ranking的排序列表不一致,所以可以将召回的分数(也就是向量的相似度)作为ranking阶段的一个特征,通过ranking模型进行统一排序。
Training data feedback loop
由于语义召回的结果召回高但是精度低,所以本文就采用了人工的方式对语义召回的结果进行标注,对每个query召回的结果进行标注。这样能够过滤掉不相关的结果,提升模型精度。(人工大法好)
基于embedding的语义召回需要更加深入的分析才能不断提升性能,facebook给出了其中可以提升的重要方向一个是Hard Mining,另一个是Embedding Ensemble
Hard Negative Mining
文章发现很多时候同语义召回的结果,大部分都是相似的,而且没有区分度,最相似的结果往往还排不到前面,这些就是之前的训练样本太简单了,导致模型学习的不够充分。所以本文把那些和positive sample很近的样本作为负样本去训练,这样模型就能学到这种困难样本的区分信息。
Online hard negative mining
因为模型是采用mini-batch的方式进行更新的,所以对每个batch中的positive pairs,都随机一些非常相似的负样本作为训练集,模型效果提升非常明显,同时也注意到了每个 positive的pairs,最多只能有两个hard negative,不然的模型的效果会下降。
Offline hard negative mining
首先针对对每个query选择top K的n个结果;然后选择一些hard negative samples进行重新训练。然后重复整个过程。同时根据经验 easy : hard=100:1。
Hard positive mining
模型采用了用户点击的样本为正样本,但是还有一些用户未点击但是也能被认为是正样本的样本。这块他们从用户的session日志中挖掘到潜在的正样本。(如何挖掘文章没有提及)这块对模型的效果也是有一部分提升。
Embedding Ensemble
这块其实就是如何将多个模型融合的问题,采用不同正负样本比例训练出来的模型在不同的方面具有不同的优势,如何对这些模型进行融合。
第一种方案是采用加权求和的方式,Weighted Concatenation。采用融合的当时对于单模型而言有4。39%的提升。第二种是串行的方式,第二个模型在第一个模型的基础上训练。感觉就像bagging和boosting的区别。采用Cascade 的方式,模型也有3.4%的提升。
参考
1. Embedding-based Retrieval in Facebook Search
2. https://zhuanlan.zhihu.com/p/152570715