Facebook的多任务多模态向量召回模型Que2Search

1. 概述

对于一个搜索系统来说,通常采用的召回都是基于倒排索引的召回,简单来说就是需要对item侧建立倒排索引,在检索的过程中,对query分词,根据分词结果去倒排索引中查找词匹配的item,简单的流程如下图所示:

在这里插入图片描述

在传统的检索过程中,通常存在语义上的问题,比如Query为“连衣裙”,此时根据词匹配就检索不到核心词为“长裙”的item,为了解决这样的问题,需要对Query进行扩展,将其扩展成相似的query,以此来实现语义匹配的问题。当然,词匹配的方式的一大优势就是相关性解决的比较好。为了能从算法上解决语义的gap,双塔的召回结构是现如今较多采用的一种方法。

双塔的召回有如下的一些优势:

  • item侧可离线计算,线上可采用基于ANN的向量匹配方式较快的查找到向量空间与Query相匹配的item
  • 基于模型的方法,可以融入更多的特征

双塔模型的第二点优势就可以方便的对模型的特征进行扩充,尤其现如今对多模态的研究,Que2Search[1]中就是提出使用多模态的方法来训练双塔模型,同时,在Que2Search的item塔中引入了分类的任务,与上面的双塔任务共同构成了多任务的训练方式。

2. Que2Search模型

2.1. Que2Search的模型结构

Que2Search的模型结构如下图所示:

在这里插入图片描述

左侧是一个Query侧的塔,右侧是item侧的塔。

2.2. Query塔

Query塔侧的模型的输入特征有三部分,分别为:

  • Query文本的tri-gram。通过size=3的滑动窗口,得到tri-gram,过hash函数(如MurmurHash)后得到对应的ids,再经过Embedding后得到每个id的向量表示,最终对所有向量做sum-pooling;

  • 用户所在国家。该特征是单分类的特征,也是经过Embedding后表示成向量;

  • Query原始文本。经过一个两层的XLM模型编码,取[CLS]对应的向量作为query的语义表示;

注:XLM模型就是一个基于Transformer的语言模型,类似于BERT。

至此,我们得到了3个向量,如何将这3个向量fuse成一个向量,文中也提出了两种方式,分别为concat和attention。实验结果显示attention的结果要优于concat,假设 φ = { φ i } i = 1 N \varphi=\left\{\varphi _i \right\}_{i=1}^N φ={φi}i=1N表示 N N N个不同来源的向量,将这 N N N个向量concat在一起,得到 Φ \Phi Φ

Φ = φ 1 ∥ ⋯ ∥ φ N \Phi =\varphi _1\parallel \cdots \parallel \varphi _N Φ=φ1φN

计算attention的权重 a a a

a = S o f t m a x ( Φ W ) a=Softmax\left (\Phi W \right ) a=Softmax(ΦW)

其中, W ∈ R N D × N W\in \mathbb{R}^{ND\times N} WRND×N,最后得到最终的合并向量表示: f = ∑ i = 1 N a i φ i f=\sum_{i=1}^{N}a_i\varphi _i f=i=1Naiφi

这里的 Φ \Phi Φ是通过concat多个向量,也有其他的一些方法,如Attention-Based BiLSTM[2]中的计算方法。

2.3. Item塔

Item塔侧的模型的输入特征有五部分,分别为:

  • 商品标题。使用6层XLM-R编码;

  • 商品描述。与商品标题一样,使用6层XLM-R编码;

  • 商品标题的tri-gram。处理方法同query侧的tri-gram;

  • 商品描述的tri-gram。处理方法同query侧的tri-gram;

  • 图像表示:对于每一个商品,都会附带一些图片,通过预训练模型得到图像表示,然后过MLP和Deep set方法对多个图像表示进行融合得到一个向量表示。

多个不同来源的向量通过与上述Query塔一样的Attention的方法得倒最终的向量表示。为了能对item塔的模型更好的学习,因此在这里设置了多标签多类目的分类任务,如上图中的右侧。

2.4. 样本选择

对于双塔模型来说,一般选择点击的样本作为正样本,但是在Que2Search中,选择的正样本需满足以下四个条件:

  • 用户发起一次搜索
  • 点击一个商品
  • 给卖家留言
  • 卖家回复

只有同时满足这四个条件的query和item才能成为正样本。

负样本的选择是双塔召回模型的精髓。对于负样本通常有两种策略:

  • 根据频次从全库中随机采样
  • batch内的随机采样

这是随机样本的部分,通常还会增加一些困难样本,主要有人工的挖掘以及在线的困难样本挖掘。在Que2Search中随机样本是采用的Batch内的负样本,假设batch的大小为 B B B,经过query塔后,query侧的向量为 { q i } i = 1 B \left\{q_i \right\}_{i=1}^B {qi}i=1B,同理,item侧的向量为 { d j } j = 1 B \left\{d_j \right\}_{j=1}^B {dj}j=1B,且向量的维度为 D D D。计算每一个query与item的cosine相似度矩阵,便得到 { c o s ( q i , d j ) } i , j = 1 B \left\{cos\left ( q_i,d_j \right ) \right\}_{i,j=1}^B {cos(qi,dj)}i,j=1B,这里只有 i = j i=j i=j时是正样本,其他的为负样本,如下图所示:

在这里插入图片描述

对于最后的 B × B B\times B B×B矩阵,只有对角线上的为正样本,选择一行来看,这是一个多分类的问题,类别数为 B B B。对于该多分类,损失函数为:

l o s s i = − l o g e x p ( s ⋅ c o s ( q i , d i ) ) ∑ j = 1 B e x p ( s ⋅ c o s ( q i , d j ) ) loss_i=-log\frac{exp\left ( s\cdot cos\left ( q_i,d_i \right ) \right )}{\sum _{j=1}^Bexp\left ( s\cdot cos\left ( q_i,d_j \right ) \right )} lossi=logj=1Bexp(scos(qi,dj))exp(scos(qi,di))

其中, s s s为缩放系数,在文章中指出 s s s在15和20之间。

缩放系数 s s s实际上就是温度系数。

在文章中还提出了另一种对称的损失函数,上述的损失函数以query为主导,另外一部分以item为主导,基于此便有了对称的损失函数:

− 1 2 ( l o g e x p ( s ⋅ c o s ( q i , d i ) ) ∑ j e x p ( s ⋅ c o s ( q i , d j ) ) + l o g e x p ( s ⋅ c o s ( q i , d i ) ) ∑ j e x p ( s ⋅ c o s ( q j , d i ) ) ) -\frac{1}{2}\left ( log\frac{exp\left ( s\cdot cos\left ( q_i,d_i \right ) \right )}{\sum _{j}exp\left ( s\cdot cos\left ( q_i,d_j \right ) \right )}+log\frac{exp\left ( s\cdot cos\left ( q_i,d_i \right ) \right )}{\sum _{j}exp\left ( s\cdot cos\left ( q_j,d_i \right ) \right )} \right ) 21(logjexp(scos(qi,dj))exp(scos(qi,di))+logjexp(scos(qj,di))exp(scos(qi,di)))

不过实验表明在实际的线上并没有多大的收益。

除了上述的随机样本,还需要困难样本,在Que2Search中使用的是在线困难负样本挖掘,其方法是选择Batch内除了正样本以外所有负样本中相似度最高的样本作为困难负样本:

n q i = a r g m a x j ≠ i B c o s ( q i , d j ) n^{q_i}=argmax_{j\neq i}^Bcos\left ( q_i,d_j \right ) nqi=argmaxj=iBcos(qi,dj)

这样就构造了正负样本的集合 ( q i , d i , d n q i ) \left ( q_i,d_i,d_{n^{q_i}} \right ) (qi,di,dnqi)

但是在Que2Search中,使用了两个阶段的训练:

  • 第一阶段只使用随机负样本,通过多分类的交叉熵损失函数;
  • 第二阶段只使用困难负样本,损失函数却是margin rank loss效果更好。

margin rank loss为:

l o s s i = m a x ( 0 , − [ c o s ( q i , d i ) − c o s ( q i , d n q i ) ] + m a r g i n ) loss_i=max\left ( 0,-\left [ cos\left ( q_i,d_i \right )-cos\left ( q_i,d_{n^{q_i}} \right ) \right ]+margin \right ) lossi=max(0,[cos(qi,di)cos(qi,dnqi)]+margin)

margin的值在0.1和0.2之间最好。

3. 总结

在Que2Search中,主要是加入了更多的文本特征,并利用基于Transformer的方法提取文本语义信息,同时在特征中融入了图像的特征,实现了多模态的模型学习。另一方面,在训练的过程中提出了多任务的学习,有利于对item塔的模型学习。

参考文献

[1] Liu Y, Rangadurai K, He Y, et al. Que2Search: fast and accurate query and document understanding for search at Facebook[C]//Proceedings of the 27th ACM SIGKDD Conference on Knowledge Discovery & Data Mining. 2021: 3376-3384.

[2] Attention-Based BiLSTM

### 回答1: Elasticsearch 是一个基于 Lucene 的搜索引擎,可以用来存储、搜索和分析大量的数据。以下是一些常用的 Elasticsearch 查询语句: 1. 简单查询:match 和 term - `match` 查询会搜索指定字段中包含指定文本的所有文档。例如: ``` GET /index/_search { "query": { "match": { "title": "elasticsearch" } } } ``` - `term` 查询会搜索指定字段中包含指定词条的所有文档。例如: ``` GET /index/_search { "query": { "term": { "status": "published" } } } ``` 2. 复合查询:bool 和 must/should/must_not - `bool` 查询可以将多个查询条件组合在一起。例如: ``` GET /index/_search { "query": { "bool": { "must": [ { "match": { "title": "elasticsearch" } }, { "match": { "content": "search" } } ] } } } ``` - `must` 查询要求查询结果必须满足指定条件。例如: ``` GET /index/_search { "query": { "bool": { "must": [ { "match": { "title": "elasticsearch" } }, { "term": { "status": "published" } } ] } } } ``` - `should` 查询要求查询结果应该满足指定条件之一。例如: ``` GET /index/_search { "query": { "bool": { "should": [ { "match": { "title": "elasticsearch" } }, { "match": { "content": "search" } } ] } } } ``` - `must_not` 查询要求查询结果不能满足指定条件。例如: ``` GET /index/_search { "query": { "bool": { "must_not": [ { "term": { "status": "draft" } } ] } } } ``` 3. 范围查询:range - `range` 查询可以搜索指定字段中的数值或日期范围。例如: ``` GET /index/_search { "query": { "range": { "price": { "gte": 10, "lte": 100 } } } } ``` 4. 全文查询:match_phrase 和 match_phrase_prefix - `match_phrase` 查询要求查询结果必须包含指定短语。例如: ``` GET /index/_search { "query": { "match_phrase": { "title": "elasticsearch query" } } } ``` - `match_phrase_prefix` 查询要求查询结果必须包含指定前缀的短语。例如: ``` GET /index/_search { "query": { "match_phrase_prefix": { "title": "elasticsearch que" } } } ``` 以上是一些常用的 Elasticsearch 查询语句,还有很多其他类型的查询和参数可以使用。详细的文档可以参考 Elasticsearch 官方文档。 ### 回答2: Elasticsearch是一个高性能的分布式全文搜索和分析引擎,可以用于快速地存储、搜索和分析大量数据。Elasticsearch使用标准的JSON格式来操作数据,查询语句也是用JSON格式表示。 在Elasticsearch中,查询语句通过HTTP请求发送给Elasticsearch服务器。查询语句可以包含多个条件和过滤器,以实现灵活的搜索和过滤。以下是一些常用的查询语句示例: 1. 匹配查询(Match Query):通过指定一个字段和一个值来进行匹配。例如,{"match": {"title": "apple"}}将返回包含"title"字段中包含"apple"的文档。 2. 多字段查询(Multi Match Query):可以在多个字段中搜索相同的值。例如,{"multi_match": {"query": "apple", "fields": ["title", "description"]}}将在"title"和"description"字段中搜索包含"apple"的文档。 3. 范围查询(Range Query):根据某个字段的值的范围进行搜索。例如,{"range": {"price": {"gte": 10, "lte": 100}}}将返回"price"字段值在10到100之间的文档。 4. 过滤查询(Filtered Query):可以将一个查询结果再次过滤。例如,{"filtered": {"query": {"match": {"title": "apple"}}, "filter": {"term": {"category": "fruit"}}}}将返回标题包含"apple"并且类别为"fruit"的文档。 5. 分组查询(Aggregations):可以根据某个字段对结果进行分组和统计。例如,{"aggs": {"group_by_category": {"terms": {"field": "category"}}}}将按照"category"字段对结果进行分组。 以上只是一些查询语句的简单示例,Elasticsearch还提供了更多丰富的查询语法和功能,如模糊查询、排序、分页等。根据具体需求,可以结合这些功能来构建更复杂和高效的查询语句。 ### 回答3: Elasticsearch是一个强大的分布式搜索和分析引擎,可以通过查询语句对其进行检索。以下是关于Elasticsearch查询语句的简要介绍: 1. match查询:match查询是基于文本匹配的简单查询,它会根据查询条件返回匹配的文档。 2. term查询:term查询用于精确匹配一个字段的值,不进行分词处理。 3. range查询:range查询用于匹配一个范围内的字段值,可以设置上限和下限。 4. bool查询:bool查询是一个复合查询,可以组合多个条件查询,并设置逻辑关系(AND、OR、NOT)。 5. wildcard查询:wildcard查询可以使用通配符进行模糊匹配。 6. prefix查询:prefix查询用于匹配以指定前缀开头的文档。 7. match_phrase查询:match_phrase查询可以匹配与查询条件完全匹配的文档,而不是仅仅匹配其中的一个词。 8. fuzzy查询:fuzzy查询用于模糊匹配,可以处理拼写错误。 9. exists查询:exists查询用于检查某个字段是否存在于文档中。 10. match_all查询:match_all查询可以匹配所有文档,常用于获取全部文档。 以上是一些常用的Elasticsearch查询语句,通过它们可以对文档进行灵活和高效的搜索。同时,Elasticsearch还支持更多复杂的查询语句和特性,可以根据实际需求进行定制化查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值