KDD2020 | 揭秘Facebook搜索中的语义检索技术

星标/置顶小屋,带你解锁

最萌最前沿的NLP、搜索与推荐技术

文 | 江城

编 | 可盐可甜兔子酱


导读:今天分享一下 Facebook 发表在 KDD2020 的一篇关于社交网络搜索中的 embedding 检索问题的工作,干货很多,推荐一读。

论文题目
Embedding-based Retrieval in Facebook Search
论文链接
https://arxiv.org/abs/2006.11632

Arxiv访问慢的小伙伴也可以在【夕小瑶的卖萌屋】订阅号后台回复关键词【0731】下载论文PDF~


相对于传统的网页搜索,社交网络中的搜索问题不仅需要关注输入 query 的信息,还需要考虑用户的上下文信息,在 Facebook 搜索场景中用户的社交图网络便是这种上下文信息中非常重要的一部分。

怎么把各式各样的信息进行融合呢?

虽然语义检索技术(Embedding-based Retrieval,EBR)在传统的搜索引擎中得到了广泛应用,但是 Facebook 搜索之前主要还是使用布尔匹配模型,本文就来谈谈如何将 Embedding 检索技术应用在 Facebook 搜索场景中。

文中共介绍了三方面的经验:

  1. 提出了一套统一的 embedding 框架用于建模个性化搜索中的语义

  2. 提出了基于经典的倒排索引进行在线 embedding 检索的系统

  3. 讨论了整个个性化搜索系统中很多端对端的优化技巧,例如最近邻搜索调参经验、全链路优化等

最后,在Facebook 垂直搜索场景下验证了本文方法的有效性,在线上 A/B 实验取得了显著的收益。

背景

从 query 中准确计算出用户的搜索意图以及准确表征文档的语义是非常困难的。之前的搜索算法主要还是通过关键词匹配的方式进行检索,但是对于字面不匹配但是语义相似的 case 基于关键词匹配的方法就不奏效了。而通过 embedding 可以建模句子之间的语义相似度,所以基于 embedding 的语义检索就应运而生了。

所谓 embedding 就是将高维稀疏的 id 映射成为一个低维稠密的向量,这样就可以在同一个向量空间中同时表示query 和候选集文档,从而进行譬如计算相似度等方面的操作。

一般来说,搜索主要包含检索排序两个阶段。尽管 embedding 技术可以同时被应用在两个阶段,但相对来说应用在召回阶段可以发挥出更大的作用。简单来说,EBR 就是用 embedding 来表示 query 和 doc,然后将检索问题转化为一个在 Embedding 空间的最近邻搜索的问题。它要解决的问题是如何从千万个候选集中找到最相关的 topK 个,难点有如下的两个:一方面是如何构建千万级别的超大规模索引以及如何在线上进行服务;另一方面是如何在召回阶段同时考虑语义信息和关键词匹配信息。

本文从三个方面详细讲述了在 Facebook 搜索中应用 Embedding 检索技术遇到的挑战:

  • modeling: 本文提出了一套统一的 Embedding 模型框架 ,也就是经典的双塔结构,一侧是抽取用户侧 query 特征;另一侧则是抽取 document 侧的特征。

  • serving: 为了优化系统检索和排序的综合效果,Facebook 提出了将 EBR 的 embedding 作为特征整合进 ranking 模型中,以及创建了一套数据反馈机制,以便更好地识别和利用 EBR 的召回结果。

  • full-stack optimization: 针对实际的搜索效果优化提出了多个实用的 tricks。

系统建模

本文将搜索引擎中的检索任务建模为一个召回优化问题。从离线指标的角度,我们希望最大化 topK 返回结果的recall 指标。给定一个 query,以及期望被检索到的目标文档集合 T,T 中包含的文档可以来自用户的点击数据,也可以是经过人工筛选排序后的文档,我们的优化目标则是 recall@K

继而我们把召回优化问题建模成 query 和 doc 之间基于距离的排序问题,把 query 和 doc 同时表示成低维稠密的向量,通过计算向量空间中的距离衡量它们之间的相似度或相关度,本文中我们采用 cosine 距离。

但是在 Facebook 个性化检索场景下,仅仅计算 query 本身与候选文档的相似性是远远不够的,我们同时要考虑用户的上下文信息,比如他关注的人,他的关注话题等等,才能帮用户找到他真实的最想要的结果。为了实现这个目标,本文提出了统一嵌入模型,即Unified Embedding Model

Unified Embedding Model的思路相对来说比较简单,沿用了经典的双塔结构,包括三个部分:query encoder,document encoder 以及 similarity function。两个encoder是互相独立的,也可以共享一部分网络参数,左边是 user 的塔;右边是 document 的塔,但是 Unified Embedding Model 的  encoder 的输入是和传统的输入不同的,user 塔的输入包括用户的检索 query,以及用户位置用户社交关系等上下文特征,document 塔的输入包括文档本身,以及文档的 group 信息等上下文特征,模型结构详见下图所示。其中大部分的特征都是类别型特征,进行 one-hot 或者 multi-hot 的向量化;连续型特征则是直接输入到各自的塔中。

在模型训练的损失函数上,本文定义了一个三元组损失函数,使得负例比正例相对 query 的距离尽可能的远。在使用三元组损失函数的情况下,使用随机采样的负样本可以近似求解召回优化问题。

对于训练 embedding 语义召回模型来说,如何定义正负样本对于模型的效果至关重要。点击样本作为正样本这个没有疑问,针对负样本我们采用了如下的两种的策略进行试验。

  • 随机负样本:随机从文档库中采样 document 作为负样本;

  • 曝光但未点击样本:随机采样在同一个 session 中曝光但未点击的样本作为负样本;

本文发现前者作为负样本的效果要明显好于后者,原因是前者可以有效消除负样本偏差。另外,本文还进行了一组把曝光但是未点击的样本作为正样本的实验,实验结果表明并没有带来额外的收益。

特征工程

Unified Embedding Model 架构的一个最明显的优势是可以任意加入各种各样的上下文特征。我们都知道 Facebook 推出的工业界实战论文都比较注重特征工程,Unified Embedding 大体上采用了如下三个方面的特征

  • Text features

Text Embedding 采用 char n-gram,相对于 word n-gram 有两方面的优势,一是有限的词典,char embedding table 会比较小,训练更高效;二是不会有 OOV 问题,subword 可以有效解决拼写错误以及单词的多种变体引入的 OOV 问题。

  • Location features

位置特征对于搜索引擎的很多场景是非常重要的,因此本文在 query 和 document 侧的都加入了 location 的特征。

  • Social Embedding features

为了有效利用 Facebook 社交网络中的丰富信息,本文额外地训练了一个社交网络的 Graph Embedding,然后将这个预训练的 Embedding 作为特征输入到模型当中。

在线Serving

前面的章节讲如何进行离线建模以及特征工程,这一节主要讲如何进行在线实时检索,Facebook 采用了自家的 Faiss 库进行线上近似最近邻搜索(approximate nearest neighbor search, ANN)。具体地,他们在实际系统中部署了一套基于倒排索引的 ANN 搜索算法,首先,利用自家的 Faiss 库创建向量索引,然后对索引表进行高效的最近邻检索。对 embedding 进行量化可以有效节省存储开销,同时可以方便地集成到现有的检索系统当中。

一个 query 可以表示为基于 term 的布尔表达式,譬如 john 和 smithe 住在 seattle 或者 menlo_park 可以用下面的布尔表达式来表示。在实际使用中,在 document 的布尔表示基础上,加上了 document embedding 的索引。

Embedding model 离线训练完成后通过 spark 构建候选文档集 document 的索引,当用户请求过来时,query 的 embedding 在线计算,进行 topK 召回。针对全量的候选文档集进行索引是非常耗存储和费时的,所以本文在构建索引的时候,只选择了月活用户,近期事件,热门的事件,以及热门 group。大部分公司在构建索引的时候也都会采取这样的策略,很多长时间不活跃的可以不构建索引。

Full-stack优化

Facebook 的搜索引擎可以看作是一个复杂的多阶段的排序系统,检索是排序之前的流程,检索得到的结果需要经过排序层的过滤和 ranking,我们可以将检索过程召回的分数(也就是向量的相似度)作为 ranking 阶段的一个特征,通过 ranking 模型进行统一排序。由于现有的排序算法是基于已有的检索算法的特点设计的,所以对于基于 embedding 召回的结果自然是被次优处理的,为了解决这个问题,作者提出了两个方法:

  • Embedding as ranking feature: 将检索这一步骤得到的 embedding similarity 作为接下来排序的输入特征,实验证明余弦相似度的效果要优于其他相似度特征。

  • Training data feedback loop: 基于 embedding 的语义召回的结果存在召回高但是精度低的问题,所以本文就采用了对召回结果进行人工标注的方法,对每个query召回的结果进行标注,区分相关结果和不相关结果,然后用标注后的数据重新训练模型,从而提升模型精度。(人工大法好)

基于 embedding 的语义召回模型需要更加深入的分析才能不断提升性能,Facebook 给出了其中可以提升的重要方向一个是 Hard Mining,另一个是 Embedding Ensemble。具体地有以下几个方法:

Hard Negative Mining 文章发现很多时候同语义召回的结果,大部分都是相似的,而且没有区分度,最相似的结果往往还排不到前面,这些就是之前的训练样本太简单了,导致模型学习的不够充分。所以本文把那些和 positive sample 很近的样本作为负样本去训练,这样模型就能学到这种困难样本的区分信息。

Online hard negative mining 模型是采用mini-batch的方式进行参数更新的,对batch中每个positive pair (q_i, d_i),利用除 d_i 以外的其他正例文档组成一个文档集,从中选择最相近的文档作为困难负例 hard negative sample,通过这种方式构造的三元组数据 可以使模型效果提升非常明显,同时也注意到了每个 positive pair,最多只能有两个 hard negative sample,不然模型的效果会下降。

Offline hard negative mining 首先针对每个 query 召回 topK 个结果;然后选择一些 hard negative samples 进行重新训练,重复整个过程。同时根据经验负例样本的比例是 easy : hard=100:1。

Hard positive mining 模型采用了用户点击的样本为正样本,这一部分样本是现有系统已经可以召回的相对简单样本,但是还有一些用户未点击但是也能被认为是正样本的样本。作者从用户日志中挖掘出潜在的困难正样本(具体如何挖掘文章没有提及),发现训练数据量只有原来 4% 的情况下可以得到和原来相近的召回率,如果把这些困难正例和用户点击数据一起训练说不定有更好的效果。

Embedding Ensemble 简单样本和困难样本对训练 EBR 模型都很重要,简单样本可以让模型快速学习到数据分布特点,困难样本可以提升模型的 precision,所以采用不同难度的正负样本训练出来的模型各有优势,如何对这些模型进行融合以提升性能呢?第一种方案是 Weighted Concatenation,通过对不同模型计算的相似度 score 进行加权平均作为最终相似度值,采用加权融合的模型对于单模型而言有 4.39% 的提升。第二种方案是 Cascade Mode,模型以串行方式在第一阶段模型的输出上运行第二阶段模型。采用串行的方式,模型也有 3.4% 的提升。

总得来说,这是一篇浓浓工业风的文章,虽然没有特别fancy的方法,但是系统级的优化方案上很值得大家学习。


 文末福利 

后台回复关键词入群
加入卖萌屋NLP/IR/Rec与求职讨论群
有顶会审稿人、大厂研究员、知乎大V和妹纸
等你来撩哦~

 关注星标 

带你解锁最前沿的NLP、搜索与推荐技术

参考文献

[1] Embedding-based Retrieval in Facebook Search 

[2] https://zhuanlan.zhihu.com/p/152570715

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis系列教程(八):分布式锁的由来、及Redis分布式锁的实现详解

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?今天来探讨分布式锁这个话题。 什么是…

技术交流:老刘说NLP技术公众号开通

我有一个念想:在当今PR文章满天飞的背景下,我们能够保持人间清醒,对NLP技术有客观、公正的了解,并实事求是地进行技术实践和知识共享。老刘说NLP,将定期发布更多、更简单、更有趣的语言知识、想法、笔记,包…

POJ 2453 贪心应用

文章目录1. 题目1.1 题目链接1.2 题目大意1.3 解题思路2. Accepted 代码1. 题目 1.1 题目链接 http://poj.org/problem?id2453 1.2 题目大意 一个数x的二进制表示有n个1,求一个有相同个数1的二进制数(比x大,且要最小的) 1.3…

ICML2020 | 一行代码就能实现的测试集上分技巧

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 苏剑林编 | 夕小瑶在训练模型的时候,我们需要损失函数一直训练到0吗?显然不用。一般来说,我们是用训练集来训练模型,但希望的是验证集的损失越小越好&…

Redis系列教程(七):Redis并发竞争key的解决方案详解

Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题: 高并发架构系列:Redis缓存和MySQL数据一致性方案详解 如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难…

技术动态 | 北京大学计算机所邹磊教授研究组开源面向 RDF 知识图谱的自然语言问答系统 gAnswer...

项目网站: http://ganswer.gstore-pku.com/代码地址: https://github.com/pkumod/gAnswerOpenKG发布地址: http://openkg.cn/tool/ganswer研究组主页: http://mod.icst.pku.edu.cn一、KBQA 任务简介基于知识库的自然语言问答 (Question Answering over Knowledge Base, KBQA) 主…

POJ 2287 田忌赛马(贪心)

文章目录1. 题目1.1 题目链接1.2 题目大意1.3 解题思路2. Accepted 代码1. 题目 1.1 题目链接 http://poj.org/problem?id2287 1.2 题目大意 双方各有n匹战斗力各异的马,分别派出来PK,假设对方先出牌,我方后出,求我方最多能胜…

Netty的实现原理、特点与优势、以及适用场景

高并发编程系列 高并发编程系列:NIO、BIO、AIO的区别,及NIO的应用和框架选型 高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 高并发编程系列:CountDownLatch、Semaphore等4大并发工具类详解 高并发编程系列&…

拒绝无脑吹!从ACL20看预训练缺陷

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 舒意恒、兔子酱以 BERT 为代表作的预训练模型的研究热度一直很高,到 0202 年了,预训练的研究依旧层出不穷,而且 ACL 2020 Best Paper 荣誉提名也选择了这一主题的研究…

论文浅尝 | AMUSE: 基于 RDF 数据的多语言问答语义解析方法

来源:ISWC 2017链接:https://link.springer.com/content/pdf/10.1007%2F978-3-319-68288-4.pdf本文主要关注基于RDF数据的多语言问答任务中,对不同语言问句的语义分析工作。作者提出一种基于DUDES(Dependency-based Underspecified Discourse…

贪心应用--汽车加油次数问题

文章目录1. 问题描述2. 解题思路3. 实现代码4. 测试结果1. 问题描述 已知汽车的油箱额定里程,到目的地的路途中各加油站距起点的距离,求如何加油,让加油的次数最少。 2. 解题思路 每次出发前检查下一个加油站有多远,车子能不能…

最全多线程经典面试题和答案

Java实现线程有哪几种方式? 1、继承Thread类实现多线程2、实现Runnable接口方式实现多线程3、使用ExecutorService、Callable、Future实现有返回结果的多线程 多线程同步有哪几种方法? Synchronized关键字,Lock锁实现,分布式锁等…

论文浅尝 | Aligning Knowledge Base and Document Embedding Models

本文是我们于苏黎世大学合作的关注与知识图谱和文本对齐的论文,发表于ISWC2018.文本和知识图谱都包含了丰富的信息, 其中知识图谱用结构化的三元组表示信息,文本用自由文本形式表示信息,信息表示的差异给知识图谱和文本融合对齐造成了困难&am…

学会提问的BERT:端到端地从篇章中构建问答对

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 苏剑林机器阅读理解任务,相比不少读者都有所了解了,简单来说就是从给定篇章中寻找给定问题的答案,即“篇章 问题 → 答案”这样的流程,笔者之前也写过一些…

玩转算法面试-第四章查找值之leetcod相关笔记

查找问题 4-1,2 两类查找问题 1 查找有无:set 2 查找对应关系:map 常见的四种操作: insert, find, erase, change(map) 例题 leetcode 349 :给定两个数组,…

分治算法(Divide Conquer)

文章目录1. 分治算法思想2. 应用举例2.1 逆序度3. 分治思想处理海量数据1. 分治算法思想 分治算法的核心思想就是,分而治之,将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并…

史上最全Java多线程面试60题,含答案大赠送!

【BAT必考系列!多线程60题】 多线程有什么用? 线程和进程的区别是什么? ava实现线程有哪几种方式? 启动线程方法start()和run()有什么区别? 怎么终止一个线程&#…

论文浅尝 | Interaction Embeddings for Prediction and Explanation

本文是我们与苏黎世大学合作的工作,将发表于WSDM2019,这篇工作在知识图谱的表示学习中考虑了实体和关系的交叉交互,并且从预测准确性和可解释性两个方面评估了表示学习结果的好坏。给定知识图谱和一个要预测的三元组的头实体和关系&#xff0…

商汤科技-数据运维工程师-提前批笔试题目汇总

2019年8月19日 问答题1:缺失值数据预处理有哪些方法?https://juejin.im/post/5b5c4e6c6fb9a04f90791e0c 处理缺失值的方法如下:删除记录,数据填补和不处理。主要以数据填补为主。 1 删除记录:该种方法在样本数据量十分…

秋招视频攻略!13个offer,8家SSP的Q神谈算法岗秋招技巧

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术大家还记得几个月前卖萌屋Q神推送的那期《13个offer,8家SSP,谈谈我的秋招经验》吗?据说Q神掌握了影分身的话,一毕业就能年薪600万,咳咳。。。ps&…