Embedding-based Retrieval in Facebook Search
2020.7 Facebook
Brief summary:
- Text的boolean match不能解决语义匹配问题,引入embedding。(EBR)
- 双塔模型:query embedding;document embedding; hinge_loss 三元组作为训练样本<q,d+,d_>,q与d+的相似性得分大于q与d-的相似性得分。
- 困难样本挖掘:
- 困难正样本:实际上是正样本但在判断中被判为负的。
- 困难负样本:分在线,离线方式;本质上是选与正样本相似的负样本。
- 简单样本能一般性的代表检索的数据空间(提升召回),困难样本能提升精确率。文章探讨了集成的方法(weight_concat,cascade model),利用这两种方式训练的embedding。
- 在线时,用Fasis相似性搜索工具,NN的方式,最近邻的方式,用ANN搜索算法(Approximate Nearest Neighbor)节省时间。结合了term(Boolean match)和embedding(radius控制相似性得分范围,判断是否match。)做query和document 的match。
一篇关于向量化召回很好的分享:https://mp.weixin.qq.com/s/E5a4TF9P2aMrF6gVatAF8A
Abstract
除了用户搜索的query text,用户的上下文信息也很重要。
之前FB搜索基于Boolean matching model。
引入网页搜索引擎中常用的EBR(基于embedding的召回)
我们介绍了为个性化搜索建模语义嵌入而开发的统一嵌入框架,以及在基于倒排索引的典型搜索系统中为基于嵌入的检索提供服务的系统。
1.INTRODUCTION
搜索技术大多主要基于各种各样的term matching methods。对于关键字匹配可以解决的情况,它表现得很好,但是它很难计算出搜索意图,或者语义上的匹配,不能满足用户的搜索意图。
一种搜索引擎包括一个召回层(recall layer),其目标是以低延迟和计算成本检索一组相关文档,通常称为检索(retrieval),精确层(precision layer)的目标是用更复杂的算法或模型将最需要的文档排在最上面,通常称为排名(rank)。
The application of embeddings in retrieval is called embedding-based retrieval or EBR for short.
简短的来说,embedding-based retrieval 是一种用embedding表示query和文档,并把retrieval问题转换为在embedding空间的最近邻问题的技术。
由于需要考虑海量数据,搜索引擎中的EBR是一个极具挑战性的问题:
process billions or trillions of documents in the index of a search engine;巨大的规模给嵌入训练和嵌入服务带来了挑战。
其次,与计算机视觉任务中的基于嵌入的检索不同,搜索引擎通常需要将基于嵌入的检索和基于词匹配的检索结合起来,在检索层对文档进行评分。
在Facebook搜索中,搜索意图不仅依赖于query text,它是一个复杂的问题还要求理解谁提出这个query,以及这个搜索者所处的上下文(语义环境)。
我们提出一个统一的嵌入模式:建模一个双塔模型,一边是搜索请求包括:query text,搜索者、context,另一边是document。
为了有效地训练模型,我们开发了从搜索日志中挖掘训练数据并从搜索者、query、上下文和文档中提取特征的方法。为了快速的模型迭代,我们采用离线评价集上的召回度量来比较模型。
如何高效地训练模型,我们探索了两个不同的方向: hard mining; ensemble embedding
采用困难样本挖掘技术解决了检索任务的有效表示和学习问题,采用集成嵌入技术将模型划分为多个阶段,每个阶段的查全率和查准率都不同。
模型被部署后,我们需要开发高效的方式在召回层去serve 模型。虽然将现有的检索和嵌入KNN的候选神经网络结合起来构建系统很简单,但我们发现它不是最优的,原因有以下几点:1)从我们的初始实验来看,它的性能成本很大;2)双重指标,维护成本高;3)两个候选集可能存在显著的重叠,使其整体效率低下。
然后,我们开发了一种混合检索框架,将嵌入KNN和布尔匹配结合起来,对文档进行检索评分。为此,我们采用Faiss[9]库进行矢量量化嵌入,并将其与基于倒索引的检索相结合,构建了混合检索系统。该系统除了解决上述问题外,还具有两个主要优点:1)能够联合优化嵌入和词匹配(term matching)来解决搜索检索问题;2)支持受词匹配约束的KNN嵌入,不仅有助于解决系统性能成本问题,而且提高了KNN嵌入结果的精度。
【倒排索引:https://www.cnblogs.com/zlslch/p/6440114.html
单词到文档的映射形式;通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。】
搜索是一个多阶段的过程,召回是第一步。为了去优化搜索的整体,实施later stage optimization, 我们将嵌入方法融入到排序层中,并建立了一个训练数据反馈回路,以主动学习识别基于嵌入的检索结果中的好结果和坏结果。
2.Model
将搜索检索任务视为最大化召回问题。
我们将最大化召回基于query和documents之间的距离,建模为ranking问题,使用cosine 相似度作为举例度量,用 triplet loss(pair_loss,三元组)最大化召回目标,去训练神经网络的编码器(也被成为embedding model)。
不仅仅在query text embedding层面上建模提取语义信息,还要考虑搜索任务中的上下文xi信息,以满足搜索者的个性化信息需求。(personalized search engine 不仅考虑text query,还要考虑搜索者的信息。)
“To model this problem, we propose unified embedding which considers not only text but also user and context information in deriving embeddings.”
2.1 Evaluation Metrics
Offline metrics before online experiment:
我们提出在整个索引中运行KNN搜索,然后使用公式1中定义的recall@K作为模型评价度量。特别是,我们抽样10000个搜索会话来为评估集收集查询和目标结果集对,并报告超过10000个会话的平均recall@K。
2.2 Loss Function
给定一个三元组(q(i),d(i)+,d(i)-),分别为query,与query相关联的positive 文档,negative文档。 Triplet loss定义为:
D(u,v)是向量u,和v之间的距离,m是正负对之间的边界,N是从训练集中选择的三个一组的总数。这个损失函数的直觉是将正的一对和负的一对通过距离间隔分开。我们发现对margin的调参也很重要,不同的训练任务有不同的最优margin,不同的margin导致5-10%的KNN召回方差。
负样本采样:
我们认为,使用随机样本形成负对的三元组损失可以近似召回优化任务。原因如下。如果我们对训练数据中每一个正数抽取n个负数,当候选池大小为n时,模型将对top 1处的召回率进行优化。假设实际serve候选池大小为N,我们近似优化top K处的召回率≈N/n。(在候选集大小为N的情况下,假设有K个为正的匹配文档,K近似等于N/n)在第2.4节中,我们将验证这一假设,并提供不同的正和负标签定义的比较。
2.3 Unified Embedding Model
通过优化triplet loss去学习embedding,我们的模型包三个主要部分:(1)query encoder EQ, 生成query embedding。(2)document encoder ED,生成document embedding。(2)相似性度量函数S(EQ, ED),生成Q,D之间的相似性得分。
Encoder是一个将输入转为低维密集向量(embedding)的神经网络。
这两个编码器f(·)和g(·)在默认情况下是两个独立的网络,但可以选择共享部分参数。对于相似函数,我们选择余弦相似度,因为余弦相似度是嵌入学习中常用的函数之一。
损失函数中的距离D定义为:1 − cos(EQ, ED). (因为要minimize loss fuction)
与传统的text embedding model不同,unified embedding编码文本性的。社交性的以及其他有意义的上下文信息分别表示query 和document。
Eg. 在query side,包含搜索者位置和他们的社交连接,document side:以组搜索为例,聚合了一个Facebook组的位置和社交集群。
大多数特征都是高基数的类别特征(高维稀疏),可以是one-hot 或者multi-hot向量。对于每个分类特征,插入一个嵌入查找层来学习和输出其密集向量表示,然后输入编码器。对于多热向量,采用多重嵌入的加权组合进行最终的特征级嵌入。图2说明了我们统一的嵌入模型体系结构,我们将在第3节中更多地讨论特征工程。
2.4 Training Data Mining
Define negative labels: 实验了两种方式:
- 对每一个query,在document池中随机采样document作为负样本。
- Nonclick impressions: 对每一个query,对在同一个session里那些展现了(另搜索者印象深刻的)却没有点击的结果随机采样作为负样本。
用第二种方式采样的负样本训练导致更低的召回;原因是第二种方式采样的负样本属于hard negatives(很难识别的负样本),它在很多特征上都和query的match程度高。而第一种方式采样的负样本,大多数属于easy cases,和query的match程度本来就很低。
所有的负样本都是这样的hard负样本会改变训练数据对实际检索任务的代表性,这可能会对学习到的嵌入产生很大的偏差。
对正样本选取,也观察了两种方式的效益:
- Clicks:采用点击过的结果作为正样本;
- Impressions: 将检索近似为排序,排名较高的结果或给用户留下印象的结果对检索模型学习都是同样积极的。
观察到两种正样本方式效果相当,但当把两者叠加到一起,没有观察到额外的收益,模型没有随着训练数据体量的增加而得到额外收益。
因此在以上的实验后,我们用click作为正样本,随机采样负样本,可以提供一个合理的模型性能。在此基础上,我们进一步探索了硬挖掘策略(hard negatives),以提高模型区分相似结果的能力。
“Our above study suggested that using click as positive and random as negative can provide a reasonable model performance.”
3 FEATURE ENGINEERING
除了text,引入其他特征;
Unified embedding比text embedding更有效:统一嵌入的有效性在很大程度上取决于能否成功识别和塑造信息特征。
通过向组嵌入模型中添加每个新的特征类别(以文本特征为基线)来显示增量改进。
这一节讨论几个特征给模型性能带来的巨大的提升的贡献:
- Text features 2.location features 3. Social embedding features
- Text embeddings 通过Character n-gram获取,而不是word n-gram;
前者相对于后者有两个方面优点:
第一,前者受字母表大小限制,嵌入查找表的规模较小,在训练过程中可以更有效地学习。
第二,子词表示对于我们在查询(例如拼写变化或错误)和文档侧(由于Facebook中的大量内容库存)遇到的词汇表外问题是健壮的。
Text features提取Facebook entity :includes people (profile), group, page, and event.
与Boolean term matching技术相比,我们发现接受纯文本特征训练的嵌入算法(text embedding )特别擅长解决以下两种情况: Fuzzy text match; Optionalization.
- Location Features
在许多搜索场景下,位置匹配是有利的,比如搜索local business/groups/events.
为了使embedding model考虑位置信息,我们在query和documents这两边都添加了位置特征:
Query side: searcher city, region, country, and language.
document side: publicly available information, such as explicit group location tagged by the admin.
和text特征一起,模型可以学习query和results之间的隐式的位置匹配信息。
从下表中可以看出,增加位置信息后,模型可以学习将位置信息融入到embedding中,提升了搜索结果中位置和搜索者一致的结果排名。
3. Social embedding features.
为了充分利用Fook丰富的社交图信息(social graph)以改善unified embedding model,我们训练了一个单独的嵌入模型来嵌入基于社交图的用户和实体。这有助于将综合的社交图整合到一个统一的嵌入模型中,否则可能没有完整的社交图信息。
4 SERVING
4.1 ANN
通过ANN(approximate near neighbor,近似最近邻搜索)搜索算法部署倒排索引。
两个优点:1.对embedding向量进行量化,减小了存储消耗。2.便于插入到现有的基于倒排索引的检索系统。
我们使用Faiss库对向量进行量化,然后在我们现有的倒表扫描系统中实现有效的NN搜索。“We employed Faiss library [9] to quantize the vectors and then implemented the efficient NN search in our existing inverted table scanning system.”
embedding quantization两个重要部分:
- coarse quantization: 一般通过K-means将嵌入向量量化为粗粒度的clusters
可调参数:cluster数目,影响perf 和recall
- product quantization: 一种能够有效计算嵌入距离的细粒度量化方法。
参数:算法有多种变体,包括vanilla-PQ、OPQ、PCA变换的PQ。PQ-PQ-u字节的字节数是一个重要的参数。
可调参数:Nprobe:
nprobe是一个参数,用于决定将多少簇分配给查询嵌入,这将进一步决定将扫描多少个粗簇。此参数将影响性能和调用。
我们建立了一个离线管道来有效地调整这些参数。另外,我们需要在离线调优的基础上,从选中的候选对象中进行在线实验来确定最终的设置。下面我们将分享我们从ANN调优中得到的技巧和收获。 (这一节介绍了很多参数设置技巧。)
4.2 System Implementation
Query: Boolean expression
Documents: a bag of terms , 表示文档的二进制属性的任意字符串,按惯例用它们的语义命名。
为了支持NN,将document表示扩展包含embedding:
Documents à (nn <key> :radius <radius>)
为了支持NN,我们扩展了文档表示以包括嵌入,每个嵌入都有一个给定的字符串键,并添加了一个(NN :radius )查询操作符,它匹配所有嵌入在查询嵌入(query embedding)的指定半径内的文档。
“each with a given string key, and added a (nn <key> :radius <radius>) query operator which matches all documents whose <key> embedding is within the specified radius of the query embedding. ”
(就是Introduction 里提到的结合term 的boolean match 和embedding match做检索。Hybrid retrieval)
现有的系统的NN,允许我们支持top-K NN查询,其中我们只选择最接近查询的K个文档,然后评估查询的其余部分,而不是根据半径进行匹配。然而,通过实验研究,我们发现半径模式可以更好地权衡系统性能和结果质量。一个可能的原因是,radius模式允许有约束的NN搜索(受匹配表达式的其他部分的约束),但top K模式提供了一个更宽松的操作,需要扫描整个索引来获得top K结果。因此,我们在当前的产品中使用基于半径的匹配。
4.2.1 Hybrid Retrieval.
通过将(nn)运算符作为布尔查询语言的一部分,我们现在可以支持带有任意嵌入和术语组合的混合检索表达式。
这可以用于基于模型的模糊匹配,可以改进拼写变化、可选(spelling variations, optionalization)等情况,同时再利用并受益于检索表达式的其他部分。
比如搜索一个拼写有误的john smithe,实际上是找一个john smith in Seattle or Menlo Park,此时检索 的表达:
该表达式将无法检索相关用户,因为term text:smithe将无法匹配该文档。此时我们可以通过(nn)运算符将模糊匹配添加到这个表达式中:
model-141795009是这个embedding的key, 在这种情况下,如果查询(john smith)嵌入和文档(john smith)嵌入之间的余弦距离小于0.24,那么将检索目标用户。
4.2.2 Model Serving.
双塔模型训练好后,我们将模型解耦为query embedding model,document embedding mode;前者用于在线query embedding实时推理生成。
对于documents我们用spark做离线模型推理(batch offline), 然后将生成的嵌入与其他元数据一起发布到正向索引中。我们做了额外的嵌入量化,包括粗量化和PQ,将其发布到倒排索引中。
(补充:正排索引是倒排索引的基础。
https://blog.csdn.net/GarfieldEr007/article/details/50479074
)
4.3 Query and Index Selection
(应该是指使训练过程更高效,高质量)
为了提升EBR模型的效率和质量,进行query和index挑选。(为了避免huge capacity cost,和信息冗余)原则:不用过于简单的、过于独特的(查询意图、特定目标)query。我们做了挑选,以加快搜索速度。例如,我们只选择每月活跃用户、近期事件、热门页面和群组。
5 LATER-STAGE OPTIMIZATION
Facebook搜索排序是一个复杂的多阶段的排序系统。每一阶段都逐步细化上阶段的结果。这个stage 栈的最顶层就是retrieval layer(召回,EBR部署的地方)。每一个阶段都是来优化上一层的结果分布。但是现有的后面的rankig stages都是基于之前的召回stage设计的,它们可能对我们设计的EBR(embedding based retrieval)输出结果进行排序是次优的结果。
我们提出两个方法:
- 将嵌入相似性进一步向下传播,不仅有助于排名者从基于嵌入的检索中识别新的结果,而且还为所有结果提供了通用的语义相似性度量 (embedding 相似性向后面阶段传播)
- Training data feedback loop.
召回结果给人标记,标记数据对model重新训练,过滤掉EBRmodel产生的不相关的结果。
“We used these human rated data to re-train the relevance model so that it can be used to filter out the irrelevant results from embedding-based retrieval while keeping the relevant ones. “
This proved to be a useful technique to achieve high precision for the recall improvement in embedding-based retrieval. 这被证明是在提升EBR召回率情况下,达到高精确率的一种技巧。
6 ADVANCED TOPICS
Embedding 建模的两个重要部分:hard mining and embedding ensemble
继续推进基于嵌入的检索解决方案的发展。
6.1 Hard Mining
检索任务的数据空间包含多样的数据分布:text /semantic/social matches。要去学习这样的数据空间。一种解决方法是困难样本挖掘:包括hard positives 、negatives挖掘。
6.1.1 Hard negative mining (HNM).
发现top k 的结果中,通常有相同的姓名即使他们的社交特征不一样。说明模型没有利用到社交特征。
原因:训练的负样本是随机采样的,往往都与query有很大差异的姓名。
为了使模型 能够更好的区分类似的结果,我们使用与正样本在embedding上很接近的样本作为训练中的hard negatives。
Online:
模型使通过mini-batch训练更新的。Hard negative可以从每一个batch中动态的挑选。假如一个batch
有n个正样本对,那么的hard negative是利用上一轮迭代得到的召回模型,对于qi,在同一个batch的除di之外的({d(1)+ , ...,d(j)+ , ...,d(n)+ |j!=i}),再选择一个与最相似的作为hard negative,构成训练的三元组。
Online hard mining 是我们模型性能提升的一个主要贡献:+8.38% recall for people search; +7% recall for groups search, and +5.33% recall for events search. 还发现最佳的配置是为每一个positive配置最多两个hard negatives。多了会有反向效果。缺点是仅仅采用一个batch中的item作为hard negative的候选集,规模太小,可能还不足够hard。
继续探索离线挖掘:
Offline hard negative mining.
发现最困难的样本并不是最佳选择。排序在101-500位置之间的hard样本达到最好的model recall;
Easy negative依然很有必要,使用easy和hard混合的负样本,比例为100:1;
迁移学习:从hard model 到 easy model,对模型recall有提升。
在训练数据中运算KNN非常耗时,使用ANN可以大大减少时间消耗。
6.1.2 Hard positive mining.
Baseline 是用clicks或者impressions作为positives。
还使用了没有被成功召回但实际是positive的样本。为了达到这个目标,我们从搜索者的活动日志中挖掘出潜在的失败搜索会话的目标结果。
发现这种方式有助于模型训练。
6.2 Embedding Ensemble
Hard examples 可以提升模型精确率,但简单样本对于代表检索空间很重要。
然后,我们提出采用多阶段方法将不同困难水平训练的模型组合起来,其中第一阶段模型侧重于召回,第二阶段模型专门区分第一阶段模型返回的更相似的结果。
探索了两种embedding集成模式;
We explored different forms of ensemble embeddings, including weighted concatenation and cascade model and found both effective.
weighted concatenation: (并行组合)
given a set of models {M1, ・ ・ ・ ,Mn } ,N个embdeeing模型,a是每个模型的权重。
Query和document之间的得分就是不同模型对q,d相似性预估的加权和。
发现最佳的策略是the best strategy was to ensemble a relatively easier model with offline hard negative mining model, 该候选集合的离线模型改进略低,但能够实现显著的在线召回改善。
Cascade Model. (级联)
在第一个模型输出的基础上通过第二个模型。We compared different second-stage model options.
发现using non-click impressions was not a good candidate,比加权集成的方法改善小很多。
但是使用hard negative model 作为第二阶段模型,有3.4%的recall提升。
还尝试了text embedding 和uninfied embedding 级联。与单独使用统一的嵌入模型相比,该方法在在线上取得了显著的改进。
7 CONCLUSIONS
利用深度学习在搜索召回中引入语义embedding,解决了语义匹配的问题。
但建模仍存在挑战。我们提出unifiedd embedding 去建模社交网络搜索中的语义。并在一个经典的基于倒排索引的搜索系统中实现了基于embedding的检索。
提出并通过实验验证了一些有参考价值的想法:在线算法调试,后面阶段的优化,困难挖掘,和embedding 集成。
未来的两个发展方向:
1.go deep :bert, or build task-specific models to address particular segments of problems
2. go universal : 我们可以利用预先训练的文本嵌入模型,开发一个通用的文本嵌入子模型,用于不同的任务。此外,我们可以开发一个跨所有用例的通用query embedding模型。