闲鱼搜索召回升级:向量召回&个性化召回
2022-11-28|09:05|发布在分类 / 开店入驻| 阅读:161
2022-11-28|09:05|发布在分类 / 开店入驻| 阅读:161
在搜索系统中,召回环节位于排序漏斗的最底层,决定了下游排序的空间大小,其重要程度毋庸置疑,在闲鱼搜索场景亦是如此。然而由于机器和人力资源的限制,长期以来闲鱼搜索的召回都是使用最简单的基于文本的召回方式,其优化迭代方式也只是在基础商品字段(标题、描述)之上,增加扩展字段。基于此,季度优化前,闲鱼主搜的召回整体方案如下:

虽然通过如上扩充索引字段的方式,有效提升了搜索的召回能力。但数据分析发现,召回不足的情况仍有较大的搜索PV占比,说明召回侧还有比较大的空间可挖(具体数据这里不做详细罗列)。而优化召回不足大体可以从两个方向发力:1)算法策略层面进行优化,提升召回能力;2)供给层面优化,引导增加商品供给,或使卖家优化商品供给描述。这里则讨论前者,首先是当前系统主要有以下不足之处:
对于1,本季度我们增加基于语义的向量召回,缓解召回语义能力不足的问题;对于2则有很多思路,如考虑成交效率的向量召回、u2i、u2i2i等,这里做了一些尝试,发现有时常规的方案无法直接照搬到闲鱼场景,而最终本次优化我们优先采用了基于行为的I2I(准确说是Q2I2I),同时为了弥补长尾query召回仍然不足的问题,我们补充了基于多模态内容的I2I,从文本和视觉维度召回相关商品。
对于上述扩召回的候选,我们使用类目、核心词、语义相关性等维度保证相关性,召回升级后整体模块构成如下:

后面的章节,将依次分模块进行详细方案的介绍。
搜索向量召回的最理想结果是尽可能检索出“相关且高成交效率”的商品。由于闲鱼搜索之前没有向量召回链路,因此一期我们决定先从“相关性”目标出发,设计基于纯语义的向量召回,目的是弥补文本召回语义泛化能力弱的问题。其难点主要为闲鱼场景特色下Query和商品的语义表征建模,以及线上机制策略的兼容;而对于“成交效率”目标的兼顾,本季度也做了相应的实验,但是由于闲鱼场景的特殊性,暂时无法直接照搬常规方法,需要进一步探索,这点在本章结尾进行讨论。
闲鱼搜索的语义向量模型同大多数的场景一样,使用DSSM架构,Baseline Encoder为预训练的Electra-Small模型(相对于Bert-base效果微跌,但模型大小由300M+缩小到47M,提升了运行效率)。为了丰富Query语义,弥补Query表达不充分的问题,我们增加了临近Query表征(基于行为的Q2Q),与集团ICBU、淘宝主搜通过多任务方式引入不同,这里直接增加Query和临近Query的self-attention模块,通过更为直接的融入信息,避免了多任务调餐的工作量及其不确定性。
对于无临近Query的Key Query,进行置空操作,此外对于有临近Query的Sample也会以一定几率置空,以适应新Query与超长尾Query缺少Q2Q的问题。
模型架构如下:

搜索语义召回向量的核心目标为相关性,因此其样本构造也是围绕此设计,这里方案参考闲鱼搜索相关性——体验与效率平衡的背后:
Graph Query Attention
Query Graph即上文提到的行为Q2Q,这里参考Swing I2I算法,构造Swing Q2Q结果。详细地。取Top 3 Query拼接后作为Key Query的补充信息,而后Key Query与Graph Querys通过[SEP]拼接作为模型Query塔的输入。为了使模型能够区分Key Query和Graph Querys的差异,不同的Query类型使用不同的Segment_id作为标识。对于Item-Title塔,其Segment_id与Key Query一致。
直接拼接的方式融合Graph Query信息可以从模型底层就与key Query进行相互的Attention交互,以Query-Title的匹配为目标优化可以更直接的引入临近Query的有用信息,缺点则是一定程度上损失了模型预测阶段对于无Graph Query的样本精度。这点则是通过随机丢弃Graph Query的方式缓解,实验证明该方法行之有效。
早些时候,语义向量召回的优化目标loss为经典的Triple loss:

其中 d(a,p)表示向量a和p的距离,a和p表示query和doc的正样本对,a和n表示负样本对。Triple loss训练的另一个标配是Online hard negative mining,即在mini-batch内,每个正样本对之间互为负样本,选择其中最难的样本作为负样本(相似度打分最高的样本对)。
除了经典的Triple loss外,我们也借鉴了对比学习框架(如MOCO、SimCLR等)下常用的InfoNCE Loss,:,这里增加温度参数,进一步提升模型的泛化能力。

其中q为query向量,k+为商品正样本对,k-为负样本对,τ为temperature超参数。InfoNCE在自监督对比学习中十分有效,同样在有监督的对比学习框架下,也被验证效果。上式从代码实现来看更加直观,也比较巧妙:
该部分策略出发点,闲鱼搜索场景中很多标题也存在信息量不足的情况,如“便宜卖”,容易使模型学偏,这里使用商品历史有点击的Top3 Query作为商品的补充信息,与Query Graph一样的方式融合进网络(使用不同的Segment_id),但实验发现效果不尽如人意,原因分析可能是闲鱼商品在预测过程中,有不小占比的商品集合为新品,该部分商品往往补充信息不足。商品侧引入其高点击Query,根据模型《Shortcut Learning in Deep Neural Networks》的论述,这里模型容易走捷径,过分关注补充的Query信息,对于缺失补充特征的商品预测效果有偏。因此在离线HitRate指标表现不好,在线也存在类似分布不一致的问题。而换个思路补充相似商品信息,也会存在类似问题,因此该路径未继续深挖。
0.780
51.0、73.3、80.7query+难样本构造+dim=64
0.805
52.6、 76.8、 84.4query+graph query+dim=640.79050.5、 76.3、 84.4query+graph query+难样本构造+dim=640.80455.2、 79.6、 86.6query+graph query+难样本构造+infonce loss+batch size=640.82261.2、 83.9、 89.6aph query+难样本构造+infonce loss+batchsize=1280.82462.6、 84.7、90.1
得益于强大的Ha3引擎,使得向量引擎的搭建变得容易了许多。在构建向量索引和使用向量引擎对外提供服务的过程中,需要注意以下的问题:
为了能够同时满足如上的需求,我们设计了如下的向量召回索引流程:

引擎查询阶段,得益于Ha3引擎的强大功能,通过scorer插件、function插件等对召回结果过滤、统计和排序
在闲鱼搜索业务中,存在多个索引引擎,主要包括倒排引擎,即主引擎和优品引擎,在增加了向量引擎以及I2I引擎后,如何以最小的代价对链路改造多链路召回使其满足整体RT的要求,我们设计了如下的多路召回流程:

在实现的过程中,采用的是如上的并发多路召回的方式,目前索引引擎的种类分为两种,分别为Ha3引擎和KV引擎引擎。当前对于每一路引擎都是独立的召回,通过设置不同的召回量控制每一路引擎的召回结果。
在上述基础的语义向量召回基础上,本季度我们也做了一些其他的尝试,下面主要简单描述尝试的方案,以及阶段性的结论分析:
向量召回的理想目标是检索出“相关且高成交效率”的商品,而基于语义的向量召回更多的是考虑“相关”目标,“高成交效率”的目标则是在粗排/精排阶段实现。如果能在召回阶段就考虑成交效率,一步到位,应该是更加理想的状态。
因此,我们也尝试了主流的个性化向量的建模方案:
如上的改造期望使向量模型学习到个性化特征,但结果是模型失去了“相关性”的度量能力(原因也容易想到,在正负样本的构造过程中,“曝光未点击”的负样本极大的可能是“相关”样本),其实上述方案被叫做“双塔粗排模型”更加贴切。
基于这个结论有两条优化路径:
上述语义向量召回方案,并未考虑多模态信息,集团也有很多工作,这里也尝试了类似方案,使用多模态bert强化item侧的特征,事实上离线指标也能得到一定程度提升,但相对地,其链路的也变得更重,对资源的消耗也急剧增加。综合考虑下,当前线上主要还是使用文本模态。该方向仍需继续探索,以兼顾链路的时效性以及资源的ROI。
闲鱼搜索满意度和badcase率是一个比较严格的监测指标,而扩大召回势必会增加badcase透出风险,依赖语义的向量召回更是如此,由于没有严格的Term命中限制,不可避免地对一些query存在语义漂移现象,对于少见的长尾query更甚。
事实即是如此,在实践过程中,仅使用语义向量召回,虽然成交效率可以取得可观的提升,但badcase率也相应的急剧提升,这里我们的解决方案也相对常规:
如此经过一系列的调餐,达到了搜索满意度和badcase率指标的可接受程度的微跌,但却损失2个点左右的人均买卖家效率指标(相对不做满意度优化)。这个方向上,仍然有一部分优化空间,如更柔型的相关性控制(当前版本核心term匹配这里限制的比较严格),更准确的语义向量表达等。相应的后续会从向量表征和机制策略两方面进行优化。
当前召回个性化能力不足,对于不同用户的相同query,召回相同的候选,召回截断后可能损失更具个性化的相关商品。
分析发现,用户通过搜索到详情页猜你喜欢,通过猜你喜欢场景成交的商品占比可观,通过case分析发现,该部分diff商品,靠常规的文本召回方法难以成功检索到。一个参考统计数据,搜索导流到猜你喜欢的点击PV里 ,仅有约25%在当前query的召回集合中,也就是说有75%没有被召回。如一个例子:搜索引擎中检索“迪卡侬优惠券”,返回结果量不足,而点击相关商品进入详情页猜你喜欢却可以关联处满足需求的商品。

因此考虑直接通过I2I方法召回检索池中的商品也会有一定的搜索效率提升空间。
而在搜索场景下I2I实际上需要转化为Q2I2I,因此该部分实验可以分为两个阶段:
通过以上两个阶段可以组合出Q2I2I的候选方案,最终通过AB test择优选择。使用上述方案,最优核心七日人均买卖家提升可以达到+4%的人均买卖家提升,人均成单相应涨幅有+5%。但相应的也伴随着严重的相关性指标下跌的情况。如比较典型的,对于优惠券/会员充之类的query,个性化召回往往会出现比较明显的发散性召回:

对此,我们将相关性的优化也分成了两个阶段,Query2trigger item的相关性,保证trigger item和query的相关性;I2I后,通过query与候选item的类目、核心词以及语义匹配分过滤相关性。在维持相关性波动不大的情况下,最终实现七日+1.8%人均买卖家,人均成单+2.65%。可以看到严格的相关性限制,也缩小了成交效率的空间,也是后续的优化方向,如使用更加soft的相关性限制。
经过本季度搜索召回优化,核心指标上有了明显的提升,推全时人均买卖家:近3日人均买卖家相对提升+4.66%;近7日人均买卖家相对提升+3.31%,人均成单:近3日人均成单+5.3%;近7日人均成单+4.02%;
其中,阶段性的参考切割实验对比:
PS:参考主引擎等数量扩召回,七日人均买卖家+2.3%(未扣除相关性折损,即成交效率收益,损失相关性指标较严重。)相比之下,排除精排候选增多引入的不公平对比,扩召回优化的收益仍然可观。
闲鱼搜索场景相对常规的电商场景有不小的差异,如商品上下架频繁、整体库存不足,各类型商品库存分布差异大、用户query发散、商品类型发散等,卖家侧也是盘踞着各种类型的用户,自由闲置卖家、小专业卖家、黄牛卖家、“投机倒把”的中间商等,因此在算法策略优化中需要考虑的细节较多,召回优化过程中也是如此。
而对于后续优化方向上,在上面的讨论中其实也比较明确,总结一点即是召回效率与搜索体感指标的trade off,如何在保证相关的前提下尽可能召回高成交效率的商品,将是一个长期探索的方向。
参考资源
1、闲鱼搜索相关性——体验与效率平衡的背后
2、Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A.N., Kaiser, L., Polosukhin, I.: Attention is all you need. In: NeurIPS (2017)
3、Mobius: Towards the next generation of query-ad matching in Baidu's sponsored search
4、Shortcut Learning in Deep Neural Networks
这个问题还有疑问的话,可以加幕.思.城火星老师免费咨询,微.信号是为: msc496。
推荐阅读:
更多资讯请关注幕 思 城。

微信扫码回复「666」
别默默看了 登录\ 注册 一起参与讨论!