本文主要用于记录腾讯微信团队于2020年提出的一种深度语义匹配方法的论文。该文提出的模型架构和各种训练模型的小技巧,非常值得我们这种奋斗在一线的NLPer参考。本笔记主要为方便初学者快速入门,以及自我回顾(个人特别喜欢这篇论文,文中的很多方法都用于了实际工作中,所以将会对这篇论文通篇进行详细的解读)
论文链接:https://arxiv.org/pdf/2003.11516.pdf
github地址:https://github.com/DataTerminatorX/Keyword-BERT
论文相关博客:https://mp.weixin.qq.com/s/_QY2EhB-TiBcb5q0379McQ
(原博客写的生动有趣,值得好好品一下~)
基本目录如下:
- 摘要
- 核心思想
- 总结
------------------第一菇 - 摘要------------------
1.1 论文摘要
在各种各样的自然语言处理任务中都绕不开的一个核心问题就是,深度语义匹配任务。比如,在QA检索问题中,新输入的一个问法,就需要与语料库中的所有问题-答案对(QA对)进行语义相关性匹配。但是在开放领域的场景下,由于在“问法-问题”对中会存在各式各样不同表达的词汇,导致衡量新问法与候选QA对的相似性就变的富有挑战性。我们提出了一种“关键词-注意力机制”的方法来改进深度语义匹配任务。我们首先从海量的语料中按领域划分来生成领域相关的关键词字典。在基于BERT原有架构的基础之上,我们再堆叠一层“关键词注意力”层来强调在“问法-问题”对中出现的关键词。在模型的训练过程中,我们提出了一种新的,基于输入问法对中的关键词重合度的负样本采样方法。我们在中文QA语料上利用多种评估指标对模型进行了验证,包括召回候选数据的精确率,语义匹配的准确率。实验表明,我们的方法表现超过了现有的其他基线模型。我们的方法也是通用的,只需要做一点修改,就可以被运用在其他文本匹配任务中。
------------------第一菇 - 核心思想------------------
2.1 背景介绍
开放领域的问题答案匹配(QA对)可以被应用于多个场景之中,包括,网页搜索,智能助理等。其中一个比较重要的应用就是问答数据库检索。 为了提高搜索速度,问答数据库基本都是用问题来建立索引的。因此,我们要计算输入问法与候选问题组中每个问题的相似度,从而检索出答案。计算QQ相似度的任务传统上来说可以基于TF-IDF分数。最近基于深度神经网络的语义匹配方法,引起了业界很大的关注。深度语义匹配问题通常会被转化为二分类问题。比如一个句子对,如果他们语义相似,则给这对的标签就是,“正例”;反之则是,“负例”。
然而,我们认为模型仅仅通过这个二分类标签并不能很好的学习到句子深层次的语义表征。举个例子,对于一个被标记为“负例”的句子对,“Which city is the capital of China?”,“Could you tell me the capital of America?”,模型应该区分出这两句话的核心区别点在于“China”和“America”。但是对于一个开放领域场景,让模型去学会甄别句子对中真正体现出语义差别的关键词/词组(通常还是能够复杂组合的),是一个巨大的挑战,而且很多新词/词组,是模型在训练语料中从来没有见过的。
另一个在训练语义相似模型的难点在于如何构建正例和负例。构建正例是很简单的,通常我们只需要从同一组召回的问句中去选择即可;同理,我们也可以从其他组中去召回句子(理论上有 O(|Q|*|Q|))来构建负例。但是如果考虑到计算资源和正负样本的平衡,那么不可能所有的负例组我们都能拿来做负例。
在本篇论文中,我们设计了一种“关键词-注意力”模型和其他的支撑性模块,包括,关键词抽取系统和负样本生成策略,用来解决我们上面提到的问题。我们发现“关键词”是一种很有用的额外信息,能够用来提升模型的表现,即使那些新增的关键词从未出现在训练数据之中。我们本篇论文的主要贡献包括,
1)“关键词-注意力”BERT模型:我们的深度语义匹配模型是基于最近流行的BERT来构建的。我们在BERT的最后一层,额外引入添加了一层“关键词-注意力”层。我们的目标就是要通过注意力机制,来加强关键词和非关键词之间的交互。通过直接告诉模型,哪一个词才是真正重要的关键的词汇,我们实验证明,我们提出的这种BERT模型变体要好于原生态的BERT。
2)利用更好的负样本生成策略训练出更加鲁棒的模型:为了训练出更具鲁棒性的模型,我们提出了一种新的负样本生成方法。该方法利用了关键词之间的重合度分数来选择出负样本对。另外,我们还采用了实体替换技巧来生成更加多样的负样本(比如,将“China”替换成“America”)。我们会实验证明,利用这部分数据增强的数据,我们的模型会更加鲁棒。
3)关键词抽取策略:我们提出了一种简单有效的关键词抽取算法用于提炼领域关键信息。抽取出来的关键词可以被运用于3个方面,
1)用于构建“关键词-注意力”深度语义匹配模型
2)用于提高QA搜索引擎的召回检索质量
3)用于提高负样本质量,从而更好的训练语义匹配模型。
2.2 问题定义
在介绍我们的方法之前,我们先明确一下我们需要解决的问题。
假定我们有一个query和一组候选问题组。对于每一组问题对(q, Qi),我们需要计算(q,Qi)的相似性分数用于后续的排序。为了计算(q,Qi),我们需要考虑2个问题,
1)如何方便快捷的获取优质的句向量表征。
2)如何把句向量表征融入到匹配模型中。
2.3 方法实现
2.3.1 领域关键词抽取
传统的检索召回方法包括ES,BM25,Lucene等,这些方法都是利用了句子的表面统计特征来衡量句子对之间的相似度。然而,这些方法经常会因为给一些不重要的“关键词”分配了过高的权重而导致了错误的召回结果。举个例子,如Table1所示,从直觉我们就能判断,query的重要部分其实是,“中国”和“GDP”,我们的搜索引擎往往会召回一些看起来相似的问法(下表中的,Similar Q1和Similar Q2),他们看起来跟原句真的很相似,但是他们却忽视那些重要关键词的匹配(比如,在这句话中,真正的关键是,中国的GDP~😄)
Table1.png
事实上,开放领域问题的关键词是与这些问题的所属领域(比如,经济,政治,体育等)高度相关的。基于这些观察,我们提出了一种基于领域的关键词抽取技术用来生成领域相关的关键词,流程如下图1所示。我们收集了千万级的属于特定领域的中文语料,并每天同步更新用于覆盖新的关键词/词组,
图1.png
在中文的NLP场景中,1个中文“词”会包含各种各样的中文字符,但是却没有空白格作为边界来区分每个“词”,因此中文的分词在中文NLP的应用场景中绝对是一个最基础的问题。本论文作者也没有尝试去提出一种最新的分词算法,而是基于一些统计特征来作为新词发现。
2.3.1.1 关键词发现方法
逐点互信息(PMI,Pointwise mutual information)是一种常用的方法用来衡量字符与字符之间的“牢固度(stickiness)”,从而用来发现中文的词汇,具体的公式如下,
2.3.1.2 领域词权重计算方法
在第二步中,我们通过计算某个词在各个领域信息中的作用来衡量其对于该领域的重要性。首先,我们针对每一个词来计算出IDF值。其次,我们引入了“diff-idf”的计算方式来衡量某个领域关键词的重要性,其计算方法如下所示,
其中 ^domain 表示“其他领域”的语料。举个例子,比如我们计算,“杠杆”这个词在金融领域中的重要性,那么“其他领域”就指,非金融类的语料。这里,我们用“df”来替代“tf”,是因为我们认为评估一个词汇在这个领域的重要性,在篇章(document-level)中的频次,比在词组(term-level)中的频次更为重要。而减去“其他领域”中的idf值能够确保计算出的值,是具有区分度的,能够真正代表该词在目标领域的重要性。从直觉上来说,如果一个词,在每一个领域的文章中都比较平均的出现,那么它的“diff-idf”分值会变小,因为需要同时减去,“其他领域”的idf值。我们最终就利用,“diff-idf”值来排序候选词并剔除那些低于阈值的噪声词汇。
我们针对每一个领域的语料,重复进行了上述步骤来生成领域关键词词典,最终,我们把所有的领域词典合并为一个来生成最终的关键词字典,并且运用于我们的搜索引擎。相比与其他的非监督或监督的关键词生成方法, 我们的方法有如下优势,
1)可以利用领域信息来提取语料中的关键词。
2)不需要人为介入来标注关键词,没有什么大的模型架构。
2.3.2 语义匹配模型
我们的语义匹配模型是基于BERT来搭建的,输入就是一组问题对,另外额外添加了一层“关键词-注意力”层。
在关键词从问法对中被抽取出来以后,我们就会把关键词信息通过额外添加的一层“关键词-注意力”层注入到模型之中,该层与BERT的最后一层是平行的,如下图2所示。
图2.png注意力机制对于语义匹配来说是非常重要的,然而,因为缺少额外的监督信息,深度模型往往不能够准确捕获在句子对中的关键信息,从而对这两句话做准确的相似度区分。从pair2vec受到的启发,我们提出的模型更加会关注到那些包含关键词的词组对。具体如下图3所示,在句子A中的每一个字符,只会与句子B中的关键词的字符做点乘。
图3.png如上图所示,句子A和B是负样本(就是不相似的),但是他们看上去却很相似,因为他们都包含了,“如何扫码”,但是他们的语义显然是不一样的,A是想说怎么加入微信群,而B是想说,添加一个微信好友。我们的“关键词-注意力”机制会强迫我们的模型去关注这两句话的关键词的差异,从而来学习到这两句话的本质差异。这个机制的实现也比较简单,只需要在,transformer层中多乘一个,自监督的蒙版(mask)即可。紧跟着最后会加一层平均池化层,用来生成句子的隐藏向量,作为句子对的另2个向量表征维度。同时,为了模型这两种表征的差异,我们还同时引入了关键词差异向量,k-diff,如下所示,
公式1.png有了“关键词-注意力”层,关键词信息就会被注入到离输出目标更近的地方,而不是随着原始问句一起注入到BERT中。最后,我们把这几个特征向量的表征给连接了起来,接了一层全连接层,并输出结果。
总的来说,这一套网络架构的设计是比较讨巧的,从论文的作者博客我们也能看出这个架构是经过多种实验之后,得出来的最好的架构,具体的实现有兴趣的同学可以直接看相关的代码。
2.3.3 负样本生成策略
当我们把语义匹配问题转化为二分类问题的时候,就会碰到如何构建负样本的问题。其中一个比较简单的方法就是通过随机选择来生成负样本对。然后,这种方法肯定是盲目的并且会忽视一些有用的信息,更糟糕的是,经常性的会生成一些简单的负样本(可以理解为区分度非常大)用于模型的训练。因此,我们的目标就是通过更好的样本来生成更加鲁棒的模型。
受到支持向量的启发,我们希望去生成一些具有迷惑性的负样本(就是那种sim(q,Q)分值看上去比较合理的)。第一步,我们首先利用搜索引擎去召回一批数据(利用关键词增强策略生成的问法)。具体来说,我们利用关键词来对原始问法来做增强操作并作为召回候选源,比如,一个原始,query可以被表示为,{x1,x2,...xn},那么其对应的关键词是,{k1,k2,...,km},那么我们用于搜索的问法,就可以被表示为,{x1,x2,...,xn,k1,k2...,km}。
另一个问题就是,在没有人工参与的前提下,如何从召回的数据中去挑选合适的负样本数据。其中一个指标就是通过搜索引擎返回的相似性分数来判断。如果相似性分数低于阈值,那么召回的候选问句就有可能是负样本。另外,我们还引入了一种输入问法query和候选Q之间的关键词重合率指标。直觉上来说,一个好的负样本会在非重合和重合部分之间有很好的平衡。最终,我们会结合两种评估标注来筛选出我们的候选负样本,如下所示,
公式2.png另外一种生成负样本的方法就是通过随机的实体替换。举个例子,“What factors will affect China’s GDP?”,可以被重写为,“What factors will affect America’s GDP?”。这个过程生成的问法对看上去会非常相似,但其本质的意义却是相反的。因此,对于在数据库中的每一个问句,我们都会按照一定的比例随机替换其中的一个实体。
至此,本论文提出的3个核心思想理念已经全部阐述完毕了。
剩下的一些实验过程及相关的结论有兴趣的同学可以直接翻阅原始论文。
本文不再作更多的解读。
------------------第三菇 - 总结------------------
3.1 总结
到这里,整篇论文的核心思想已经说清楚了。本论文主要是提出了一种基于关键词的深度语义匹配模型,其中涵盖了领域关键词抽取系统,基于BERT改造的“关键词-注意力”语义匹配模型和负样本生成策略。
简单总结一下本文就是先罗列了一下该论文的摘要,再具体介绍了一下本文作者的思路,也简单表述了一下,自己对作者提出方法的理解。希望大家读完本文后能进一步加深对该论文的理解。有说的不对的地方也请大家指出,多多交流,大家一起进步~😁
网友评论