一、转转搜索少无结果模块简介
1.1:什么是少无结果模块
任何APP的搜索场景下,相关性与流量效率都是两大核心目标。是全都想要还是有所侧重,往往也会根据业务不同而取舍不同。转转少无结果与转转主搜就是这样的两个模块,转转少无结果模块是转转主搜模块的兜底,当用户在APP搜索时,主搜商品展示完毕或者主搜商品过少时,会向用户展示“猜你喜欢”商品。即少无结果模块。如图所示:
但兜底并不意味着技术的简化与妥协,不同于主搜对用户搜索相关性的绝对保证,用户对于少无结果模块的相关性容忍度较高。因此少无结果模块更类似于一个有搜索词(QUERY)的推荐场景,少无结果模块所承担的目标为:
1:当用户需求明确然而商品库存不足时,为用户推荐类似商品
2:当主搜无法在保证绝对相关性的前提下准确识别用户冷门搜索词时,为用户展示我们推测的商品集。
1.2 少无结果模块架构
少无结果模块整体架构如下,包括query理解模块、召回模块、排序模块和业务重排序模块。少无结果核心算法逻辑由query理解模块、召回层(红框圈定) 来实现,整体分为基于文本匹配的ElasticSearch搜索引擎召回和基于语义理解的向量召回,二者各司其职,相互搭配解决少无结果两个核心目标。
二、“软硬”结合,少无结果模块技术实现
2.1 基于少无结果QR和ElasticSearch的文本硬匹配召回
前文说到的少无结果模块所承担的两大核心目标,其中之一便是意图明确却库存不足时,我们试着找寻更多的类似或者可能感兴趣的商品。基于少无结果QR(query理解)和ElasticSearch的文本硬匹配召回便是试图去解决此类问题,少无结果QR是我们针对少无结果场景定制的query理解模块,ElasticSearch则是一种开源的可定制化的高效搜索引擎,使用一种被称为倒排索引的数据结构来进行快速的全文搜索。我们希望利用少无结果QR模块来对用户搜索的query进行降级与发散,再通过es搜索引擎进行召回。具体是怎么做的呢,我们可以接着往下看。
在少无结果QR模块,我们会对用户的搜索Query主要进行以下几个步骤处理:
1:去停用词模块,我们通过词典与正则匹配的方式,对用户搜索query中的空格、无意义短语、英文的大小写进行转化。
2:核心的query处理模块,包括标准化query(getNormalizedQuery)、简化query(relaxtionQuery)、扩展query(expansionQuery)。例如:当用户搜索词为“Iphone12 PM 256北京发货”,并且点击了“5000元以上”筛选项,标准化query模块,会将“Iphone12 PM 256北京发货”处理为“Iphone12 ProMax 256G北京发货”记录为Query1;而简化Query模块,会对用户点击的筛选项或者用户输入的地址区域信息进行删除,例如用户筛选的价格区间、成色、颜色,用户填写的地理以及区域位置等。此时query会被替换为“Iphone12 PM 256G”,记为Query2;拓展Query模块则会对query进行发散与拓展,例如iphone12 ProMax库存不足,则使用Iphone12、iphone12mini等,记为Query3,三个模块的最终结果会组合为一个List【Query1、Query2、Query3】,其中权重依次递减,送至ES搜索引擎。
3:分类命中与其他规则在此不赘述
当queryList进入ES后,我们在ES内自己定制了multi_match的多字段匹配、bool复合查询。如下图所示(参考事例,非实际使用)。
在es中,multi_match是针对多字段查询的一套解决方案,能在多个字段上反复执行相同查询。其中包括三种查询:best_fields,most_fields,cross_fields。我们使用的是best_fields,即返回多字段查询中,单字段匹配度最高的那个文档的算分最高。在此时query即是我们转换的【Query1、Query2、Query3】集合,对于匹配域flied,我们根据业务的形态,自己定义商品被匹配字段的权重,突出某个字段的评分。包括商品类目、标题、属性标签等。最终,es将根据我们制定的规则利用BM25算法匹配出最相关的商品集合送入少无结果模块后续的排序层、业务重排序层。至此,文本硬匹配告一段落。
2.2 基于sBert孪生神经网络的语义向量软匹配召回
2.2.1 为何我们需要“软硬结合”的多召回源召回
当我们对少无结果QR和ES进行定制开发后,发现该模块可以很好解决用户需求明确但库存不足导致的少无结果场景,但是二手场景,用户的搜索意图会极其复杂,包括二手场景下很多专业术语表达(俗称黑话)、用户过于随意的口语化表达都是引起少无结果的重要原因,此时多半出于规则的文本硬匹配算法,会显得越来越力不从心,因此针对此问题,我们结合少无结果场景深入分析,决定在召回层面引入了语义向量召回,用向量召回的方式,去理解用户真正的表达。
此时,拦在我们面前的首个问题便是,我们是用向量召回取代文本匹配,还是将二者相结合。很幸运,在2021年的一篇名为How Different are Pre-trained Transformers for Text Ranking?的论文给了我们答案。
文中主要探究BERT此类语义向量模型基于何种特征来用于计算句子相关性,以及模型的排序结果与BM25等传统稀疏排序算法的关系,因此在开篇提出以下几点疑问:
Q1: BERT和BM25到底有和不同? BERT是否对BM25检索到的相同结果进行了更好的排序?BERT能更好地召回被BM25遗漏的结果吗?
Q2: BERT是否能体现term完全匹配?
Q3: BERT能找到“不可能相关”的结果吗?(探究BERT语义泛化能力,探究硬匹配无法找到的结果)
我们这里长话短说,论文通过各种对样本和测试集的设计,对以上三个问题进行了验证,得出的结论如下:
在硬匹配层面(term文本完全匹配),Bert的指标全面低于BM25,说明了Bert此类语义向量模型,其实并没有对精确term匹配有一个充分的利用。但是在泛化能力上,仅保留上下文环境情况下,Bert对文档的匹配远比BM25算法要优秀。作者认为以Bert为代表的语义向量模型,主要提升是召回了被BM25低估的doc(即召回的显著提升),即需要语义的部分。同时也引入了一些误差,即Bert高估了一些原本被BM25排序正确的低相关性doc。一些bert大大低估的【高度相关】的doc,反而BM25的排序更加准确。
最后,在检索任务中,仍没有实验表明NN模型可以完全替代传统基于term的稀疏匹配算法。不管是召回还是排序阶段,这两者依旧是相辅相成的关系。因此对于疑难query的识别,我们需要语义向量模型对文本的泛化能力,同时绝大多数情况下,我们的硬匹配机制也足以应付的很好。如果将二者有效的结合,便可在各司其职的同时,又互相补充,互相成就。为此我们给出少无结果模块的整体流程图:
简单来说,我们利用faiss索引,将海量的商品向量每日更新至索引库,当用户搜索触发少无结果条件,我们一方面进行基于少无结果QR和ElasticSearch进行文本硬匹配召回,一方面通过基于sBert孪生神经网络进行语义向量软匹配召回。二者再通过转转分类命中模块进行商品类目限制过滤,使得俩个召回源商品更为整体。最后通过转转的排序与重排序模块,将商品展现在用户面前。
2.2.2 孪生兄弟网络-sBert
确定了整体的技术方案,我们便对向量召回技术进行了相关调研,回顾了向量召回近些年的发展历程,13年谷歌的DSSM论文提出以双塔模型解决文本相关性任务开始,以此为原型的双塔改良也层出不穷,16年谷歌将双塔模型在yotube千万级的视频召回上成功工业实践,修改与拔高了13年前模型诸多不足,将双塔推向最高潮。再后来孪生神经网络的提出和BERT的横空出世,NLP迎来了改朝换代的时刻。本次转转少无结果模块,便是利用将Bert与孪生神经网络相结合的sBert,又快又准地去解决少无结果所面临的问题。
让孪生网络大方异彩的关键,其实是BERT预训练模型在NLP领域的横空出世,因为BERT本身的大体量是不适合进行语义搜索匹配和无监督聚类这些任务。由于BERT模型规定,在计算语义相似度时,需要将两个句子同时进入模型,进行信息交互,这造成大量的计算开销。例如,有10000个句子,我们想要找出最相似的句子对,需要计算(10000*9999/2)次,需要大约65个小时;所以在实际应用中是不可能上线的。而sBert主要工作便是将二者结合起来。简单通俗地讲,就是借鉴孪生网络模型的框架,将不同的句子输入到两个BERT模型中(但这两个BERT模型是参数共享的,也可以理解为是同一个BERT模型),而最终获得的句子表征向量.这些向量可以用于语义相似度计算,也可以用于无监督的聚类任务。对于同样的10000个句子,我们想要找出最相似的句子对,只需要计算10000次,需要大约5秒就可计算完全。
我们的sBert在输入层面,BERT是字粒度的因此无需分词等额外操作,两个塔分别为用户搜索Query塔与商品塔,Query塔顾名思义即用户搜索Query,商品塔则利用了商品的不同属性,我们挑选了二手商品核心的属性,包括成色、颜色、型号等等去表达一个商品。输出层面分别实验了CLS-token和2种池化策略(Avg-Pooling、Mean-Pooling),对Bert输出的字向量进一步特征提取、压缩,得到u、v,关于u、v整合,我们是直接计算、输出余弦相似度;训练损失函数采用均方根误差,如果输入的是三元组,论文中也给出了相应的损失函数。模型的大致结构如下图所示。我们的核心是获取用户搜索的Query向量表达以及商品的向量表达,将商品向量离线灌入faiss索引后,在线上实际应用的时候,只需依赖faiss的快速检索特性,为用户搜索query匹配最为接近的商品。整体离线效果以人工核实召回相关性为主,指标上在不同规则组成的样本集上测试,AUC均可在0.8以上。(其中,全局随机的简单召回样本测试集AUC可达0.92)
2.2.3 “负样本为王”-召回层的负样本选择
最后的最后,想在这里探讨下负样本选择问题。通过前文的全部叙述,我们可以看出,其实实现少无结果模块的关键技术,都集中在召回层。在召回和排序模型工作中,我们常说一句话,“如果说排序是特征的艺术,那么召回就是样本的艺术,特别是负样本的艺术”,样本选择错了,那么之前的所谓模型设计、特征工程,只能是南辕北辙,做得越卖力,错得越离谱。为什么这么说呢,这里便引出了一个经典的问题-Sample Selection Bias问题
如图所示,不同阶段模型面对的输入数据情况不同,对于召回模型来说,它面临的输入数据,是所有物料库里的物品;对于粗排模型来说,它面对的输入数据,是各路召回的结果;对于精排模型来说,它面临的输入是粗排模型的输出结果。如果我们仍然用“曝光未点击”实例做为召回和粗排的负例训练数据,你会发现这个训练集合,只是全局物料库的一小部分,它的分布和全局物料库以及各路召回结果数据完全不一样,所以根据这种负例训练召回和粗排模型是不符合线上实际情况的,在谷歌2020年Facebook最新的论文《Embedding-based Retrieval in Facebook Search》(EBR)中也明确验证“不能(只)拿“曝光未点击”做负样本”,并提出了easy negative/hard negative的样本分级思路。本次少无结果的样本选择,也遵循了这个概念,做出了easy与hard的区分。
对于负样本easy部分,我们采用的是常用的全局随机的方法,通过query和商品属性随机组合构造成负样本,让模型见识“最不靠谱”的组合达到”开眼界、见世面”的目的,从而在“大是大非”上不犯错误。
但很显然,单纯的依靠随机采样是不够的,我们希望模型能有区分不同相似商品的能力,因为在实际召回过程中,模型也需要对极其相似的不同种类商品进行判别,通过全局随机负样本学习,模型基本已经具有了区分iphone12与iphone11的能力,但往往用户输入的长搜索词,包含了颜色、成色等复杂词汇,为此我们设计了一套hardNegative的采样方法。此方法由动态步长随机取样机制与Query-Class映射机制共同构成。
动态步长随机取样机制简单来说,就是我们对负样本库按照各个类别切分成类目分库,并对每个分库进行独立的编号,同时对每个用户的每个session进行独立的编号,并设置步长,通过公式为每个用户的每次搜索行为挑选等于步长的负样本,并且由于用户搜索行为和负样本分库的独立编号,能确保每次挑选的负样本随机且不重复。
而我们为每次搜索行为按照什么规则挑选尽可能相似的hard负样本呢,我们通过线上近期累计的搜索数据,为每条query计算出了一个带权重的映射关系,例如airpods这个query,7天内不管是曝光或者未曝光,我们统计出该query下,airpod1、2、pro三类商品的召回比例为1:2:3;我们将此构成映射,再通过动态步长随机采样机制,为airpods这个query挑选步长*比例的hard负样本。
关于召回与粗排负样本的选择,搜索团队已申请了三项技术专利,这里不再详细赘述。通过在召回层、粗排的多次线上实验与一次次调整,验证了方案的有效性。在此验证了之前的观点:如果说排序是特征的艺术,那么召回就是样本的艺术,特别是负样本的艺术。负样本的选择对于召回算法的成败是决定性的。
三、总结
在整个转转少无结果方案设计与实现的过程中,调研了很多优秀的召回案例,去理解他们的目标设计思路并借鉴至我们自己的业务场景中,我们始终以自己业务场景的待解决问题与目标出发,设计了一套相对完整的解决方案,在“软硬结合”的思路下,少无结果模块利用硬匹配对于少库存的较为标准的query能较为准确的发散,例如下图左,用户输入了黄金并输入了不胜合理的价格区间。也能利用软匹配识别不标准的用户表达探究用户意图,如下图右。
最终结果,顺利上线全量,并拿到预期的收益:整体少无结果场景用户搜索词覆盖率提升10%,商品的曝光有近三成的增长,订单在曝光增长的加持下,也完成了全天的翻倍。在此也感谢整个团队同学的共同讨论
四、参考文献
[1] Rau D , Kamps J . How Different are Pre-trained Transformers for Text Ranking?[J]. 2022.
[2] Huang P S , He X , Gao J , et al. Learning deep structured semantic models for web search using clickthrough data[C] ACM, 2013.
[3] Yi X , Yang J , Hong L , et al. Sampling-bias-corrected neural modeling for large corpus item recommendations[C]// the 13th ACM Conference. ACM, 2019.
[4] Huang J T , Sharma A , Sun S , et al. Embedding-based Retrieval in Facebook Search[C]// 2020.
[5] 石塔西:深度学习中不得不学习的Graph Embedding方法 zhuanlan.zhihu.com/p/165064102
转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。
关注公众号「转转技术」(综合性)、「大转转FE」(专注于FE)、「转转QA」(专注于QA),更多干货实践,欢迎交流分享~