Embedding-based Retrieval in Facebook Search - 1 - 论文学习
Embedding-based Retrieval in Facebook Search
ABSTRACT
在社交网络(如Facebook)中的搜索提出了与传统的web搜索不同的挑战:除了查询文本之外,考虑到搜索者的上下文以提供相关结果是很重要的。搜索者的社交图谱是上下文的一个组成部分,也是Facebook搜索的一个独特方面。尽管基于嵌入的检索(embedding-based retrieval ,EBR)已经在网络搜索引擎中应用多年,但Facebook的搜索仍然主要基于布尔匹配模型。在本文中,我们讨论了将EBR应用到Facebook搜索系统的技术。本文介绍了为建模用于个性化搜索的语义嵌入而开发的统一嵌入框架,并在一个典型的基于inverted索引的搜索系统中提供基于嵌入的检索服务。我们讨论了整个系统端到端优化的各种技巧和经验,包括ANN参数优化和全栈优化。最后,我们介绍了我们在两个选定的关于建模的最新主题上的进展。我们通过在线A/B实验观察到的显著指标收益,在Facebook搜索上评估了EBR的效果。我们相信本文将提供有用的见解和经验,以帮助人们开发基于嵌入的搜索引擎检索系统。
1 INTRODUCTION
搜索引擎已经成为帮助人们在线获取大量信息的重要工具。在过去的几十年里,人们开发了各种技术来提高搜索质量,特别是在包括Bing和谷歌在内的网络搜索引擎中。由于从查询文本中准确计算搜索意图和表示文档的语义是困难的,搜索技术大多基于各种term匹配方法[1],它在关键字匹配可以解决的情况下表现良好。对于语义匹配[12]来说,它仍然是一个具有挑战性的问题,其目的是解决预期结果不完全匹配查询文本但能够满足用户搜索意图的情况。
在过去的几年里,深度学习在语音识别、计算机视觉和自然语言理解[10]方面取得了重大进展。其中的嵌入(embedding),也被称为表征学习(representation learning),已被证明是成功的技术,有助于[2]的成功。本质上,嵌入是一种将ids的稀疏向量表示为密集特征向量的方法,也称为语义嵌入,因为它通常可以学习语义。一旦了解了嵌入,它就可以作为查询和文档的表征,应用于搜索引擎的各个阶段。由于该技术在计算机视觉和推荐系统等其他领域的巨大成功,作为下一代搜索技术[13],其已成为信息检索界和搜索引擎行业的一个活跃的研究课题。
一般来说,搜索引擎包括一个以低延迟和低计算成本检索一组相关文档为目标的召回层(通常称为检索层,retrival)和一个以更复杂算法或模型将最需要的文档排序为目标的精确层(通常称为排序,ranking)。虽然嵌入可以同时应用于两个层,但通常在检索层利用嵌入的机会更大,因为检索层位于系统的底部,这往往是瓶颈。嵌入式技术在检索中的应用称为基于嵌入的检索,简称EBR。简单地说,基于嵌入的检索是一种利用嵌入来表示查询和文档,然后将检索问题转化为嵌入空间中最近邻(NN)搜索问题的技术。
EBR在搜索引擎中是一个具有挑战性的问题,因为要考虑的数据规模非常大。与通常在每个会话中考虑数百个文档的ranking层不同,retrival层需要处理搜索引擎索引中的数十亿甚至万亿个文档。嵌入式的庞大规模对嵌入式的训练和服务都提出了挑战。其次,与计算机视觉任务中的基于嵌入的检索不同,搜索引擎通常需要将基于嵌入的检索和基于词匹配的检索结合起来,在retrival层对文档进行评分。
Facebook搜索作为一种社交搜索引擎,与传统搜索引擎相比有着独特的挑战。在Facebook搜索中,搜索意图不仅依赖于查询文本,而且还受到发出查询的用户和搜索者所在的上下文的严重影响。正因为如此,基于嵌入的检索在Facebook搜索中并不是一个文本嵌入问题,这在IR社区[13]中得到了积极的研究。相反,它是一个更复杂的问题,需要理解文本、用户和上下文。
为了在Facebook搜索中部署基于嵌入的检索,我们开发了一些方法来解决modeling、serving和full-stack optimization方面的挑战。在modeling方面,我们提出了统一的嵌入模型,这是一种双面模型,一边是由查询文本、搜索者和上下文组成的搜索请求,另一边是文档。为了有效地训练模型,我们开发了从搜索日志中挖掘训练数据的方法,并从搜索器、查询、上下文和文档中提取特征。为了快速迭代模型,我们在离线评估集上采用召回度量来比较模型。
建立用于搜索引擎的检索模型有其独特的挑战,如如何建立一个有表示性的训练任务来让模型更有效、高效地学习。我们研究了两个不同的方向,即hard mining来有效地解决表示和学习检索任务的挑战,以及ensemble embedding将模型划分为多个阶段,每个阶段有不同的recall和precision权衡。
在模型建立之后,我们需要在检索堆栈中寻找有效、高效地为模型服务的方法。虽然将来自现有的检索和嵌入KNN的候选相结合的方法可以很容易地构建出一个系统,但我们发现它并不理想,原因有以下几个方面:1)从我们最初的实验来看,它具有巨大的性能成本;2)由于双重指标,维护成本较高;3)两个候选集可能有很大的重叠,这使得整体效率低下。随后,我们开发了一个混合检索框架,将嵌入KNN和布尔匹配结合在一起来为检索的文档评分。为此,我们为嵌入向量量化部署Faiss[9]库,并将其与基于倒排索引的检索相结合,构建了一个混合检索系统。除了解决上述问题外,该系统还有两个主要优点:1)可以通过嵌入和词匹配的联合优化来解决搜索检索问题;2)支持受限于term匹配的嵌入KNN,不仅解决了系统性能成本问题,而且提高了嵌入KNN结果的精度。
搜索是一个多阶段的ranking系统,retrival是第一阶段,其次是各个阶段的ranking和filtering模型。为了对系统进行整体优化,最终返回新的好结果,抑制新的坏结果,我们进行了后期优化。具体说来,我们将embeddings嵌入到ranking层中,并建立了一个训练数据反馈循环来主动学习识别来自基于嵌入的检索的好的和坏的结果。图1是一个基于嵌入的检索系统的示例。我们通过在线A/B实验观察到的指标显著增加,对在Facebook搜索的垂直领域的EBR进行了评估。
本文的组织结构如下。我们从建模开始,在第2节和第3节中介绍我们关于损失函数、模型架构、训练数据和特征工程的解决方案。接下来,我们将在第4节中讨论模型服务和系统实现的细节。在第5节中,我们将讨论我们在后期优化中开发的技术,以端到端地释放来自基于嵌入的检索的能量。最后,我们将第6节奉献给最新建模技术中选定的主题,然后是第7节的结论。
2 MODEL
将搜索检索问题当作recall优化问题。具体来说,即给定一个搜索查询,其目标结果集为T= ,模型返回的top K的结果为
,希望通过top K的结果去最大化recall:
目标结果是基于特定条件的与给定查询相关的文档。例如,它可能是用户点击的结果,或基于human rating的相关文档。
我们将recall优化规划为一个基于查询与文档之间距离的排序问题。查询和文档用神经网络模型编码成密集向量,我们使用余弦相似度作为距离度量。我们提出利用triplet loss[14]来近似recall目标来学习神经网络编码器,也称为嵌入模型。
语义嵌入通常被表述为信息检索中的文本嵌入问题,但对于Facebook搜索来说是不够的。Facebook搜索是一种个性化搜索引擎,它不仅考虑文本查询,还考虑搜索任务中搜索者的信息和上下文,以满足用户的个性化信息需求。以人名搜索为例,虽然Facebook上可能有数千个名为“John Smith”的用户资料,但用户用“John Smith”查询的实际目标用户很可能是他们的朋友或熟人。针对这一问题,我们提出了统一嵌入(unified embedding)的方法,在嵌入的生成过程中不仅考虑了文本信息,还考虑了用户信息和上下文信息。
2.1 Evaluation Metrics
虽然我们的最终目标是通过在线A/B测试提供端到端质量改进,但重要的是开发离线指标,以便在在线实验之前快速评估模型质量,并从复杂的在线实验设置中隔离问题。我们建议对整个索引进行KNN搜索,然后使用公式1中定义的recall@K作为模型评价指标。具体来说,我们抽样了10000个搜索会话来收集评估集的查询和目标结果集对,并报告了10000个会话的平均recall@K。
2.2 Loss Function
对于给定的triplet ,其中
表示查询,
表示相关的正文档,
表示负文档。triplet损失被定义为:
D(u, v)表示向量u和v之间的距离度量, m是正负对之间的边际,和N从训练集中选择的triplets的数量。这个损失函数的目的是使用距离边际将正对和负对分开。 我们发现调整边界值是十分重要的-最优边界值在不同的训练任务中有很大的差异,不同的边界值导致5-10%的KNN召回方差。
我们认为,使用随机样本去形成triplet的负对可以近似召recall优化任务。原因如下。如果我们为训练数据中的每个正例采样n个负例,当候选集pool大小为n时,该模型将对top one 位置的recall进行优化。假设实际serving候选pool大小为N,我们将优化在top K≈N/ n位置的recall。在2.4节中,我们将验证这一假设,并对不同的正和负标签定义进行比较。
2.3 Unified Embedding Model
为了学习用来优化triplet损失的embeddings,我们的模型包含三个主要成分:一个查询encoder ,用来生成一个查询embedding;一个文档encoder
,用来生成一个文档embedding;以及一个相似度函数
,用来生成查询Q和文档D之间的分数。encoder是一个神经网络,用来将输入转换成一个低维的密集向量,作为embedding。在我们的模型中,两个encoders f(.)和g(.)默认为两个分开的网络,但是可以选择地分享部分参数。至于相似度函数,我们选择cosine相似度,因为其是在embedding学习[7]中常用的函数之一:
因此在等式2中的损失函数中使用的距离是被定义为的cosine距离
encoders的输入是统一嵌入与传统文本嵌入模型的区别所在。统一嵌入编码文本、社会和其他有意义的上下文特征来分别表示查询和文档。例如,对于查询端,我们可以包括搜索者的位置及其社会联系;而对于文档端,我们可以包括关于Facebook群组的聚合位置和社会集群(以群组搜索为例)。
大多数特性都是高cardinality的分类特性,可以是one-hot或multi-hot向量。对于每个分类特征,在输入编码器之前,会插入一个embedding look-up层来学习和输出其密集向量表征。对于multi-hot向量,采用多重嵌入加权组合的方法进行最终的特征级嵌入。图2演示了我们的统一嵌入模型架构(unified embedding model architecture),我们将在第3节中讨论更多关于特征工程的内容。
2.4 Training Data Mining
在搜索ranking系统中为检索任务定义正标签和负标签是一个重要的问题。在这里,我们比较了几种基于模型召回度量的选项。对于负例,我们在最初的研究中尝试了以下两种负例选项,同时使用点击结果作为正例选项:
- random samples: 对于每个查询,我们从文档池中随机抽取文档作为负例。
- non-click impressions: 对于每个查询,我们随机抽取那些印象深刻但未点击的结果作为负例。
使用non-click impressions作为负例训练的模型比使用random 负例训练的模型有着明显更差的recall: 对于people嵌入模型来说,recall中有absolute 55% regression。我们认为,这是因为这些负例倾向于可能在一个或多个因素上匹配查询的困难情况,而索引中的大多数文档是根本不匹配查询的简单情况。如果所有的负例都是这样的hard 负例,这将改变训练数据对真实检索任务的代表性,这可能会对所学的嵌入施加不可小觑的偏差。
我们还尝试了不同的挖掘正例的方法,并有如下有趣的发现:
- clicks: 将点击结果视为正例是很直观的,因为点击表明用户对结果的反馈可能与用户的搜索意图相匹配。
- impressions: 这个想法是,我们把检索当作近似ranker的方法,但可以快速执行。此后,我们希望设计检索模型来学习返回同一组结果,这些结果将被ranker排列在较高的位置。在这个意义上,所有的结果显示或对用户来说印象深刻的都是检索模型学习的正例。
我们的实验结果表明,这两种定义是同等有效的;在相同的数据量下,使用clicks vs impressions 训练的模型得到了类似的召回。此外,我们用基于impressions的数据对基于clicks的训练数据进行加强后的数据进行了实验,但是我们没有观察到比基于clicks的模型更多的收获。结果表明,增加impressions数据并不能提供额外的价值,增加训练数据量也不能使模型受益。
我们的上述研究表明,将点击作为正例和随机采样的作为负例的方法可以提供一个合理的模型性能。在此基础上,我们进一步探索了hard mining策略,以提高模型对相似结果的区分能力。我们将在第6.1节中提供更多细节。
3 FEATURE ENGINEERING
统一嵌入模型的优点之一是可以整合文本以外的各种特征,从而提高模型的性能。我们一致地观察到,统一嵌入比文本嵌入更有效。例如,ecents搜索从文本切换到统一嵌入时,召回率提高了+18%,groups搜索的召回率提高了+16%。统一嵌入的有效性在很大程度上取决于识别和构建信息特征的成功与否。表1显示了通过将每个新的特征类别添加到group嵌入模型(以文本特征为基准)而实现的增量改进。在本节中,我们将讨论对主要模型改进做出贡献的几个重要特性。
Text features. Character n-gram[7]是用于文本嵌入的一种常用的文本表示方法。与word n-gram相比,它的优点有两个方面。首先,由于词汇量有限,嵌入查找表的尺寸较小,在训练时可以更有效地学习。其次,子词表征对于我们在查询(例如拼写变化或错误)和文档(由于Facebook的大量内容库存)方面遇到的词汇之外的问题来说是健壮的。我们比较了用Character n-gram训练的模型和用word n-gram训练的模型,发现前者可以产生更好的模型。然而,在character trigrams之上,包括word n-gram表征还提供了较小但一致的模型改进(+1.5%的召回增益)。注意,由于word n-gram的cardinality通常非常高(例如,查询trigrams的cardinality为352M),因此需要散列来减少嵌入查找表的大小。但是即使存在哈希碰撞的缺点,添加word n-ngrams仍然会带来额外的好处。
对于Facebook实体,提取文本特征的主要字段是人名实体的名称或非人名实体的标题。与布尔项匹配技术相比,我们发现使用纯文本特征训练的嵌入尤其擅长处理以下两种情况:
- Fuzzy text match. 例如,模型能够学习在查询“kacis creations”和Kasie’s creations页面之间进行匹配,而基于term的匹配则不能。
- Optionalization. 在查询“mini cooper nw”的情况下,该模型可以学习通过为一个可选的term匹配删除“nw”来检索预期的Mini cooper owner/drivers club 组。
Location features. 位置匹配在许多搜索场景中都具有优势,比如搜索local business/groups/events。为了让嵌入模型在生成输出嵌入时考虑locations,我们在查询和文档侧特征中都添加了位置特征。在查询方面,我们提取了搜索者的城市、地区、国家和语言。对于文档端,我们添加了公开可用的信息,例如由管理员标记的显式group位置。结合文本特征,该模型能够成功学习查询与结果之间的隐式位置匹配。表2显示了文本嵌入模型和文本+位置嵌入模型在groups搜索中返回的top相似文档的side-by-side比较。我们可以看到,具有位置特征的模型可以学习将位置信号融合到嵌入中,将与来自Louisville, Kentucky 的搜索者所在位置相同的文档排名到更高的位置。
Social embedding features. 为了利用丰富的Facebook社交图改进统一的嵌入模型,我们训练了一个独立的嵌入模型,其基于社交图来嵌入用户和entities。这有助于将综合的社交图整合到一个统一的嵌入模型中,否则可能无法获得完整的社交图信息。
4 SERVING
4.1 ANN
由于以下优点,我们在我们的系统中部署了基于inverted索引的ANN(近似近邻)搜索算法。首先,由于嵌入向量的量化,它具有较小的存储成本。其次,它更容易被集成到现有的基于inverted索引的检索系统中。我们利用Faiss库[9]来量化向量,然后在我们现有的inverted表扫描系统中实现高效的NN搜索。
嵌入量化主要有两种成分,一种是Coarse quantization,通常通过K-means算法将嵌入向量量化成coarse簇;另一种是Product quantization[8],它进行了细粒度量化,从而能够高效地计算嵌入距离。我们需要调整以下几个重要参数:
- Coarse quantization. Coarse quantization有不同的算法。比较IMI[11]算法和IVF[15]算法是有用的。调优coarse簇的数量num_cluster非常重要,这将同时影响性能和召回。
- Product quantization.有多种Product quantization算法的变体,包括vanilla PQ, OPQ, PQ与PCA变换。PQ的字节数pq_bytes是一个需要调优的重要参数。
- nprobe. nprobe是一个参数,用于决定将有多少簇分配给查询嵌入,查询嵌入将进一步决定将扫描多少coarse簇。该参数将影响性能和召回。
我们构建了一个离线pipeline来有效地调优这些参数。此外,我们需要进行在线实验,根据离线调优,从选择的候选对象中确定最终的设置。下面我们将分享我们从ANN调优中得到的技巧和教训。
- Tune recall against number of scanned documents. 首先,我们比较了设置相同num_cluster和nprobe的不同的Coarse quantization算法的recall。然而,从更多的数据分析中我们发现聚类是不平衡的,特别是IMI算法,大约有一半的聚类只有少量的样本。这将导致对于相同的num_cluster和nprobe设置,扫描的文档数量不同。因此,我们使用扫描文档的数量作为一个更好的度量来近似ANN调整中的性能影响,如图3所示。我们使用1-recall@10来测量ANN的准确性,1-recall@10是ANN搜索前10个结果中exact KNN搜索得到的top结果的平均recall。
- Tune ANN parameters when there is non-trivial model change. 我们观察到,ANN的性能与模型特征有关。例如,当我们在non-click impressions训练的模型中使用ensemble技术时,我们发现,虽然模型显示出比基线更好的召回,但在对两者进行量化后,召回比基线更差。当模型训练任务发生重大变化时,例如,增加更多的hard 负例时,应始终考虑调整ANN参数。
- Always try OPQ. 在应用量化之前对数据进行变换通常是有用的。我们使用PCA和OPQ[5]对数据进行变换,观察到OPQ通常更有效,如表3和图3所示。OPQ的一个警告是:由于它应用了嵌入式的旋转,我们可能还需要重新调整num_cluster和nprobe以扫描类似的文档。
- Choose pq_bytes to be d/4. Product quantization将向量压缩为x字节编码。对于x的选择,与嵌入向量的维数d有关。较大的x会导致更高的搜索精度,但代价是增加内存和延迟。实证结果表明,在x > d/4之后,精度的提高是有限的。
- Tune nprobe, num_clusters, and pq_bytes online to understand the real perf impact.虽然调优ANN离线算法和参数来得到一个合理的对性能 vs 召回的权衡的理解是十分重要的, 但我们发现更重要的是部署几个ANN在线算法和参数的配置以获得更好的对 从embedding-based检索到真正的系统的性能影响的理解。这对于离线调优中确定容量预算和减少参数搜索范围具有重要意义。
4.2 System Implementation
为了将基于嵌入的检索集成到我们的服务堆栈中,我们在Unicorn[3]中实现了对NN搜索的一流支持,这是一个支持Facebook大多数搜索产品的检索引擎。Unicorn将每个文档表示为术语袋,术语袋是表示文档二进制属性的任意字符串,按照惯例使用它们的语义进行命名。例如,居住在Seattle的用户John的terms是 text:John 和location:Seattle。terms可以附加payloads。
查询可以是这些terms上的任何布尔表达式。例如,下面的查询将返回姓名中包含john和smithe并居住在Seattle或Menlo Park的所有人:
为了支持NN,我们扩展了文档表征,包含了embeddings,每个embeddings都有一个给定的字符串键(key),并添加了一个(NN <key>:radius <radius>)查询操作符,它匹配所有<key> embeddings在查询embedding的指定半径(radius)内的文档。
在建立索引时,对每个文档嵌入(embedding)被量化,并将其转换为一个term(用于coarse cluster)和一个payload(用于quantized residual)。在查询时,(nn)在内部被重写为与最接近查询嵌入(probes)的coarse cluster相关的terms的(or),为了匹配文档,检索term payload以验证半径(radius)约束。probes的数量可以通过一个附加属性指定:nprobe。通过根据已有的原语实现NN支持,而不是编写单独的系统,我们继承了现有系统的所有特性,比如实时更新、高效的查询规划和执行,以及支持多跳查询(参见[3])。
后者允许我们支持top-K NN查询,其中我们只选择最接近查询的K个文档,然后评估查询的其余部分,而不是根据半径进行匹配。然而,从我们的实验研究,我们发现半径模式可以更好地权衡系统性能和结果质量。一个可能的原因是,radius模式支持有约束的NN搜索(受匹配表达式的其他部分的约束),而top K模式提供了更轻松的操作,需要扫描整个索引来获得top K结果。因此,我们在当前的产品中使用基于半径(radius)的匹配。
4.2.1 Hybrid Retrieval. By having the (nn) operator as part of
我们的布尔查询语言现在可以支持混合检索表达式,包含任意的嵌入和terms组合。这可以用于基于模型的模糊匹配,在重用和受益于检索表达式的其他部分的同时,可以改进诸如拼写变化、可选性等情况。例如,一个拼写错误的查询john smithe正在寻找一个在Seattle或Menlo Park的叫john smith的人;检索表达式类似于上面的表达式。
该表达式将无法检索有问题的用户,因为term text:smithe将无法匹配该文档。我们可以通过(nn)操作符对该表达式进行模糊匹配:
其中model-141795009是嵌入的key。在这种情况下,如果查询(john smith)嵌入和文档(john smith)嵌入之间的余弦距离小于0.24,目标用户就会被检索到。
4.2.2 Model Serving. 我们以以下方式服务嵌入模型。对双边嵌入模型进行训练后,将模型分解为查询嵌入模型和文档嵌入模型,分别为这两个模型服务。在查询嵌入方面,我们将该模型部署在实时推理的在线嵌入推理服务中。对于文档,我们使用Spark进行批量离线模型推理,然后将生成的嵌入和其他元数据一起发布到forward索引中。我们做了额外的嵌入量化,包括coarse quantization和PQ ,以将其发布到inverted索引中。
4.3 Query and Index Selection
为了提高EBR的效率和质量,我们进行了查询和索引选择。我们应用查询选择技术来克服过度触发、巨大的容量成本和垃圾增加等问题。对于某些查询——当EBR没用和不能为查询提供任何额外的价值时,我们就不会触发EBR(即不使用它),如简单的查询与搜索者正在寻找一个特定的目标搜索和点击,或查询与训练的嵌入模型有着显然不同的查询意图。在索引方面,我们做了索引选择以提高搜索速度。例如,我们只选择每月活跃用户、最近事件、热门页面和群组。
5 LATER-STAGE OPTIMIZATION
Facebook搜索排名是一个复杂的多阶段排名系统,每个阶段都在前一阶段的基础上逐步提炼结果。在这个堆栈的最底部是检索(retrival)层,其中应用基于嵌入的检索。然后通过一堆排序(ranking)层对检索层的结果进行排序和过滤。每个阶段的模型都应该针对上一层返回的结果的分布进行优化。然而,由于当前的排名阶段是为现有的检索场景设计的,这可能会导致基于嵌入的检索返回的新结果被现有的排序器排序为次优。为了解决这个问题,我们提出了两种方法:
- Embedding as ranking feature. 将嵌入的相似性传播到funnel的下方不仅有助于ranker识别基于嵌入检索的新结果,而且还为所有结果提供了一个通用的语义相似性度量。我们探讨了几种基于嵌入的特征提取方法,包括查询与结果嵌入的余弦相似度、Hadamard product和原始嵌入。从我们的实验研究来看,余弦相似特征始终表现出比其他选择更好的性能。
- Training data feedback loop. 基于嵌入的检索虽然可以提高检索的recall,但与term匹配相比,它可能具有较低的精确度。为了解决精确度问题,我们建立了一个基于human rating pipeline的闭环反馈回路。特别是,在启用基于嵌入的检索之后,我们记录了结果,然后将这些结果发送给人类评分者,以标记它们是否相关。我们利用这些人类评分数据对关联模型进行再训练,使其能够在保留相关结果的同时,从基于嵌入的检索中过滤出不相关的结果。其被证明在基于嵌入检索的recall改善中是一个得到高精确度的有效方法。
6 ADVANCED TOPICS
基于嵌入的检索需要广泛的研究来不断提高性能。我们研究了嵌入建模的两个重要领域:hard mining 和embedding ensemble,以继续推进基于嵌入的检索解决方案。
6.1 Hard Mining
检索任务的数据空间在文本/语义/社交匹配程度上具有不同的数据分布,为嵌入模型设计一个训练数据集,以便在该空间上高效有效地学习非常重要。为了解决这个问题,hard mining是一个主要的方向,也是嵌入学习的一个活跃的研究领域。然而,大多数研究都来自计算机视觉领域,针对分类任务[6,14,16,17],而搜索检索没有“类”的概念,因此是一个现有技术不一定有效的独特问题。在这个方向上,我们将我们的解决方案分为两个部分:hard negative mining和hard positive mining。
6.1.1 hard negative mining. 在分析我们的people搜索的嵌入模型时,我们发现,在给定查询的嵌入结果中,排名top K的结果通常具有相同的名称,并且即使存在社交特征,该模型也并不总是将目标结果排得比其他结果高。这促使我们相信该模型还不能恰当地利用社会特征,这很可能是因为negative训练数据太简单了,因为它们是随机样本,通常有着不同的名字。为了使模型能够更好地区分相似的结果,我们可以使用嵌入空间中更接近正样本的样本作为训练中的hard negative。
Online hard negative mining. 由于模型训练是基于mini-batch更新的,因此可以动态且有效地在每批中选取hard negatives。每个batch包含n个positive对。然后,对于每个查询
,我们使用其他positive文档
生成一个小的文档池,然后选取其中有着最高相似度分数的文档作为hardest negatives去生成训练triplets。实现在线hard negative mining是我们模型改进的主要贡献之一。它持续改善了所有垂直搜索领域的嵌入模型质量:people搜索的召回率+8.38%;groups搜索的召回率+7%,和events搜索的召回率+5.33%。我们还观察到,最佳设置是每个positive最多两个hard negative。使用超过两个hard negative将开始削弱模型的质量。
在线HNM的一个局限性是,随机样本中出现hard negative的概率可能很低,因此无法产生足够hard的negative。接下来,我们看看如何基于整个结果池生成harder negative,也称为offline Hard Negative Mining。
Offline hard negative mining. Offline hard negative mining 过程如下:
(1)每次查询生成top K结果。
(2)基于hard selection strategy选择hard negatives。
(3)利用新生成的triplets对嵌入模型进行再训练。
(4)过程具有迭代性。
我们进行了大量的实验来比较Offline hard negative mining和online hard negative mining。有一个发现乍一看可能是违反直觉的,那就是简单地使用hard negative来训练的模型不能比使用random negative来训练的模型表现更好。进一步的分析表明,“hard”模型在非文本特征上有更多的权重,但在文本匹配方面比“easy”模型做得差。因此,我们努力调整采样策略,最终得到一个优于在线HNM模型的模型。
第一个想法是关于hard selection strategy。我们发现使用hardest例子并不是最好的策略。我们比较了不同排名位置的抽样,发现在排名101-500之间抽样的模型获得最好的recall。第二个想法是关于检索任务优化。我们的假设是,在训练数据中存在easy negatives仍然是必要的,因为检索模型是在一个输入空间上操作的,该空间包含具有各种hard级别的数据,其中大多数是easy negatives。因此,我们探索了几种将random negative与hard negative整合在一起的方法,包括从一个简单的模型中迁移学习。从我们的实证研究来看,以下两种方法的有效性最高:
Mixed easy/hard training: 在训练中混合random和hard的negative是有用的。增加easy negatives对hard negatives的比率将继续提高模型的召回, 在easy:hard=100:1的比例时趋于饱和结果。
Transfer learning from "hard" model to "easy" model: 从“easy”到“hard”的迁移学习并没有产生更好的模型,而从“hard”到“easy”的迁移学习进一步提高了模型的recall。
最后但并非最不重要的是,对训练数据中的每个数据点进行详尽的KNN计算是非常耗时的,而且由于计算资源有限,总模型训练时间变得不现实。对于offline hard negative mining算法来说,有一个高效的top K生成是非常重要的。近似最近邻搜索(Approximate nearest neighbor search)是一种实用的方法,可以显著减少总计算时间。此外,对一个随机碎片进行ANN搜索就足以产生有效的hard negatives,因为我们在训练时只依赖于semi-hard negatives。
6.1.2 Hard positive mining. 我们的基线嵌入模型使用点击或impressions作为积极因素,这是现有产品可以返回的。为了最大化基于嵌入检索的互补增益,一个方向是识别尚未被产品成功检索但为正例的新结果。为此,我们从搜索者的活动日志中挖掘失败搜索会话的潜在目标结果。我们发现,用这种方法挖掘出的正样本对模型训练是有效的。仅使用hard positives训练的模型可以达到与点击训练数据相似的模型召回水平,虽然其数据量仅为点击训练数据的4%。结合hard positives和impressions作为训练数据可以进一步改善模型召回。
6.2 Embedding Ensemble
我们从HNM实验中了解到,对于EBR模型训练来说,easy的和hard的例子都很重要——我们需要hard的例子来提高模型的精度,但easy的例子对于表示检索空间也很重要。使用random negatives训练的模型模拟了检索数据的分布,并在很大的K处进行了召回优化,但当K很小时,在top K处的精度较差。另一方面,为优化精度而训练的模型,例如,使用non-click impressions作为negatives或offline hard negatives来训练的模型,擅长对较小的候选集进行排名,但在检索任务中失败了。随后,我们提出了一种多阶段方法,将用不同硬度训练的模型结合起来,其中第一阶段模型侧重于召回,第二阶段模型侧重于区分第一阶段模型返回的更相似的结果。我们与[18]中的级联嵌入训练有着相同的spirit,它以级联的方式将一组经过不同硬度训练的模型集合起来。我们探索了不同形式的集成嵌入,包括加权级联(weighted concatenation)和级联模型(cascade model),并发现这两种方法都是有效的。
Weighted Concatenation. 由于不同的模型为(查询、文档)对 提供不同的余弦相似度评分,我们使用余弦相似度的加权和作为度量来定义该对的亲密程度。更具体说来,给定一个模型集,其对应的权重为
,对于任何查询Q和文档D,我们定义Q和D之间的加权集成相似度分数
为:
其中表示模型
的Q查询向量,
表示模型
的D文档向量。
为了服务的目的,我们需要将多个嵌入向量分别集成到一个单一的表示形式中,以满足上述度量属性。我们可以证明在归一化向量的一侧应用加权乘法可以满足这一要求。具体来说,我们是这样构造查询向量和文档向量的:
综上所述,我们以与第4节相同的方式进行集成嵌入。权重的选择是经验性的,可以根据评价数据集的性能来确定权重。
我们探讨了第二阶段嵌入模型的几种模型选择。实验表明,使用non-click impressions训练的模型的kNN召回效果最好(比基准模型提高4.39%)。然而,与单一模型相比,它在应用嵌入量化时准确度损失更大,因此在在线服务时实际效益降低。我们发现,为了在嵌入量化后获得最好的召回,最好的策略是将一个相对容易的模型与offline hard negative mining模型集成,并对训练的negatives的hardness水平进行了修改和调整。这个集成候选的离线模型改进略低,但能够实现显著的在线召回改进。
Cascade Model. 与加权集成的并行组合不同,级联模型在第一级模型的输出上以串行的方式运行第二级模型。我们比较了不同的第二阶段模型选择。我们发现,使用non-click impressions训练的模型并不适合;总体上的改进比加权集成方法要小得多。而且,当需要用第二阶段模型重新排序的结果数目增加时,增益就减小了。然而,在第二阶段使用offline hard negative 模型,召回率比基线提高了3.4%。它是一个更适合级联的候选模型,因为构建的训练数据的离线HNM是完全基于第一阶段模型的输出。
此外,我们还探讨了另一种级联模型的组成。我们观察到,虽然整体上统一嵌入比文本嵌入有更大的模型召回,但由于它的焦点转移到社会和位置匹配,它产生了新的文本匹配失败。为了提高模型的文本匹配能力,从而提高模型的精度,我们采用了级联策略:通过文本嵌入预先选择文本匹配候选对象,然后使用统一的嵌入模型对结果重新排序,返回最终的最优候选对象。与单独使用统一的嵌入模型相比,该方法的在线性能得到了显著提高。
7 CONCLUSIONS
将语义嵌入引入到搜索检索中,利用深度学习研究的进步来解决语义匹配问题,具有长远的好处。然而,由于建模困难、系统实现和跨栈优化的复杂性,尤其是对于一个大规模的个性化社交搜索引擎来说,也是一个具有很高挑战性的问题。本文提出了一种构建用于社会搜索的语义的统一嵌入方法,并在一个经典的基于inverted索引的搜索系统中实现了基于嵌入的检索。
统一嵌入模型和基于嵌入的检索系统的实现只是第一步。要端到端优化系统,使其在结果质量和系统性能方面表现良好,还有很长的路要走。我们介绍了我们在模型改进、服务算法优化和后期优化方面的经验。我们相信这将是宝贵的经验,帮助人们在真实的搜索引擎中更快地进行嵌入式检索。基于嵌入的检索在产品中的成功应用,为利用最新的语义嵌入学习技术持续提高检索质量打开了一扇门。我们介绍了我们在这一方向上的第一步进展和学习,特别是在 hard mining 和embedding ensemble方面。
有不断改进这个系统的巨大的机会。在未来,主要有两个方向要追求。一是go deep。在建模方面,我们可以应用最新的高级模型,如BERT[4],或者构建特定于任务的模型来解决特定的问题。我们可以在不同的阶段进行更深入的研究,包括服务算法优化和排名模型改进,在full-stack failure analysis的指导下,识别在不同堆栈中的改进机会。另一种是go universal。我们可以利用预先训练的文本嵌入模型,开发一个通用的文本嵌入子模型,以应用于不同的任务。此外,我们可以开发跨所有用例的通用查询嵌入模型。