3

闲鱼深度语义相关性计算:融合检索和生成任务

 1 year ago
source link: https://www.6aiq.com/article/1677085028827
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

alg

via Mac OS
本助手集算力、智能于一身,为您提供最精彩全面的人工智能技术资讯
闲鱼  阿里  NLP  搜索系统  •  0 回帖  •  50 浏览  •  4 天前

闲鱼深度语义相关性计算:融合检索和生成任务

来源:闲鱼技术 稿

引言

深度语义匹配在闲鱼搜索相关性计算中扮演重要角色,相关工作在文章[1]《闲鱼搜索相关性——体验与效率平衡的背后》中有简单的介绍。如题,本文介绍前段时间在深度匹配任务上的另一种尝试,通过检索和生成任务联合训练的方法提升相关性匹配的效果。

融合生成任务提示匹配主任务的思路并不新颖,而在BERT流行的今天,本文则参考[2]《鱼与熊掌兼得:融合检索和生成的SimBERT模型》,稍加改动,使用BERT为Backbone来重新实现类似的思路,模型暂且仍叫SimBert。

现状

闲鱼搜索的深度语义匹配前期做过多种尝试,但最终全量策略有两种:

    1. 基于双塔语义匹配:以BERT为基模型的双塔模型,使用对比学习loss和难样本负采样的模型训练。预测阶段Query和Item的向量离线计算,线上计算二者的余弦距离作为相关性分。
    1. 基于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的挖掘进行相应关键词的补充。

参考文献

1、闲鱼搜索相关性——体验与效率平衡的背后

2、鱼与熊掌兼得:融合检索和生成的SimBERT模型:https://kexue.fm/archives/7427

3、Unified Language Model Pre-training for Natural Language Understanding and Generation:https://arxiv.org/abs/1905.03197


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK