升级换代!Facebook全新电商搜索系统Que2Search

2021-11-04 10:52:53 浏览数 (1)

大家好,我是kaiyuan。关于前沿技术在工业界的实践落地应用,我们之前分享过一些文章:

  • 大规模搜索 预训练,百度是如何落地的?
  • KDD'21 | 淘宝搜索中语义向量检索技术
  • 全方位解读 | Facebook的搜索是怎么做的?
  • 深度学习在Airbnb搜索的应用实践
  • 小红书在推荐多样化的实践——SSD
  • KDD'21 | 揭秘Facebook升级版语义搜索技术

今天继续,看看Facebook在KDD'21的工作,从模型到部署介绍了Facebook Marketplace这一电商平台的语义检索系统。

  • Que2Search: Fast and Accurate Query and Document Understanding for Search at Facebook

Que2Search可以认为是Facebook在KDD'20工作Embedding-based Retrieval in Facebook Search的升级版本【Facebook的搜索是怎么做的?】。但是针对『Facebook maketplace』这一特定场景的向量化检索系统,仍然存在以下几点挑战:

  • 商品描述存在噪声:由于商品的属性描述(譬如标题、类别等)是由卖家上传的,会存在较多的拼写错误、属性丢失等;
  • 国际化支持:Facebook Marketplace场景是多国家多语言的,需要模型具备跨语言检索能力;
  • 多模态处理:需要在模型中同时考虑多种模态信息,图片、文本等;
  • 严格的延迟性限制:众所周知线上搜索系统对延迟要求极高,会极大地影响用户体验。尤其是当使用Transformer-based模型时,延迟是一个巨大挑战;

本文接下去会深入细节,一起看看是如何一一解决这些问题的。

1. 模型结构

Que2Search模型结构

整体模型架构如上,还是使用普遍的双塔形式。

1.1 Query Tower

query侧的特征输入有三部分:

  • Query文本的tri-gram表示:通过size=3的滑动窗口,得到tri-gram,过hash函数后得到对应的ID,再经过嵌入后得到每个ID的向量表示,然后对所有向量做sum-pooling;
  • 用户所在国家:ID类特征,也是经过嵌入后表示成向量;
  • Query原始文本:过两层的XLM 编码,取[CLS]对应的向量作为query表示;
1.2 Document Tower

类似的,doc侧的特征输入有五部分:

  • 商品标题:文本类型,使用6层XLM-R编码;
  • 商品描述:文本类型,使用6层XLM-R编码(模型和商品标题的共享);
  • 商品标题的3-gram表示:同query侧处理;
  • 商品描述的3-gram表示:同query侧处理;
  • 图像表示:对于每一个商品,都会附带一些图片,通过预训练模型得到图像表示,然后过MLP和Deep set方法对多个图像表示进行融合得到最终这一路特征表示;
1.3 Late Fusion

late-fusion指的是对上述双塔内的多路输入特征如何进行融合,常见的融合方式有

  • concatenation fusion :将所有路表示拼接起来过MLP得到固定维度的向量表示;
  • simple attention fusion :注意力机制不用多说了

作者通过实验发现简单的注意力形式效果更好,

begin{array}{lr} varphi=left{varphi_{i}right}_{i=1}^{N} quad text { representations of } mathrm{N} text { channels } \ Phi=varphi_{1}|ldots| varphi_{N} & text { concatenation } \ a=operatorname{Softmax}(Phi W) & W in mathbb{R}^{N D times N} \ f=sum_{i=1}^{N} a_{i} dot{varphi}_{i} quad text { final tower representation } end{array}

2. 训练阶段

模型整体如上,引入了更多的特征 更精细的融合方式,再来看看训练过程是如何操作的。

2.1 训练数据
  • 正样本来自用户搜索日志,是一对相关的 <query, document> 对;那在论文业务场景中,如何表示相关呢?作者利用下述条件在日志中进行筛选: 如果上述四个事件在一定时间内(24小时)发生,则认为是相关的,称为『in-conversation』。PS. 在描述这一部分的时候可以明显感受到作者的"求生欲",感受下: We do not have access to message contents and only know that users interacted with the sellers.
    • 用户搜索了一个query
    • 用户点击了query下的某个商品
    • 用户给该商品的卖家发消息
    • 该商品卖家回复消息
  • 负样本来自batch内负采样,也是属于应用很广泛的负样本策略,譬如可以参考我们之前分享的:大规模搜索 预训练,百度是如何落地的?。不过这里对负样本的利用,还是有一点点不同,后面会具体介绍。

batch内负采样

2.2 多阶段训练

模型训练分为两个阶段,

  • 第一阶段:batch内简单负样本训练,即其他record的doc作为当前query的负样本,然后做一个 multi-class cross-entropy。损失函数为:
operatorname{loss}_{i}=-log frac{exp left(s cdot cos left{q_{i}, d_{i}right}right)}{sum_{j=1}^{B} exp left(s cdot cos left{q_{i}, d_{j}right}right)}

其中

s

为温度系数,目的是拉大logits的区分度,使其更sharpen,需要做实验调参确定值。

  • 第二阶段:batch内困难负样本训练,文中称为『课程学习』。使用困难负样本也是比较常见的套路,一般是离线通过各种策略采样得到。不过这里作者还是使用了batch内的数据,具体地,对于每个query
q_i

,选取除对角线外的相似度分数最高的doc作为负样本

d_{n} q_{i}

,因为对角线的doc为该query对应的正样本

d_i

。于是这样就有了三元组

left(q_{i}, d_{i}, d_{n} q_{i}right)

,尝试了二分类交叉熵损失和最大间隔损失函数两种方法,发现margin设置为0.1~0.2的margin rank loss表现最好

operatorname{loss}_{i}=max left(0,-left[cos left(q_{i}, d_{i}right)-cos left(q_{i}, d_{n} q_{i}right)right] text { margin }right)
2.3 多任务学习

除了上述双塔任务之外,作者还在document tower额外引入了一个任务,document classification。具体地,针对每个doc,选取一系列相关的query。总共保留头部45000的query,然后用doc塔产出的向量做多标签分类

document classification

2.4 多模态融合

一般而言,模态指的是不同类型的数据,譬如文本、图像、视频、语音等等,而常见的融合方式就是Attention。在本文中,模态的概念更加宽泛,作者把不同路的输入认为是不同的模态,同时将 Grandient Blending 梯度融合的形式引入双塔结构。

梯度融合来源于 CVPR 2020 论文What Makes Training Multi- Modal Networks Hard ,具体做法如下:

训练M 1个模型,M是模态的数量,其中M个模型分别用单个模态特征作为输入来训练,1个模型用所有模态特征作为输入来训练。先分别计算每个模型的损失,然后加权融合所有模型的损失,每个损失都有提前设定好的权重系数。目的是让模型即使在模态缺失的时候也具备学习能力,更加鲁棒。

针对Que2Search场景下,步骤为:

  1. 单模态特征训练。因为是双塔,需要"控制变量",及一侧的塔每次只使用一路特征,另一侧塔使用全部特征
begin{aligned} mathcal{L}_{i}^{1} &=Lleft(cos left(varphi_{i}^{1}, varphi_{1}^{2} oplus ldots oplus varphi_{n}^{2}right)right) i in[1, m] \ mathcal{L}_{j}^{2} &=Lleft(cos left(cos left(varphi_{1}^{1} oplus ldots oplus varphi_{m}^{1}, varphi_{j}^{2}right)right)right. j in[1, n] end{aligned}
  1. 全模态特征训练。
mathcal{L}_{text {multi }}=Lleft(cos left(varphi_{1}^{1} oplus ldots oplus varphi_{m}^{1}, varphi_{1}^{2} oplus ldots oplus varphi_{n}^{2}right)right)
  1. 损失加权融合。

注意,梯度融合只在训练阶段使用,预测时使用全部的模态。

3. 实验&效果

3.1 消融实验

主要是看一下,论文新提出的结构或者特征,是否有作用以及提升有多少。

对比Base选取的是KDD'20提出的wide&deep模型,关于base模型具体可以参考全方位解读 | Facebook的搜索是怎么做的?。分别在『in-conversation』数据集和人工标注数据集上进行实验,可以看到,引入额外的特征(原始文本和图像),对效果有较大的提升。一些模型的设计,譬如课程学习、多任务、模块参数共享等,也都带来或多或少的效果增益。

in-conversation数据集消融实验

人工标注数据集消融实验

3.2 AB实验

线上AB实验,评价指标是前面提到的『in-conversation』,可以认为是用户的参与度,不用最终的转化率指标有点奇怪。这里还有一点奇怪的是,只使用char tri-gram的模型居然比本文提出的Que2Search效果还好,作者只是一笔带过,没解释原因。

线上AB实验

4. 系统架构

需要注意,这里只是Que2Search的部署架构,完整的产品搜索系统会更复杂。Facebook的论文都会很友好的提供一堆实战经验,这里挑几点介绍,具体的可以阅读原论文第6部分。

  • 用户翻页优化:主要是性能和准召之间的平衡,通过「动态ANN参数」实现。具体地,在用户的第一个request,调整ANN参数更关注延迟,之后的翻页request则调整参数使其更关注准召效果。这样做的好处是,可以避免初次触发时由于模型的延迟过高影响用户体验,文中更是说『没有这项优化,Que2Search根本无法上线』。
  • 召回排序联动:Facebook Marketplace平台搜索排序是个两阶段过程,GBDT 类DLRM 模型。将Que2Search的余弦相似度打分作为一个特征引入到上述两阶段排序模型中,发现对最终的效果有较大提升。
  • 仅使用召回率远远不够。在搜索召回阶段,理论上通过降低ANN检索的阈值,可以提高召回率(至少不会减少应该正确召回的商品),但是线上指标却降低了。分析后发现是由于『召回排序不一致性』导致的,放开阈值召回增加的噪音样本无法在排序阶段非常好地识别。因此需要更精确的指标来表征召回的结果,或者暴力AB实验拍阈值。
  • 仅保证相关性远远不足

5. 总结

惯例性小结,

  • 语义理解模型:引入了多语言XLM预训练模型、多模态的图像信息、基于Attention和基于梯度的特征融合方式、两阶段式的训练方式,相比于之前KDD'20的工作是花里胡哨了些,但都是一些情理之中,不难想到;
  • 工业场景落地:将Transformer-based模型在大规模系统上落地,同时分享了很多踩坑经验;
  • 线上AB实验,Que2Search一顿操作效果不如只使用tri-gram的模型,就有些奇怪。是query长度普遍较短,tri-gram就够了,更多的只会引入噪声?
  • 将召回模型打分作为一个特征丢给排序,也有比较明显的效果,可以尝试;
  • Facebook Marketplace 作为电商场景的搜索,只考虑商品和query的匹配程度可能不够,系统内还有user用户的作用。当然,有可能这不是Que2Search模型考虑的部分,毕竟有多路召回。

0 人点赞