引言
深度语义匹配在闲鱼搜索相关性计算中扮演重要角色,相关工作在文章[1]《闲鱼搜索相关性——体验与效率平衡的背后》中有简单的介绍。如题,本文介绍前段时间在深度匹配任务上的另一种尝试,通过检索和生成任务联合训练的方法提升相关性匹配的效果。
融合生成任务提示匹配主任务的思路并不新颖,而在BERT流行的今天,本文则参考[2]《鱼与熊掌兼得:融合检索和生成的SimBERT模型》,稍加改动,使用BERT为Backbone来重新实现类似的思路,模型暂且仍叫SimBert。
现状
闲鱼搜索的深度语义匹配前期做过多种尝试,但最终全量策略有两种:
1. 基于双塔语义匹配:以BERT为基模型的双塔模型,使用对比学习loss和难样本负采样的模型训练。预测阶段Query和Item的向量离线计算,线上计算二者的余弦距离作为相关性分。
2. 基于Later-Fusion的深度语义匹配:在双塔模型的基础上,增加多层全连接的后融合模块,全连接网络的输入为双塔模型的输出向量,最后使用人工标注数据训练分类任务(相关或不相关)。此外通过非双塔结构的交互式BERT匹配模型作为Teacher模型进行模型蒸馏。线上双塔模型仍为离线向量计算,多层全连接部署实时预测服务,预测Query和商品的相关性分。
图1 双塔和后融合模式的深度语义匹配
前者离线和在线分离,线上运行效率高,但模型匹配能力不足,缺少底层细粒度信息的对齐信息(Alignment);后者在双塔基础上将内积替换成全连接网络,并使用人工标注数据训练分类模型,虽然一定程度上强化了Query和Item信息的交互,但更多的还是基于上层抽象语义的特征融合,对于底层更基础信息的特征对齐仍然不足。
回头简单看,非双塔结构的BERT做语义匹配之所以强,是因为Query和Item在最底层的特征就开始进行Self-Attention交互,模型既可以考虑Token粒度的特征匹配,又能学习上层更加抽象的语义特征。但交互型BERT匹配模型虽然效果好,直接部署线上却比较困难,解决效率问题的方案很多,如蒸馏、量化等。而本文则考虑在匹配主任务基础上加入Item Title生成相关Query的辅助任务,通过生成任务中的Attention机制,来增加底层基础特征之间的Alignment信息。在预测阶段只使用主任务模块进行预测,实现效果和效率的平衡。
实现细节
方案的实现描述可以从模型、训练和目标函数以及训练数据的构造几个方面进行介绍。
模型
SimBert承接Later-Fusion的模型结构,底部为BERT双塔模型,分别提取Query和Item Title向量([CLS] Token的输出),而后通过多层全连接网络融合并进行相关性分类任务。不同的是在此基础上,SimBert在Item塔部分增加了生成Query的辅助任务,如图所示。
图2 融合匹配和生成任务的SimBert模型
生成任务部分的要点有两个:(1)Item塔的[CLS]需要遮住待生成Query部分的信息,避免对于匹配任务的特征穿越;(2)待生成Query的每个Token只能看到当前位置之前的信息,不能看到“未来”部分的信息,模拟自回归过程。
实现这两个目标只要对原BERT的Attention Mask矩阵进行变形即可,如对于正样本对<Query:手机,Title:出华为手机>的生成任务,Item塔的输入和对应的Attention Mask矩阵如下:
图3 生成任务特征输入和Attention Mask示意图
简单来说,Attention Mask矩阵中,白色的方块位置为0,灰色的位置为1,实现各个token位置的视野范围。如[CLS]所在的位置看不到生成域中的“手机”,因此提取出的向量仍只是表征Item部分信息。这部分更加详细的介绍可以参考论文UniLM[3],可以算是最早的在BERT结构中引入生成任务的工作之一。
训练和目标函数
模型的训练分为两个阶段,预训练和微调。预训练阶段同样是采用多任务,主任务是双塔向量匹配任务(剔除Later-Fusion全连接),目标是使用大规模质量相对低的数据先训练一个比较鲁棒的Bert Encoder,Loss函数则是对比学习中常用的InfoNCE。辅助任务为上述的生成任务,二者线性融合后作为预训练任务的Loss函数:
微调阶段,使用人工标注的高质量数据,同时加入Later-Fusion全连接,对应任务变为二分类任务,判别输入的Query和Item是否相关,融合生成任务后即为微调Loss函数:
其中为超参数,可根据实验效果调整。
数据
与训练过程对应,训练数据的构造同样包括两部分。在预训练阶段,对于匹配任务我们以点击日志为主,有点击行为的Query-Title对为正样本,取Batch内的随机样本为负样本。同时为了增加任务难度,对于Batch的构造进行了一定的设计:
(1)30%的Batch为随机样本;
(2)70%的Batch内为难负样本集合,如要求一个Batch内的数据为同父类目组成等。
由于训练数据的输入形式为正样本对集合,因此对于生成任务,可以和匹配任务共享数据,使用正样本对中的Title生成对应Query。
在微调阶段,我们使用历史积累的人工标注数据来进一步提升模型的准确率。数据的形式变为<Query, Title,Label(相关/不相关)>,适用于分类目标任务。对于生成任务,不相关的样本对则通过Loss Mask的方式不进行反向传播,做到只对正样本对进行Title到Query的生成。
离线与AB效果
本次实验对离线指标和在线指标都进行了对比,同样的训练方式,引入生成任务在最终的相关性任务准确率相对提升+3.6%;新模型上线同样取得不错的效果,人工Side by Side评测top query的badcase率-3.88%,随机query的badcase率-6.15%。
思考与优化方向
本文介绍了在闲鱼场景下实践使用BERT融合检索和生成任务的方案,当前实践过程相对粗糙,还没做细致的调参和策略调整,后续可以从以下三个方面做进一步优化:
(1)一方面补充更多的数据并进行数据增强尝试,另一方面通过主动学习的方法,并对人工标注数据做进一步清洗。数据清洗的原因是从模型预测来看,不少FN(False Negtive)样本,实际上是数据Label有误,FP同样有类似情况;
(2)引入知识和关键词信息,Case分析发现,即使是增加生成辅助任务或全交互的BERT匹配模型,仍还有一些核心属性匹配能力不足的情况,这部分计划尝试增加知识和关键词的监督信号,来强化核心词的匹配。
(3)引入更多维度的信息,一方面当前商品信息的输入单纯为Title,然而部分Case会有title信息量不足的情况,在闲鱼场景下更是如此,因此后续需要尝试增加更多域的信息,如描述关键词、结构化信息、多模态信息等;另一方面,Query侧也可以通过相似Query的挖掘进行相应关键词的补充。