欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[电子商务搜索] 现代工业级电子商务搜索技术 - Facebook 语义搜索技术 QueSearch

最编程 2024-10-02 07:37:27
...

【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术Que2Search


目录

文章目录

  • 【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术Que2Search
    • 目录
    • 0. 论文信息
    • 1. 研究背景:
    • 2. 技术背景和发展历史:
    • 3. 算法建模
      • 3.1 模型架构
        • 3.1.1 双塔与分类
      • 3.2 训练
      • 3.3 课程训练
      • 3.4 评估
      • 3.5 加快模型推理
      • 3.6 不同模态的融合
      • 3.7 模型可解释性
    • 4. 系统架构
    • 5. 消融研究
    • 6. 部署经验
      • 6.1 基于嵌入的检索
      • 6.2 检索没有万能钥匙
      • 6.3 精度、召回率、CPU使用量和延迟
      • 6.4 优化连续分页
      • 6.5 搜索排序
      • 6.6 失败的教训
    • 7. 结论
      • 文章主要参考文献:
    • 后记


0. 论文信息

在这里插入图片描述

本文要介绍的这篇论文是Facebook发表在KDD 2021的ADS Track的论文。通常情况下,论文所描述的问题和解决方案,与公司实际业务中遇到的现实问题有密切关联。这篇论文介绍了“Que2Search”,这是Facebook部署的一个查询和产品理解系统(如下图1),用于搜索功能。该系统通过多任务和多模态学习方法来训练查询和产品表示,实现了超过 5% 的绝对离线相关性改进和超过 4% 的在线参与度提升。

ACM KDD(Knowledge Discovery and Data Mining)会议是数据科学、数据挖掘和人工智能领域内的重要国际会议。KDD ADS(Applied Data Science, ADS) Track专注于数据科学的实际应用,征集描述数据挖掘、数据分析、数据科学和应用机器学习在现实世界中的实际应用解决方案和系统的论文。它强调解决或推进对现实世界中部署数据科学技术相关问题的理解。

在这里插入图片描述

1. 研究背景:

随着电子商务的兴起,用户对搜索结果的准确性和相关性的要求越来越高。Facebook Marketplace作为一个全球性的在线购物平台,需要提供高质量的搜索体验,以帮助用户快速找到他们想要的产品。

传统上,搜索引擎基于各种术语匹配方法,但这些方法在处理自然语言和多模态数据时存在局限性。

Note: 传统的信息检索系统,通常是基于关键词检索匹配(也称为Term-based matching),优势在于NLP相关技术相对成熟,底层引擎做倒排索引匹配计算飞快,可以实现在亿级别商品数据集下秒级別响应返回。

最近,Huang等人将基于嵌入的检索(Embedding-based Retrieval)引入Facebook搜索:作者们使用基于字符n-gram的稀疏特征来表示文本特征,并依赖宽和深神经网络来构建查询和文档的嵌入表示。这种方法缺乏自然语言的表示,并且由于高计算需求,没有采用基于BERT的模型。在我们之前的工作中,我们构建了最先进的图像识别系统用于产品图像理解。除了产品图像之外,其他文本和分类产品特征,如标题、产品描述、位置和产品类别,也提供了有价值的信息。

Note: 从这里描述来看,Facebook的检索,本身是已经有一套Emebddng的向量化检索,不过没有太强高层次语义信息,只是包含n-gram的稀疏特征,那么可能存在检索的语义相关性不足。
Note: 同时,论文作者们有图像视觉特征embedding的方法用于图像识别的研究经验。不过,没有将文本等多模态信息进行融合。

本文介绍了Que2Search,这是一个查询Query到产品(电商术语: Product, Item 均为商品/产品)相似性模型,它提供了一种建模方法,考虑了全面的多模态特征,并利用XLM编码器对文本特征进行编码。Que2Search在弱监督数据集上进行训练,并与Facebook之前的基线相比,实现了最先进的产品表示性能。Que2Search已被部署到Facebook Marketplace搜索中;它支持基于嵌入的查询到产品检索,并用作排名特征。Que2Search在Facebook Marketplace规模上运行,支持多语言并满足严格的延迟约束。

在构建Que2Search时,作者认为面临了多个挑战:

  • 产品描述的噪声:卖方提供的产品描述质量参差不齐。在许多情况下,市场产品的属性缺失或拼写错误。
  • 国际化支持:希望构建一个能够在Facebook Marketplace启用的许多语言中表现良好的模型。
  • 有效处理多模态性:需要将所有多模态特征(如产品图像和文本信息)有效地整合到一个模型中。
  • 严格的延迟约束:需要满足搜索引擎的严格延迟约束,这在使用计算成本较高的基于Transformer的语言模型时尤为具有挑战性。

Note: 在电商场景,尤其是跨境电商场景,产品描述通常是多语言的,标题质量因发布商家质量参差不齐。
Note: 采用XLM方案时,如果不做模型简化和底层推理加速,普遍面临推理延迟问题。

最新的语言理解技术来自基于BERT的Transformer语言模型。在业界,扩展基于BERT的模型并提高推理延迟是一个众所周知的挑战。推理时间对于搜索问题至关重要,我们需要实时地为*形式的文本查询提供嵌入表示。我们使用2层XLM编码器来转换查询文本,并在产品方面,我们采用多语言方法,使用XLM-R编码器来编码产品的文本字段。我们分享了我们在搜索场景中扩展XLM/XLM-R模型的经验,以在CPU上在1.5毫秒内运行。Que2Search通过引入几种建模技术,在生产应用中展示了收益,包括多阶段课程学习、多模态处理和多任务学习,这些技术共同优化了查询到产品检索任务和产品分类任务。

2. 技术背景和发展历史:

与这篇论文密切相关的研究工作,主要集中在两部分: 基于嵌入的检索和多模态建模。

  • Embedding-based Retrieval:传统的基于孪生(Siamese)网络的方法,用于建模成对(pairwise)关系,并且可以有效应用生产应用中的检索。 这种方法提供了一种独立于查询对象嵌入并将其存储在搜索索引中的方法。

Note: Siamese network,孪生网络, 左右网络结构一样,仅是输入不同。
Note: 这里说的孪生网络提供了一种独立于查询对象嵌入并将其存储在搜索索引中的方法,应该是通过训练该网络,可以得到商品得embedding表征,该表征可以直接用于构建向量化召回索引。

最近,一些工业界的工作调查了使用孪生网络和宽与深架构的组合在各种应用中进行语义检索的方法。例如,Yang等人训练了两个塔的神经网络来驱动商业移动应用商店的检索,并引入了混合负样本采样,除了批次内随机负样本外,还从搜索索引中采取随机负样本。Huang等人为Facebook搜索引入了宽与深网络的方法,他们使用了基于字符n-gram的一组稀疏特征来建模文本特征,并且主要处理单模态数据。最近有几项工作使用先进的基于BERT的模型进行搜索应用,例如Guo等人提出了在排名框架内使用深度网络,并使用几种优化来减少计算问题,例如为文档使用较小的模型,以及在服务之前预先计算文档方面的嵌入。

Note: 对于embedding-based retrieval, 相关的研究主要集中在: 负样本采样, 网络结构优化,输入模态信息扩充。

为此, 本文分享了我们利用基于Transformer的语言模型进行文本特征处理的经验,并描述了实用的多模态训练技术,将文本、视觉和分类模态融合在一起。 从本质上来说,本文所提方法实际也是一种Embedding-based Retreival方法。

  • 多模态学习:近年来,作者们[4, 15, 18]一直在研究文本和视觉领域的多模态表示解决方案,并在研究数据集上取得了最先进的结果。许多论文使用早期融合在两塔中,这排除了独立部署查询塔模型和文档塔模型的可能性。本文重点介绍双塔Siamese网络与后期融合,其中两塔可以独立计算。

Note: 这篇文章重点 介绍双塔Siamese网络与后期融合,并且特别提出两塔可以独立计算。独立计算的好处,隐含意思是可以并行加速。

  • 自然语言处理: 随着BERT[10]的突破,自然语言理解的质量达到了一个新的水平。由于transformers的高计算需求,各种公司探索了BERT优化,包括[11, 21, 22]。我们应用了[11]中的一些类似方法,并讨论了我们为提高生产推理延迟而采取的其他方法。最近,XLM-R(Conneau等人[7])将BERT方法适应于多语言应用。我们使用XLM-R转换文本特征,并使用搜索日志数据进行微调,我们在第3节中分享了我们的解决方案。

Note: 对于BERT,这篇论文作者使用XLM-R转换文本特征,并用搜索日志进行微调。通常预训练的BERT都需要结合实际业务数据进行微调,以提升模型效果。

3. 算法建模

在这里插入图片描述

在本节中,我们首先描述模型架构,然后介绍输入特征。接着,我们描述了如何训练和评估模型,包括一个课程训练计划,通过使用不同的损失函数而不改变训练数据收集过程,将更难的负例输入模型。我们还讨论了在多模态训练中遇到的挑战以及我们如何克服它们的解决方案。最后,我们描述了如何使用机器学习可解释性技术来理解模型并识别改进领域。

3.1 模型架构

模型架构如图2所示。

Note: 由于是召回模型,整体结构还是双塔模型,只是在Query Tower和 Document Tower两部分有专门的优化改进。
Note: 有创新的是: 如何对不同模态信息的融合,以及对于Document Tower输出的新增loss约束

对于查询塔,我们使用三个输入特征: 字符三元组[14] Char-3-gram, 多分类特征;搜索者的国家Country,一个单一分类特征;以及原始查询文本Query Text,这是一个文本特征。对于字符三元组,我们对查询的3个字符滑动窗口应用哈希函数(例如MurmurHash),从而得到查询的哈希ID列表。然后我们将哈希ID列表传递给一个EmbeddingBag [24],该函数学习每个哈希ID的嵌入,并执行求和池化以提供每个查询的固定大小表示。我们同样对搜索者国家的单一分类特征应用EmbeddingBag [24]以学习国家表示。我们对原始查询文本应用2层XLM [17]编码器。我们采用最后一层的[CLS]标记的表示作为编码器表示,并将其投影到期望的维度以获得查询的XLM表示。然后我们根据注意力权重融合这三个表示以获得查询的最终表示(Query Embedding)。

Note: 对于三个不同类型的特征,经过处理后得到三个Embedding向量,然后用Attention (Q, K,V)做融合。这里分别是哪个做Q, K, V呢?

对于文档塔,我们的输入特征包括产品标题、描述和图像。我们使用一个共享的6层XLM-R [7]编码器来处理所有文本字段(如标题和描述);编码器的共享有助于提高批量召回@1(见表3)。我们同样对标题和描述的字符三元组多分类特征应用EmbeddingBag [24],如前一段所述。对于每个文档,附加了可变数量的图像。我们取每个附加图像的预训练图像表示(Bell等人[2]),应用一个共享的MLP层和深度集(Zaheer等人[29])融合以获得图像通道表示。与查询塔一样,我们然后使用学习到的注意力权重融合来自不同特征通道的表示以获得文档的最终表示。我们尝试了不同的后期融合技术来融合不同特征通道的表示,例如连接融合(即,连接所有编码器输出,然后跟一个MLP层)和简单的注意力融合(基于学习到的通道权重的通道表示的加权和,如公式1所示,其中∥表示连接)。简单的注意力融合与连接融合相比,显示出更好的指标性能。
在这里插入图片描述

Note: 这里有一个细节需要注意,对于Query塔使用的是2层的XLM, 对于Document塔则是使用6层。实际,由于Query通常是需要每次请求到来时,都需要计算一次,因此模型不能太复杂,因此用相对简化的。此外,还有一个原因,在实际应用中,query的长度相对较短,使用相对浅层的XLM对效果损失也不大。

我们使用PyTorch和几个下游库,如Facebook的PyText、Fairseq和多模态框架(MMF)来实现模型。我们使用7e-4的学习率,批量大小为768,并使用Adam优化器。然而,由于我们使用预训练的XLM/XLM-R模型,我们对XLM模块实现了不同的学习率2e-4 - 这意味着XLM模块内的所有参数将与其余参数有不同的学习率。这使我们在验证集上的ROC AUC增加了1%(表4中提到的变化XLM LR)。我们使用了标准的正则化技术,如dropout(dropout率为0.1)和1.0的梯度裁剪。我们使用验证集上的ROC AUC指标进行早期停止,训练3个epochs周期。

Note: 这里提到对于预训练的XLM/XLM-R在后面微调的时候使用的学习率与其他模块的学习率不一样。并且这个学习率要比其他模块的学习率要小。一种考虑估计是避免XLM/XLM-R在微调时,由于其他模块都没有初始化好,出现较大的调整,偏离原始模型参数。如果是这样,那么很自然地引出一个问题: 是否可以先冻结这部分模块,单独训练其他模块,最后再一起微调?

3.1.1 双塔与分类

我们还将双塔模型结构扩展到文档塔中,增加了一个额外的分类任务,如图2右上角所示。对于每个文档,我们从去标识化和聚合的Marketplace搜索日志数据中收集了一组估计与该文档相关的文本查询。我们保留最常见的45k个查询。我们将此问题视为多标签多类分类任务,并使用多标签交叉熵,其中每个正目标设置为1/k,如果文档有k个正标签[19]。我们在第5节中比较了这种多任务架构与普通双塔模型的结果。

Note: 这里对于document塔的输出,直接引入一个MLP做分类,一方面原因是约束学习得到的document embedding具有一定的鉴别能力。
Note: 这里也引出两个新问题: 1) ,如何对文档打标,人力资源消耗情况?2) 如何融合新增的这个分类loss与主目标loss?

3.2 训练

训练数据: 在传统的监督学习中,我们需要训练数据来包含正面和负面的例子。然而,在我们的训练设置中,我们只采用正面的训练(查询,文档)对,并自动从批次中的其他文档中获得负面例子。通过搜索日志可以收集正面的(查询,文档)对。具体来说,我们使用类似于[2, 25]中的数据收集模式:我们通过以下事件序列创建文档-查询对的数据集:(1) 用户搜索查询,(2) 点击产品,(3) 向市场卖家发送消息,以及 (4) 卖家回复。如果所有4个事件在短时间内(例如24小时)发生,则用户很可能找到了他们想要的东西,因此将该查询视为与文档相关。我们无法访问消息内容,只知道用户与卖家进行了互动。我们称这些用户互动的序列为in-conversation [25]。

批次负样本:我们使用了几种方法来生成负样本。为了解释批次负样本的工作原理,我们将解释在单个批次训练期间发生了什么,批量大小为B。在每个批次中,我们获得查询嵌入张量 { q i } i = 1 B \{q_i \}_{i=1}^{B} {qi}i=1B,嵌入维度为 D D D,同样我们也获得文档嵌入张量 { d j } j = 1 B \{d_j \}^B_{j=1} {dj}j=1B,大小相同。然后我们计算余弦相似度矩阵 { c o s ( q i , d j ) } i , j = 1 B \{cos(q_i,d_j) \}_{i,j=1}^B {cos(qi,dj)}i,j=1B。余弦相似度矩阵表示批次内每一对可能的查询文档相似度,矩阵的行属于查询,列属于文档。我们将这视为多类分类问题,类别数为B,文档 d i d_i di是查询 q i q_i qi的真类别(如图4所示的绿色网格),而其他文档 d j , j ≠ i d_j,j ≠ i djj=i是q_i的负例。我们使用缩放的多类交叉熵损失(公式2)来优化我们的网络。在训练期间,我们发现有一个比例尺的损失对于收敛很重要。在我们的用例中,我们选择了15到20之间的比例尺。

L i = − log ⁡ exp ⁡ ( s ⋅ cos ⁡ ( q i , d i ) ) ∑ j = 1 B exp ⁡ ( s ⋅ cos ⁡ ( q i , d j ) )  其中s表示比例尺 ( 2 ) L_i = -\log \frac{\exp(s \cdot \cos(q_i,d_i))}{\sum^B_{j=1} \exp(s \cdot \cos(q_i,d_j))} \text{ 其中s表示比例尺} \quad (2) Li=logj=1Bexp(scos(qi,dj))exp(scos(qi,di)) 其中s表示比例尺(2)

我们还尝试了对称缩放交叉熵损失(公式3)。这个损失函数优化了查询到文档的检索,也优化了文档到查询的检索。虽然这个损失在我们本文讨论的查询到文档双塔模型中既没有提高也没有降低整体系统指标,但在我们训练文档到文档双塔模型的不同用例中,这种对称损失在评估数据集上显示出2%的ROC AUC改进。

L i = − 1 2 ( log ⁡ exp ⁡ ( s ⋅ cos ⁡ ( q i , d i ) ) ∑ j = 1 B exp ⁡ ( s ⋅ cos ⁡ ( q i , d j ) ) + log ⁡ exp ⁡ ( s ⋅ cos ⁡ ( q i , d i ) ) ∑ j = 1 B exp ⁡ ( s ⋅ cos ⁡ ( q j , d i ) ) ) ( 3 ) L_i = -\frac{1}{2} \left( \log \frac{\exp(s \cdot \cos(q_i,d_i))}{\sum^B_{j=1} \exp(s \cdot \cos(q_i,d_j))} + \log \frac{\exp(s \cdot \cos(q_i,d_i))}{\sum^B_{j=1} \exp(s \cdot \cos(q_j,d_i))} \right) \quad (3) Li=21(logj=1Bexp(scos(qi,dj))exp(scos(qi,di))+logj=1Bexp(scos(qj,di))exp(scos(qi,di)))(3)

3.3 课程训练

除了在第3.2节中描述的批内负例采样外,我们还设计了一个课程训练计划,其中双塔模型在第二阶段训练中被输入更难的负例,并在验证集上实现了超过1%的ROC AUC绝对增益(见表4)。

在训练的第一阶段,我们使用批内负例训练模型,并在验证集上的ROC AUC指标上通过早期停止让模型收敛。我们希望在第二阶段训练中给模型输入“更难的”负例。虽然传统上这意味着要运行一个单独的数据管道来找到难的负例,并将这个数据集输入模型,我们建议使用批次内的负例:我们像通常一样得到形状为(B * B)的余弦相似度矩阵。对于每一行,我们现在提取除了对角线分数之外的最高分数作为硬负样本;我们将其列索引表示为 n q i = arg max ⁡ B j ≠ i c o s ( q i , d j ) n^{qi} = \argmax_B^{j≠i}cos(q_i,_dj) nqi=Bargmaxj=icos(qi,dj)。这将有助于以格式(qi,di,dnqi)生成训练样本。我们探索了缩放的二元交叉熵损失(公式4)和边际排名损失(公式5),并观察到边际在0.1到0.2之间的边际排名损失效果最好。批内硬负例采样还减少了在寻找硬负例时额外的CPU使用以及维护另一个离线数据流水线的成本。最初,使用更难负例的课程训练效果不佳。通过实验,我们发现确保第一阶段训练收敛后再开始第二阶段训练至关重要
。此外,我们观察到在边际排名损失3中,reduction=sum比reduction=mean效果更好。

L i = − log ⁡ ( σ ( s ⋅ cos ⁡ ( q i , d i ) ) ) + log