Embedding-based Retrieval in Facebook Search

摘要:

在 Facebook 等社交网络中进行搜索与经典网络搜索相比面临不同的挑战:除了查询文本之外,考虑搜索者的上下文以提供相关结果也很重要。他们的社交图谱是这一背景不可或缺的一部分,也是 Facebook 搜索的一个独特方面。虽然基于嵌入的检索 (EBR) 已在网络搜索引擎中应用多年,但 Facebook 搜索仍主要基于布尔匹配模型。在本文中,我们讨论了将 EBR 应用于 Facebook 搜索系统的技术。我们介绍了为个性化搜索的语义嵌入建模而开发的统一嵌入框架,以及在基于倒排索引的典型搜索系统中为基于嵌入的检索服务的系统。我们讨论了整个系统端到端优化的各种技巧和经验,包括人工神经网络参数调整和全栈优化。最后,我们展示了我们在两个选定的关于建模的高级主题上的进展。我们评估了 Facebook 搜索垂直领域的 EBR,在在线 A/B 实验中观察到了显着的指标增益。我们相信本文将提供有用的见解和经验,以帮助人们在搜索引擎中开发基于嵌入的检索系统。

关键词:嵌入、深度学习、搜索、信息检索

1.介绍

搜索引擎一直是帮助人们在线访问大量信息的重要工具。在过去的几十年中,人们开发了各种技术来提高搜索质量,尤其是在包括 Bing 和 Google 在内的网络搜索引擎中。由于难以从查询文本中准确计算搜索意图并表示文档的语义含义,因此搜索技术大多基于各种术语匹配方法[1],在关键字匹配可以解决的情况下表现良好。语义匹配[12]仍然是一个具有挑战性的问题,即解决与查询文本不完全匹配但可以满足用户搜索意图的期望结果。

在过去的几年里,深度学习在语音识别、计算机视觉和自然语言理解方面取得了重大进展[10]。其中嵌入,也称为表示学习,已被证明是有助于成功的成功技术[2]。本质上,embedding是一种将ids的稀疏向量表示为密集特征向量的方法,也称为语义embedding,因为它通常可以学习语义。一旦学习了嵌入,它就可以用作查询和文档的表示,以应用于搜索引擎的各个阶段。由于该技术在包括计算机视觉和推荐系统在内的其他领域取得了巨大成功,作为下一代搜索技术[13],它一直是信息检索界和搜索引擎行业的一个活跃研究课题。

通常,搜索引擎包括一个召回层,其目标是在低延迟和计算成本(通常称为检索)中检索一组相关文档,以及一个精确层,目标是使用更复杂的算法或模型将最想要的文档排在最前面,通常称为排名。虽然嵌入可以应用于两个层,但它通常有更多机会利用检索层中的嵌入,因为它位于系统的底部,这通常是瓶颈。嵌入在检索中的应用称为基于嵌入的检索或简称 EBR。简而言之,基于嵌入的检索是一种使用嵌入来表示查询和文档,然后转换将检索问题转化为嵌入空间中的最近邻 (NN) 搜索问题。

EBR 在搜索引擎中是一个具有挑战性的问题,因为需要考虑大量数据。与通常每个会话考虑数百个文档的排名层不同,检索层需要处理搜索引擎索引中的数十亿或数万亿个文档。巨大的规模给嵌入的训练和嵌入的服务都带来了挑战。其次,与计算机视觉任务中基于嵌入的检索不同,搜索引擎通常需要将基于嵌入的检索和基于术语匹配的检索结合在一起,以便在检索层对文档进行评分。

Facebook搜索作为一种社交搜索引擎,与传统搜索引擎相比具有独特的挑战。在 Facebook 搜索中,搜索意图不仅取决于查询文本,而且还受到发出查询的用户和搜索者所在上下文的严重影响。正因为如此,Facebook 搜索中基于嵌入的检索不是文本嵌入问题,正如 IR 社区 [13] 正在积极研究的那样。相反,这是一个更复杂的问题,需要完全理解文本、用户和上下文。

为了在 Facebook 搜索中部署基于嵌入的检索,我们开发了一些方法来应对建模、服务和全栈优化方面的挑战。在建模中,我们提出了统一嵌入,这是一个双面模型,一侧是包含查询文本、搜索器和上下文的搜索请求,另一侧是文档。为了有效地训练模型,我们开发了从搜索日志中挖掘训练数据并从搜索者、查询、上下文和文档中提取特征的方法。对于快速模型迭代,我们在离线评估集上采用召回指标来比较模型。

为搜索引擎构建检索模型有其独特的挑战,例如如何为模型构建具有代表性的训练任务以有效和高效地学习。我们研究了两个不同的方向,硬挖掘以有效解决表示和学习检索任务的挑战,以及集成嵌入以将模型划分为多个阶段,每个阶段都有不同的召回率和精度权衡。

模型开发完成后,我们需要开发有效且高效地为检索堆栈中的模型提供服务的方法。虽然构建一个结合现有检索和嵌入 KNN 的候选者的系统很简单,但我们发现它不是最理想的,原因有以下几个:1)它在我们的初始实验中具有巨大的性能成本; 2)双指标维护成本高; 3)两个候选集可能有很大的重叠,这使得它整体效率低下。此后,我们开发了一个混合检索框架,将嵌入 KNN 和布尔匹配集成在一起,对文档进行评分以进行检索。为此,我们使用 Faiss [9] 库进行嵌入向量量化,并将其与基于倒排索引的检索相结合,构建了一个混合检索系统。除了解决上述挑战外,该系统还有两个主要优点:1)它能够联合优化嵌入和术语匹配来解决搜索检索问题; 2)支持词匹配约束的嵌入KNN,不仅有助于解决系统性能成本问题,而且提高了嵌入KNN结果的精度。

在这里插入图片描述
搜索是一个多阶段的排名系统,其中检索是第一阶段,然后是各个阶段的排名和过滤模型。为了对系统进行全面优化,最终返回那些新的好结果并抑制那些新的坏结果,我们进行了后期优化。特别是,我们将嵌入合并到排名层中,并建立了一个训练数据反馈循环,以主动学习从基于嵌入的检索中识别出那些好的和坏的结果。图 1 是基于嵌入的检索系统的示意图。我们评估了 Facebook 搜索的垂直 EBR,在在线 A/B 实验中观察到显着的指标增益。

本文的结构如下。我们从建模开始,在第 2 节和第 3 节中介绍我们关于损失函数、模型架构、训练数据和特征工程的解决方案。接下来,我们将在第 4 节中讨论模型服务和系统实现的细节。我们将讨论我们稍后开发的技术阶段优化以在第 5 节中从端到端释放基于嵌入的检索的力量。最后,我们将第 6 节专门介绍有关高级建模技术的选定主题,然后在第 7 节中给出结论。

2 模型

我们将搜索检索任务制定为召回优化问题。具体来说,给定一个搜索查询,其目标结果集 T = {t1, t2, …tN },以及模型返回的前 K 个结果 {d1,d2, …dK },我们希望通过以下方式最大化召回率前 K 个结果,

在这里插入图片描述
目标结果是基于特定条件与给定查询相关的文档。例如,它可能是用户点击的结果,或基于人工评分的相关文档。

我们将召回优化制定为基于查询和文档之间计算的距离的排名问题。查询和文档用神经网络模型编码成密集向量,我们使用余弦相似度作为距离度量。我们建议使用三元组损失[14]来近似召回目标来学习神经网络编码器,也称为嵌入模型。

虽然语义嵌入通常被表述为信息检索中的文本嵌入问题,但对于 Facebook 搜索来说是不够的,Facebook 搜索是一个个性化的搜索引擎,不仅考虑文本查询,还考虑搜索者的信息以及搜索任务中的上下文以满足用户的需求。个性化信息需求。以人员搜索为例,虽然 Facebook 上可能有数千个名为“John Smith”的用户个人资料,但用户使用查询“John Smith”搜索的实际目标人很可能是他们的朋友或熟人。为了对这个问题进行建模,我们提出了统一嵌入,它不仅考虑了文本,而且在推导嵌入时还考虑了用户和上下文信息。

2.1 评价指标

虽然我们的最终目标是通过在线 A/B 测试提供端到端的质量改进,但重要的是开发离线指标以在在线实验之前快速评估模型质量并将问题与复杂的在线实验设置隔离开来。我们建议在整个索引中运行 KNN 搜索,然后使用等式 1 中定义的召回@K 作为模型评估指标。特别是,我们采样了 10000 个搜索会话来收集评估集的查询和目标结果集对,并报告了 10000 个会话的平均召回率@K。

2.2 损失函数

对于给定的三元组 (q(i),d(i) + ,d(i)− ),其中 q(i) 是查询,d(i) + 和 d(i)− 是相关的正负文档,三元组损失分别定义为
在这里插入图片描述

其中 D(u,v) 是向量 u 和 v 之间的距离度量,m 是正负对之间强制执行的边距,N 是从训练集中选择的三元组的总数。这个损失函数的直觉是将正对与负对分开一个距离边距。我们发现调整边距值很重要——最佳边距值在不同的训练任务中变化很大,不同的边距值会导致 5-10% 的 KNN 召回方差。

我们认为,使用随机样本形成三元组损失的负对可以逼近召回优化任务。原因如下。如果我们为训练数据中的每一个正样本采样 n 个负样本,则当候选池大小为 n 时,模型将针对前一个位置的召回进行优化。假设实际服务候选池大小为 N ,我们在顶部 K ≈ N /n 处近似优化召回。在第 2.4 节中,我们将验证这一假设并提供不同正负标签定义的比较。

2.3 统一嵌入模型

在这里插入图片描述
为了学习优化三元组损失的嵌入,我们的模型包括三个主要组件:一个查询编码器 EQ = f (Q),它产生一个查询嵌入,一个文档编码器 ED = ä(D),它产生一个文档嵌入,以及一个相似度函数 S(EQ , ED) 产生查询 Q 和文档之间的分数D. 编码器是将输入转换为低维密集向量的神经网络,也称为嵌入。在我们的模型中,这两个编码器 f (·) 和 ä(·) 默认是两个独立的网络,但可以选择共享部分参数。至于相似度函数,我们选择余弦相似度,因为它是嵌入学习中常用的一种[7]:
在这里插入图片描述

因此,等式 2 的损失函数中使用的距离是定义为 1 − cos(EQ , ED) 的余弦距离。

编码器的输入是统一嵌入与传统文本嵌入模型的区别。统一嵌入对文本、社交和其他有意义的上下文特征进行编码,分别表示查询和文档。例如,对于查询端,我们可以包括搜索者的位置和他们的社交关系,而对于文档端,我们可以以群组搜索为例,包括关于 Facebook 群组的聚合位置和社交集群。

大多数特征是高基数的分类特征,可以是 one-hot 或 multi-hot 向量。对于每个分类特征,插入一个嵌入查找层以在输入编码器之前学习并输出其密集向量表示。对于多热向量,将多个嵌入的加权组合应用于最终的特征级嵌入。图 2 展示了我们的统一嵌入模型架构,我们将在第 3 节中讨论更多关于特征工程的内容。

2.4 训练数据挖掘

在搜索排名系统中为检索任务定义正负标签是一个非常重要的问题。在这里,我们根据模型召回指标比较了几个选项。对于否定,我们在最初的研究中尝试了以下两种否定选项,同时使用点击作为肯定:

(1)随机样本:对于每个查询,我们从文档池中随机抽取文档作为否定样本。
(2)非点击印象:对于每个查询,我们在同一会话中随机抽取那些印象深刻但未点击的结果作为否定。

与使用随机负数相比,使用非点击印象作为负数训练的模型具有显着更差的模型召回率:嵌入模型的召回率绝对回归 55%。我们认为这是因为这些负面因素偏向于可能在一个或多个因素上匹配查询的困难案例,而索引中的大多数文档都是根本不匹配查询的简单案例。将所有负数都设为硬负数会改变训练数据对真实检索任务的代表性,这可能会给学习的嵌入带来不平凡的偏见。

我们还尝试了不同的挖掘积极因素的方法,并有如下有趣的发现:

(1)点击:将点击结果用作肯定是直观的,因为点击表明用户对结果的反馈可能与用户的搜索意图相匹配。
(2)印象:这个想法是我们将检索视为排名器的近似值,但可以快速执行。此后,我们想要设计检索模型来学习返回相同的结果集,这些结果将被排序器排名靠前。从这个意义上说,向用户展示或印象深刻的所有结果对于检索模型学习同样是积极的。

我们的实验结果表明,这两种定义同样有效;在相同数据量的情况下,使用点击与展示训练的模型会产生相似的召回率。此外,我们尝试使用基于印象的数据来增加基于点击的训练数据,但是我们没有观察到与基于点击的模型相比的额外收益。它表明添加印象数据不会提供额外的价值,并且模型也不会从增加的训练数据量中受益。

我们的上述研究表明,使用点击作为正数和随机作为负数可以提供合理的模型性能。最重要的是,我们进一步探索了硬挖掘策略,以提高模型区分相似结果的能力。我们将在第 6.1 节中介绍更多细节。

3 特征工程

统一嵌入模型的优点之一是它可以结合文本以外的各种特征来提高模型性能。我们在不同的垂直领域一致观察到,统一嵌入比文本嵌入更有效。例如,事件搜索从文本切换到统一嵌入时,召回率提高了 18%,组搜索的召回率提高了 16%。统一嵌入的有效性在很大程度上取决于识别和制作信息特征的成功。表 1 显示了通过将每个新特征类别添加到组嵌入模型(以文本特征作为基线)中的增量改进。在本节中,我们将讨论有助于主要模型改进的几个重要特性。

文字功能。字符 n-gram [7] 是表示文本以进行文本嵌入的常用方法。与单词 n-gram 相比,它的优势有两个。首先,由于其词汇量有限,嵌入查找表的大小更小,可以在训练期间更有效地学习。其次,子词表示对于我们在查询(例如拼写变化或错误)和文档方面(由于 Facebook 中的大量内容库存)遇到的词汇外问题具有鲁棒性。我们比较了用字符 n-gram 和单词 n-gram 训练的模型,发现前者可以产生更好的模型。然而,在字符三元组之上,包括单词 n-gram 表示还提供了小的但一致的模型改进(+1.5% 的召回增益)。请注意,由于单词 n-gram 的基数通常非常高(例如查询三元组为 352M),因此需要散列以减小嵌入查找表的大小。但即使有哈希冲突的缺点,添加单词 n-ngrams 仍然提供额外的收益。

对于 Facebook 实体 2,提取文本特征的主要字段是人物实体的名称或非人物实体的标题。与布尔项匹配技术相比,我们发现使用纯文本特征训练的嵌入特别擅长处理以下两种情况:
(1)模糊文本匹配。例如,该模型能够学习在查询“kacis creations”和 Kasie 的创作页面之间进行匹配,而基于术语的匹配则不能。
(2)可选化。在查询“mini cooper nw”的情况下,模型可以通过删除“nw”来检索期望的组 Mini cooper owner/drivers club 以进行可选的术语匹配。

位置特征。位置匹配在许多搜索场景中都有优势,例如搜索本地业务/组/事件。为了让嵌入模型在生成输出嵌入时考虑位置,我们将位置特征添加到查询和文档侧特征中。对于查询方面,我们提取了搜索者的城市、地区、国家和语言。对于文档方面,我们添加了公开可用的信息,例如管理员标记的明确组位置。结合文本特征,该模型能够成功地学习查询之间的隐式位置匹配和结果。表 2 显示了文本嵌入模型返回的顶级相似文档与用于组搜索的文本 + 位置嵌入模型的并排比较。我们可以看到具有位置特征的模型可以学习将位置信号融合到嵌入中,将与来自肯塔基州路易斯维尔的搜索者具有相同位置的文档排名到更高的位置。

社交嵌入功能。为了利用丰富的 Facebook 社交图来改进统一嵌入模型,我们训练了一个单独的嵌入模型来基于社交图嵌入用户和实体。这可以帮助将综合社交图合并到一个统一的嵌入模型中,否则可能没有完整的社交图信息。

在这里插入图片描述

4 服务

4.1 人工神经网络

由于以下优点,我们将基于倒排索引的 ANN(近似近邻)搜索算法部署到我们的系统中。首先,由于嵌入向量的量化,它具有较小的存储成本。其次,更容易集成到现有的基于倒排索引的检索系统中。我们使用 Faiss 库 [9] 来量化向量,然后在我们现有的倒排表扫描系统中实现高效的 NN 搜索。

嵌入量化有两个主要组成部分,一个是粗量化,通常通过 K-means 算法将嵌入向量量化为粗略的簇,另一个是乘积量化 [8],它进行细粒度量化以实现有效计算嵌入距离。我们需要调整几个重要参数:

(1)粗量化。粗略量化有不同的算法。比较 IMI [11] 和 IVF [15] 算法很有用。调整粗集群的数量 num_cluster 很重要,这将影响性能和召回率。
(2)产品量化。产品量化算法有多种变体,包括普通 PQ、OPQ、带有 PCA 变换的 PQ。 PQ pq_bytes 的字节数是一个重要的调整参数。
(3)nprobe。 nprobe 是决定将多少簇分配给查询嵌入的参数,这将进一步决定将扫描多少粗簇。这个参数会影响性能和召回。

在这里插入图片描述

在这里插入图片描述

我们建立了一个离线管道来有效地调整这些参数。此外,我们需要进行在线实验,以根据离线调整从选定的候选者中确定最终设置。下面我们将分享我们从 ANN 调优中获得的技巧和学习。
(1)根据扫描文档的数量调整召回。最初,我们比较了相同设置 num_cluster 和 nprobe 的不同粗量化算法的召回率。然而,从更多的数据分析中,我们发现集群是不平衡的,尤其是对于 IMI 算法——大约一半的集群只得到了几个样本。这将导致 num_cluster 和 nprobe 的相同设置的扫描文档数量不同。因此,我们采用扫描文档的数量作为近似性能的更好指标对 ANN 调整的影响,如图 3 所示。我们使用 1-recall@10 测量了 ANN 准确度,这是在 ANN 搜索的前 10 个结果中从精确 KNN 搜索中获得最佳结果的平均召回率。
(2)当模型发生重大变化时调整 ANN 参数。我们观察到人工神经网络的性能与模型特征有关。例如,当我们对使用非点击印象训练的模型使用集成技术时,我们发现虽然模型显示出比基线更好的召回率,但在对两者进行量化后,召回率比基线更差。当模型训练任务发生重大变化时,应始终考虑调整 ANN 参数,例如,添加更多的难负样本。
(3)总是尝试 OPQ。在应用量化之前转换数据通常很有用。我们尝试使用 PCA 和 OPQ [5] 来转换数据,并观察到 ​​OPQ 通常更有效,如表 3 和图 3 所示。OPQ 的一个警告是:由于它应用了嵌入的旋转,我们也可能需要重新调整 num_cluster 和 nprobe 以扫描类似的文档。
(4)选择 pq_bytes 为 d/4。乘积量化器将向量压缩成 x 字节码。对于 x 的选择,它与嵌入向量的维度 d 有关。更大的 x 会导致更高的搜索准确度,但会增加内存和延迟。从经验结果来看,我们发现在 x > d/4 之后,精度的提升是有限的。
(5)在线调整 nprobe、num_clusters 和 pq_bytes 以了解真正的性能影响。虽然离线调整 ANN 算法和参数以获得对性能与召回权衡的合理理解很重要,但我们发现在线部署 ANN 算法和参数的多个配置以更好地了解性能影响非常重要从基于嵌入的检索到真实系统。这对于决定容量预算和减少离线调优中参数搜索的范围很重要。

4.2 系统实施

为了将基于嵌入的检索集成到我们的服务堆栈中,我们在 Unicorn [3] 中实现了对 NN 搜索的一流支持,该检索引擎为 Facebook 的大多数搜索产品提供支持。 Unicorn 将每个文档表示为一组术语,它们是任意字符串,表示文档的二进制属性,通常以其语义命名。例如,居住在西雅图的用户 John 将拥有术语 text:john 和 location:seattle。术语可以附加有效负载。
查询可以是关于术语的任何布尔表达式。例如,以下查询将返回姓名中包含 john 和 smithe 并且居住在西雅图或门洛帕克的所有人:
(and (or (term location:seattle) (term location:menlo_park)) (and (term text:john) (term text:smithe)))
为了支持 NN,我们扩展了文档表示以包含嵌入,每个嵌入都有一个给定的字符串键,并添加了一个 (nn :radius ) 查询运算符,它匹配 嵌入在指定半径内的所有文档查询嵌入。

在索引时,每个文档嵌入都被量化并变成一个术语(对于它的粗集群)和一个有效负载(对于量化的残差)。在查询时,(nn)在内部被重写为与最接近查询嵌入(探针)的粗集群相关联的术语(或),并且为了匹配文档,检索术语有效负载以验证半径约束。可以使用附加属性 :nprobe 指定探测器的数量。通过在预先存在的原语方面实现 NN 支持,而不是编写单独的系统,我们继承了现有系统的所有功能,例如实时更新、高效的查询计划和执行,以及对多跳查询的支持(参见 [ 3])。

后者允许我们支持 top-K NN 查询,而不是按半径匹配,我们只选择最接近查询的 K 个文档,然后评估查询的其余部分。然而,从我们的实验研究中,我们发现半径模式可以更好地权衡系统性能和结果质量。一个可能的原因是半径模式启用了受约束的 NN 搜索(受匹配表达式的其他部分约束),但前 K 模式提供了更宽松的操作,需要扫描整个索引以获得前 K 个结果。因此,我们在当前生产中使用基于半径的匹配。

4.2.1 混合检索

通过将 (nn) 运算符作为布尔查询语言的一部分,我们现在可以支持混合检索表达式,具有嵌入和术语的任意组合。这可以用于基于模型的模糊匹配,可以改进拼写变化、可选化等情况,同时重用检索表达式的其他部分并从中受益。例如,假设一个拼写错误的查询 john smithe 正在西雅图或门洛帕克寻找一个名叫 john smith 的人;检索表达式看起来像上面的那个。
该表达式将无法检索相关用户,因为术语 text:smithe 将无法匹配该文档。我们可以通过 (nn) 运算符为这个表达式添加模糊匹配:
(and (or (term location:seattle)
(term location:menlo_park))
(or (and (term text:john)
(term text:smithe))
(nn model-141795009 :radius 0.24 :nprobe 16)))
其中 model-141795009 是嵌入的关键。在这种情况下,如果查询 (john smithe) 嵌入和文档 (john smith) 嵌入之间的余弦距离小于 0.24,则将检索目标用户。

4.2.2 模型服务

我们通过以下方式为嵌入模型提供服务。双边嵌入模型训练完成后,我们将模型分解为查询嵌入模型和文档嵌入模型,然后分别为这两个模型服务。对于查询嵌入,我们将模型部署在在线嵌入推理服务中以进行实时推理。对于文档,我们使用 Spark 离线批量进行模型推理,然后将生成的嵌入与其他元数据一起发布到前向索引中。我们进行了额外的嵌入量化,包括粗量化和 PQ 以将其发布到倒排索引中。

4.3 查询和索引选择

为了提高 EBR 的效率和质量,我们进行了查询和索引选择。我们应用查询选择技术来克服过度触发、巨大的容量成本和垃圾增加等问题。我们没有为某些查询触发 EBR,因为 EBR 不擅长并且不会为它们提供额外的价值,例如搜索者正在寻找之前搜索并点击过的特定目标的简单查询,或者查询意图明显不同的查询。嵌入模型被训练。在索引方面,我们进行了索引选择以加快搜索速度。例如,我们只选择月活跃用户、最近事件、热门页面和群组。

5 后期优化

Facebook 搜索排名是一个复杂的多阶段排名系统,每个阶段逐步细化前一阶段的结果。在这个堆栈的最底部是检索层,其中应用了基于嵌入的检索。然后,检索层的结果由一堆排名层进行排序和过滤。每个阶段的模型都应该针对前一层返回的结果分布进行优化。然而,由于当前的排名阶段是为现有的检索场景设计的,这可能会导致从基于嵌入的检索返回的新结果被现有的排名器排名次优。为了解决这个问题,我们提出了两种方法:

嵌入作为排名特征。在漏斗中进一步传播嵌入相似性不仅有助于排名器识别基于嵌入的检索的新结果,而且还为所有结果提供通用语义相似性度量。我们探索了几种基于嵌入提取特征的选项,包括查询嵌入和结果嵌入之间的余弦相似度、Hadamard 积和原始嵌入。根据我们的实验研究,余弦相似性特征始终显示出比其他选项更好的性能。

训练数据反馈循环。虽然基于嵌入的检索可以提高检索召回率,但与术语匹配相比,它的精度可能较低。为了解决精度问题,我们建立了一个基于人工评分管道的闭合反馈循环。特别是,我们在启用基于嵌入的检索后记录了结果,然后将这些结果发送给人类评估者以标记它们是否相关。我们使用这些人工评分数据来重新训练相关模型,以便它可以用于从基于嵌入的检索中过滤掉不相关的结果,同时保留相关的结果。这被证明是一种有用的技术,可以在基于嵌入的检索中实现高精度的召回改进。

6 高级主题

基于嵌入的检索需要广泛的研究才能继续提高性能。我们研究了嵌入建模的两个重要领域:硬挖掘和嵌入集成,以继续推进基于嵌入的检索解决方案的最新技术。

6.1 硬挖掘

检索任务的数据空间在文本/语义/社交匹配度上具有不同的数据分布,因此为嵌入模型设计训练数据集以在此类空间上高效学习非常重要。为了解决这个问题,硬挖掘是嵌入学习的一个主要方向,也是一个活跃的研究领域。然而,大多数研究来自计算机视觉领域和分类任务[6,14,16,17],而搜索检索没有“类”的概念,因此是现有技术不一定能解决的独特问题工作。在这个方向上,我们将我们的解决方案分为两部分:硬负挖掘和硬正挖掘。

6.1.1 硬负挖掘(HNM)

在分析我们的人物搜索嵌入模型时,我们发现给定查询的嵌入的前 K 个结果通常具有相同的名称,即使存在社交特征,该模型也并不总是将目标结果排名高于其他结果。这促使我们相信该模型还不能正确利用社交特征,这很可能是因为负训练数据太容易了,因为它们是随机样本,通常具有不同的名称。为了使模型更好地区分相似的结果,我们可以使用更接近嵌入空间中正样本的样本作为训练中的硬负样本。

在线硬负挖掘
由于模型训练基于小批量更新,因此可以以动态但有效的方式在每个批次中选择硬负样本。每批包含 n 个正对 {(q(i),d(i) + )}ni=1。然后对于每个查询 q(i),我们使用所有其他正文档 {d(1) + , …,d(j) + , …,d(n) + |j , i 形成一个小文档池} 并选择获得最高相似度分数的文档作为最难的负样本来创建训练三元组。启用在线硬负挖掘是我们模型改进的主要贡献者之一。它持续显着提高所有垂直领域的嵌入模型质量:+8.38% 的人员搜索召回率;组搜索召回率 +7%,事件搜索召回率 +5.33%。我们还观察到,最佳设置是每个正数最多两个硬负数。使用两个以上的硬底片将开始降低模型质量。
在线 HNM 的一个限制是,从随机样本中产生任何硬负样本的概率可能很低,因此无法产生足够硬的负样本。接下来,我们看看如何基于整个结果池生成更难的负样本,也称为离线硬负挖掘。
离线硬负挖掘
离线硬负挖掘有以下过程:
(1) 为每个查询生成前 K 个结果
(2)基于硬选择策略选择hardnegatives
(3) 使用新生成的三元组重新训练嵌入模型
(4) 过程可以迭代。

我们进行了广泛的实验来比较离线硬负挖掘和在线硬负挖掘。一个可能首先看起来违反直觉的发现是,仅使用硬负数训练的模型不能胜过使用随机负数训练的模型。进一步的分析表明,“硬”模型对非文本特征赋予了更多的权重,但在文本匹配方面比“简单”模型更差。因此,我们努力调整采样策略,最终生成了一个性能优于在线 HNM 模型的模型。

第一个见解是关于硬选择策略。我们发现使用最难的例子并不是最好的策略。我们比较了不同等级位置的采样,发现等级 101-500 之间的采样实现了最好的模型召回。第二个见解是关于检索任务优化。我们的假设是,训练数据中存在容易的负样本仍然是必要的,因为检索模型是在包含具有混合硬度级别的数据的输入空间上操作的,其中大多数是非常容易的负样本。因此,我们探索了几种将随机负数与硬负数相结合的方法,包括从简单模型进行迁移学习。根据我们的实证研究,以下两种技术显示出最高的有效性:

混合简单/困难训练:在训练中混合随机和困难的否定是有利的。增加easy to hard negatives的比例会继续提高模型召回率,并且在easy:hard=100:1时达到饱和。

从“hard”模型到“easy”模型的迁移学习:虽然从easy到hard模型的迁移学习不会产生更好的模型,但从hard到easy的迁移学习实现了进一步的模型召回改进。

最后但并非最不重要的一点是,对训练数据中的每个数据点进行详尽的 KNN 计算非常耗时,并且由于计算资源有限,总的模型训练时间将变得不切实际。对于离线硬否定挖掘算法来说,有一个有效的前 K 代是很重要的。近似最近邻搜索是一种实用的解决方案,可以显着减少总计算时间。此外,在一个随机分片上运行 ANN 搜索足以生成有效的硬负样本,因为我们在训练期间只依赖半硬负样本。

6.1.2 硬正挖掘

我们的基线嵌入模型使用点击或印象作为积极因素,现有产品已经可以返回。为了通过基于嵌入的检索来最大化互补增益,一个方向是识别尚未被生产成功检索但积极的新结果。为此,我们从搜索者的活动日志中挖掘了失败搜索会话的潜在目标结果。我们发现通过这种方式挖掘出来的正样本对于帮助模型训练是有效的。仅使用硬阳性训练的模型可以达到与点击训练数据相似的模型召回水平,而数据量仅为 4%。它可以通过结合硬阳性和印象作为训练数据来进一步提高模型召回率。

6.2 嵌入集成

我们从 HNM 实验中了解到,简单示例和困难示例对于 EBR 模型训练都很重要——我们需要困难示例来提高模型精度,但简单示例对于表示检索空间也很重要。使用随机负数训练的模型模拟了检索数据分布,并针对非常大的 K 时的召回进行了优化,但当 K 较小时,它在 top K 处的精度很差。另一方面,模型经过训练以优化精度,例如使用非点击印象作为否定或离线硬否定训练的模型擅长对较小的候选集进行排名,但在检索任务中失败。此后,我们建议通过多阶段方法将不同硬度级别训练的模型组合起来,其中第一阶段模型专注于召回,第二阶段模型专注于区分第一阶段模型返回的更多相似结果。我们与 [18] 中的级联嵌入训练具有相同的精神,它集成了一组以级联方式训练的不同硬度级别的模型。我们探索了不同形式的集成嵌入,包括加权连接和级联模型,发现两者都有效。

加权串联
由于不同的模型为(查询、文档)对提供了不同的余弦相似度分数,我们使用余弦相似度的加权和作为度量来定义该对的接近程度。更具体地说,对于任何查询 Q 和文档 D,给定一组模型 {M1,···,Mn} 及其相应的权重,α1,···,αn > 0,我们定义加权集成相似度得分 Sw (Q, D) 在 Q 和 D 之间为
在这里插入图片描述
其中 VQ,i, 1 ≤ i ≤ n 表示模型 Mi 对 Q 的查询向量,UD,i, 1 ≤ i ≤ n 表示模型 Mi 对 D 的文档向量。出于服务目的,我们需要将多个嵌入向量集成到一个表示中,分别用于查询和文档方面,以满足上述度量属性。我们可以证明,对归一化向量的一侧应用加权乘法可以满足需要。具体来说,我们通过以下方式构建查询向量和文档向量:
在这里插入图片描述
容易看出 EQ 和 ED 的余弦相似度与 Sw (Q, D) 成正比:
在这里插入图片描述

如上所述,我们以与第 4 节中描述的相同方式为集成嵌入提供服务。权重的选择是经验性的,可以基于评估数据集的性能。

我们探索了第二阶段嵌入模型的几个模型选项。实验表明,使用非点击印象训练的模型实现了最好的 kNN 召回(比基线模型提高了 4.39%)。然而,在应用嵌入量化时,与单一模型相比,它遭受了更多的精度损失,因此在线服务时实际收益减少了。我们发现,要在嵌入量化后获得最佳召回率,最佳策略是使用离线硬负挖掘模型集成一个相对简单的模型,其中训练负例的硬度级别已被修改和调整。该集成候选者的离线模型改进略低,但能够在线实现显着的召回改进。

级联模型
与加权集成中的并行组合不同,级联模型以串行方式在第一阶段模型的输出上运行第二阶段模型。我们比较了不同的第二阶段模型选项。我们发现使用非点击印象训练的模型不是一个好的候选者;整体改进远小于加权集成方法。此外,随着要由第二阶段模型重新排序的结果数量的增加,增益减少。然而,在第二阶段使用离线硬否定模型在基线上实现了 3.4% 的召回率改进。它是更适合级联的模型候选者,因为为离线 HNM 构建的训练数据完全基于第一阶段模型的输出。

此外,我们探索了另一种级联模型组合。我们观察到,虽然与文本嵌入相比,统一嵌入整体具有更大的模型召回率,但由于将重点转移到社交和位置匹配,它产生了新的文本匹配失败。为了增强模型的文本匹配能力从而提高模型精度,我们采用了级联策略:使用文本嵌入预选文本匹配候选,然后使用统一嵌入模型对结果重新排序以返回最终的最佳候选。与单独使用统一嵌入模型相比,它实现了显着的在线改进。

7 结论

通过利用深度学习研究的进步,将语义嵌入引入搜索检索以解决语义匹配问题具有长期的好处。然而,由于建模难度、系统实现和跨栈优化的复杂性,这也是一个极具挑战性的问题,特别是对于大规模的个性化社交搜索引擎。在本文中,我们展示了我们的统一嵌入方法来为社会搜索建模语义,以及在基于经典倒排索引的搜索系统中实现基于嵌入的检索。

这只是实现统一嵌入模型和基于嵌入的检索系统的第一步。端到端优化系统以使其在结果质量和系统性能方面表现良好,还有很长的路要走。我们介绍了我们在模型改进、服务算法调优和后期优化方面的经验。我们相信这将是宝贵的经验,可以帮助人们在实际搜索引擎中更快地进行基于嵌入的检索。通过利用最新的语义嵌入学习技术,在生产中成功部署基于嵌入的检索为检索质量的可持续改进打开了大门。我们介绍了我们沿着这个方向迈出的第一步的进展和学习,特别是在硬挖掘和嵌入集成方面。

未来有巨大的机会不断改进该系统。未来,主要有两个方向去追求。一是深入。在建模方面,我们可以应用最新的高级模型,例如 BERT [4] 或构建特定于任务的模型来解决特定的问题部分。我们可以在不同阶段进行更深入的研究,包括服务算法调整和排名模型改进,以全栈故障分析为指导,以确定不同栈的改进机会。另一个是普及。我们可以利用预先训练的文本嵌入模型来开发一个通用的文本嵌入子模型,以应用于不同的任务。此外,我们可以在所有用例中开发通用查询嵌入模型。