背景

短文本匹配(text matching)或句子相似度(sentence similarity)在信息检索中有着广泛的应用,比如相似问题判断,问答系统等等。短文本匹配的任务难点有两个,一个是“短”,缺乏上下文和可以利用的信息。比如说“某某被绿了”这个句子,人是知道“绿”的含义的,但是这对于机器来说是很难理解的,这里需要借助一些外部的知识来帮助机器理解。第二个难点是语言表达形式的多样性,这里有两个句子:

  • Cats Sit On The Mat
  • On The Mat There Sit Cats

这两个句子表达含义相同,但却句式完全不同。

使用深度学习也是为了解决以上两个问题,对于第一个问题缺乏上下文主要使用预训练(pre-trained)embedding,对于第二个问题使用神经网络结构去捕捉两个句子之间的语义相似度。这篇文章主要介绍几个比较流行的深度学习模型,这几个模型的共同点是使用人比较多,另外都在MSRP(Microsoft Research Paraphrase Corpus)数据集上进行了实验,这样我们可以纵向比较。

Short Text Similarity with Word Embeddings

严格意义上来说这个模型不能算是深度学习,因为它最终使用的是SVM分类器。但是这篇文章很有借鉴意义,它使用word embedding设计了很多特征,并使用SVM训练了一个分类器,最终在MSRP数据集上F1达到了0.839,算是很不错的结果。最后还做了ablation study。这方便我们理解特征在短文本匹配任务中发挥的作用,也许可以在设计新模型过程中受到启发。

这个模型一共设计了三大类特征:

1. 带权重的语义相似度

文本中的词重要程度是不同的,比如分隔符,它出现的频率很高,但是它并不是很重要。作者在这里使用TF-IDF为每个词分配了一个权重用于区分词的重要程度。作者在计算相似度时候,会以词为单位进行累加,最终是带权求和得到整体相似度度。但是这里有个词序的问题, 比如“Cats Sit On The Mat“和“On The Mat There Sit Cats“这两个文本,cats出现的位置是不一样的。在第一个文本中计算Cats这个词相似度时,会与第二个文本所有词继续计算,最后选择相似度最大的哪个词。具体计算公式如下:

其中Sl是两个文本中较长的,Ss是较短的,每次计算以长文本中的词为基准,这样能保证对称性。Sem()函数就是计算词与词相似度的函数,它会选择Ss中最相似的词。相似度的计算使用多种embedding的拼接计算cosine相似度。K1和b等参数起到平滑效果。

2. 无权重的语义相似度

这一部分计算两个文本中所有词embedding之间的cosine相似度,并从中得到两个特征。一个是所有词相似度之和,另一个是词之间的最大的相似度值。

3. 文本级别特征

文本级别特征有两个部分,一个是对词向量求和平均,这样就得到了这个文本表示,计算欧氏距离和余弦距离得到两个特征。另一个是得到文本表示和比较每个维度差异,统计差异不超过某个阈值维度的个数。这样做的目的是为了比较embedding的不同的地方,直觉上看,如果两个embedding在很多维度上很像,但是在个别维度上非常不像,一样会得到很高的相似度值。所以统计维度上的差异还是有意义的。

下表是文中做的消融学习(ablation study),也就是控制变量的实验。可以看出最重要的特征是无权重相似度中最相似两个词的的相似度,其次是带权重的语义相似度,然后是dimentions,也就是维度上相似的个数。从而我们可以得出一些结论,比较两个短文本的相似性,首先要看文本中最相似的部分,其次一一比较文本中的每个词,考虑词序的变化,要找到文本中对应的词,对于重要的词给高权重,不重要的词给低权重,最后也要关注embedding的弱点,个别维度的巨大差异需要关注。最后我们可以看出文本级别的相似度并不是很重要,这是由于求和过程中损失了很多信息,这点也值得注意,简单粗暴的对embedding进行求和得到的文本表示效果并不好。

总体来看这个模型性能还是有保障的,比CNN模型ARC-II还要好,这归功于作者设计的特征。但是这个方法的缺点也比较明显,需要特征设计,在做分箱时要设定很多超参数。另外这个模型还有一个典型的缺点就是没有考虑词序,有时候词序的变化也会影响整个句子的含义。除此之外的缺点是ngram没有考虑。还有一个疑问是TF-IDF在给词分配权重时候是否合理?因为在短文本中通常每个词的频率是1,那么TF-IDF的值基本上由IDF决定,那么这样合理么?举个不恰当的例子,'not'这个词肯定是一个高频词,那么它的IDF值会很低,但‘not’这个词其实很重要,直接使短文本有相反的意思。所以怎样为每个词分配一个合理的权重是一个难点。

ARC-I & ARC-II

这篇文章使用了两个模型分别叫:ARC-I 和 ARC-II。都是使用CNN构建的模型,文中还分析了CNN再句子建模中的作用。使用CNN,不同词窗口的feature maps配合上max-pooling可以提取到句子中关键的n-gram特征。如下图所示,对于句子“the cat sat on the mat”,如果使用3个词的窗口可以得到句子所有trigram表示,‘the cat sat’, 'cat sat on'等等(词窗口为2同理)。然后使用max-pooling会得到这个句子中最关键的n-gram特征,比如对于f-m group1中,经过pooling后取出‘the cat sat’和‘on the mat’这两个trigram表示。对于文本匹配任务来说,CNN可以提取两个句子中最关键的n-gram特征,后续我们就可以进行比较了。

ARC-I 

ARC-I结构比较传统,先使用CNN获得句子表示,然后进行拼接,后面跟一个多层感知机(MLP)得到匹配分数。但是这个方法有个明显的缺点,输入的两个文本只在最后输入MLP时进行拼接,缺乏Interaction,少一些交互信息。这样就丢掉了很多细节。举例来说就是如果两个文本如果有一些共同出现的词就很容易得到很高的matching分数,这样的话还是缺少分辨能力,比较语言表达形式十分多样。

ARC-II

ARC-II模型对ARC-I模型的缺点进行了改进,在CNN一开始就加入了Interaction,在Layer1中,分别取出sentence X和sentenceY的ngram特征,使用feature map后得到一个值,代表这两个部分的交互表示。对这两个文本中所有的ngram两两计算就得到一个二维矩阵(论文中使用的trigram,也就是窗口值为3),使用多个卷积核(kernel)就得到了一个tensor。在Layer2中,使用2-D pooling,找到关键的一对值。在Layer3中再进行2-D 卷积获得深层次的特征,最后再接一个MLP获得matching分数。

再Layer进行2-D pooling时候可以保存原有的顺序,如下图所示,经过Layer1后,张量中的一个二维矩阵代表两个文本中词与词(或者n-gram,在这里假设为unigram)之间的交互表示, 假设元素(1,1)代表sentence X中的第一个词和sentenceY中的第一个词交互结果,在经过Layer2的2D-pooling后得到依然保持原有的顺序。在训练过程中作者使用triplelet loss,随机组合训练集中的words生成负样本,得到了更好效果。

ARC-II模型关注了两个文本之间词组(trigram)之间的比较,从而比ARC-I模型得到了提升。但在这里有个疑问,直觉上看,unigram, bigram同样有用,为啥没有加进来。ARC-II模型较以往的方法最大的改进就是加了文本之间的交互。我认为这个方法的缺点是,首先对于一般情况下,文本中ngram是一一对应的,比如unigram对应unigram,bigram对应bigram,但是有些复杂的情况,一个word对应bigram,举个不恰当例子,周杰伦英文名字叫Jay,一个文本中出现的Jielun Zhou,另一个文本中是Jay。Jay 这个词要跟 Jielun Zhou 对应到一起。另一个缺点是这个模型没有考虑权重,分隔符这种词是不重要的,但是依旧会影响最终结果。

Multi-Perspective CNN

上图就是这个模型的框架,这篇文章的创新点是Multi-Perspective,中文也就是多角度,多视角。多角度体现在两个方面:

  1. 卷积层的细粒度。传统CNN的对文本进行卷积,feature map的size通常是ngram*embedding length,这种卷积在文中称为holistic filter。这篇文章提出了per-dimension filter,也就是对embedding的每个dimension都进行卷积操作,如下左图所示,这样就得到了更细粒度的特征。
  2. 比较层的多角度。传统CNN方法max pooling得到两个文本使用两个文本的表示,一个cosine距离完事。这篇文章认为此举太过粗糙,暴力,丢失了很多有用信息。这个模型做法是使用三种pooling {max, min mean},然后对不同窗口filter得到特征分别使用不同pooling, 然后再使用三种距离{cosine, Euclidean, absolute}对不同size的filter的不同pooling结果进行比较,然后将所有视角的比较结果通过一个全连接层,得到最终的相似度。如下面右图所示。

这个模型最终的F1是84.73%,算是比较好的结果,但是模型稍微有些复杂。作者最后也做了ablation study,如下图所示,我们只关注在数据集MSRP上的结果。结论主要有以下几点:

  1. 在embedding层,也就是第一组,作者使用了三种embedding,word embedding + pos embedding + paragram embedding。在这里paragram embedding 可以理解为近义词的embedding,细节可以参考这篇论文PARAGRAM embedding。从结果看出paragram embedding作用还是很大的,可能是因为文本对中经常出现一些同义词,比如small, tiny, little等,而这种embedding能够比w2v更好表达这种信息。另外POS还是有用的。这里推测下依存关系是不是也是有用的,那问题是如何避免使用NLP Toolkit从而有效利用这些信息呢?
  2. 在句子表示层,也就是第二组,最有用的信息是多窗口的feature map,直观上看就是多些ngram特征。per-dimension embedding也是有用的,这里我理解完整维度的embedding才能表示一个word,但是embedding的每个维度好像没有特别物理意义per-dimension之所以能发挥作用是因为存在这种现象,计算两个word embedding的cosine相似度,如果两个word大部分维度都很像,但个别维度存在巨大差异,那么结果值也会很高,但是其实这两个word含义不同,而per-dimension可以在细粒度得到这种信息。另外min+mean pooling也有效果,但是不太大,个人感觉mean pooling用处不大,min-pooling能捕捉不同的地方。
  3. 距离使用层上面,也就是第三组,混合使用距离方法比较是有较大提升的。这个是提升最大的地方,好奇的一点是如果只使用cosine结果会怎样。
  4. 比较层,也就是第四组,Vertical Algorithm和Horizontal Algorithm直观上理解,一个是相同的ngram特征之间的比较,比如unigram只跟unigram比,bigram只跟bigram比,另一个是把ngram特征组合起来,并且在一个一个维度上比,跟per-dimension类似。Vertical效果要好一些,也比较符合直觉。另外就是per-dimension是有用的,可以比较每个维度的异同。如果去掉比较层,直接flatten后比较会损失很多精度,原因就是丢失很多细节。

这个模型的结果还是不错的,创新点如标题提供更多视角,更细粒度的特征和比较方法,paragram + pos embedding这里感觉挺有意思的,很大的启发是在对两个文本进行比较时候,要在更细粒度上进行,否则真的会丢失细节。缺点就是模型稍微有点复杂,如果说改进的地方,我觉得是词的权重这块是需要的,像一些非常common但又不重要的词如何给低权重,一些关键词给到高权重。

MatchPyramid

模型架构如上图所示,网络的基本结构还是CNN,但是这个CNN使用跟以往的方法不同,这个CNN使用更像图像中的使用,使用多层CNN捕捉一些高层次的特征,就像处理猫狗图片首先得到像素,然后再得到一个耳朵,再组合成能够分辨猫狗的高级特征。这个模型中多层CNN在处理文本时候,首先得到词级别特征,然后是词组,直到整个句子的特征。那问题是图像输入是二维的,文本是一维的,在文本匹配中如何得到这么一个二维矩阵呢。作者设计了一个交互层来构造这个矩阵,也就是layer0,交互的方法作者设计了三种,一个是0-1矩阵,两个文本中词相同,该元素值为1,反之为0,如左图(a)所示。第二种是使用word-embedding计算两个词的cosine相似度,第三章方法是在word-embedding基础上dot product,如左图(b)所示。

有了这个二维交互矩阵,可以使用CNN去提取特征,如下图所示,第一层kernel是3*3,就可以捕捉到'down the ages'这个三个词,同时也可以捕捉到'dumplings and noodles'和'noodles and dumplings'这种有词序变化的相关词组。在第二层卷积层,就可以加工到词组之上的特征,第二层得到的结果可以理解为对第一层得到ngram匹配结果进行组合,从而得到的高级特征。直觉上看人类在比较两个句子是否是一个意思,首先分析句法结构,找到主谓宾,然后再找关键词或词组。这样对词组的组合对文本匹配任务究竟有多大贡献呢?

作者在实验上发现在交互层实验Dot Product效果最好,原因在于word embeddings,常见而又不重要的词(类似停用词)Norm值比较低,而区分度比较高的词Norm值就高。所以Dot Product能捕捉更多的语义信息。我的想法是词向量的Norm值有点类似于TF-IDF值。那么在计算Cosine相似度时候会除以Norm(word A) 和 Norm(word B)的乘积,如果两个词都是不重要的词,dot product值会小,同时分母也比较小;如果两个词都是重要的词,分子大,分母也大。这样的话难以区分重要词,而dot product可以区分,所以增加了更多语义信息,纯属个人臆测。

总的来说这个算法简单实用,在MSRP上准确率为75.94,已经很接近较它复杂N倍的Multi-Perspective CNN了,这个模型可以比较词组之间的相似性,而且还能捕捉词序变化,还是很值得一用的。

ABCNN

这篇文章最大的创新点在于使用了Attention,Attention在RNN上用的还是比较多的,ABCNN也是第一次将CNN+Attention用于文本匹配。Attention本质就是一个打分函数,为子部分分配权重,在这个模型中作者在两个地方使用了Attention,在输入层和卷积层之后,Attention不同的位置也对就应着ABCNN-1和ABCNN-2网络结构。ABCNN-3是对这两种结构的综合。

ABCNN-1

如上图所示,Conv Input就是输入层,包含两个句子,S1和S2,由图中红色部分表示。矩阵A就是Attention矩阵了,其中的元素A(i,j)代表S1中第i个词和S2中第j个词的相关程度。蓝色的矩阵是由参数矩阵W与Attention矩阵相乘得到的,这样就得到了基于attention的feature。然后将蓝色和红色矩阵转换成一个双通道输入,接下来就可以进行卷积了。这么做可以增加零点几个百分点,感觉像是给每个词加了个权重,这个权重就代表这个词在这次匹配任务中的重要程度。

ABCNN-2

ABCNN-2在卷积之后加入attention,目的是为了在卷积之前为每列特征分配权重,告诉网络哪个特征比较重要应该多关注。Attention矩阵的计算方法跟一相同,使用的时候在ave-pooling之前。第i列的attention值为attention矩阵某列或某行的和,这取决于是哪个输入的句子。有了这个值之后就可以在pooling之前加权求和了。

ABCNN-3

这个网络就是对前面两种Attention都使用,从结果上来看,这种模型效果也最好。

总体上来看ABCNN的确很棒,准确率也是这几种算法中最高的。Attention大法的确是有效,Attention为卷积后得到的词组分配权重,这样就可以重点关注能够“分辨力强“的部分,忽略一些比较common的东西。

结果比较

在MSRP数据上性能比较
  ACC F1 External Source
Word Embeddings 76.6 83.9  
ARC-I 69.6 80.27  
ARC-II 69.9 80.91  
Multi-Perspective CNN 78.6 84.73 PARAGRAM embedding, POS embedding
MatchPyramid 75.94 83.01  
ABCNN 78.9 84.8  

其他算法

以上算法基本都是基于CNN的,下面介绍几个使用其他方法做文本匹配但也非常好用的深度学习方法。

ESIM

ESIM本身用来做文本蕴含推理的,但用在文本匹配也非常的好用。ESIM模型是带Attention的RNN,整体结构如下图。我们重点关注左半部分,模型的输入是一对文本,premise和hypothesis。首先使用双向LSTM对文本进行encode,得到该word的表示,其中包含了上下文信息。然后进入Local Inference Model,借助Attention比较两个文本的异同,并将这种信息与上一层LSTM的结果进行拼接,这样就得到更加丰富的表示。然后再加一层双向LSTM获取带上下文的表示。最后使用Ave+Max pooling和softmax得到结果。

Input Encoding这里没啥好说的,Bi-LSTM编码。Local Inference这部分比较关键,这里首先通过比较两个文本计算出一个attention矩阵,矩阵中每个元素计算方法比较简单,计算公式如下,ai和bj分别代表文本中的两个word,得到的eij的值代表文本中词与词之间的相关程度。

那么这里怎么使用这个相关性矩阵呢?也很简单,现在不是有每对词的权重了吗,对于ai这个词,我们把句子b中所有word来个加权求和,权重就是句子b中word与ai相关度。加权求和后就得到一个维度跟ai一样的向量。对于单词bj同理。那么得到的这个向量有什么意义呢?我们可以理解这个向量为句子b与单词ai最相似的部分表示。

然后把这个新向量与ai拼接,并且再拼接上它们的相减和相乘,如下公式所示,这样我们就得到了代表最后得到的两个文本的表示ma和mb。这个部分是ESIM的核心,这么做的意义是什么?\bar{a}_{i}是word经过Bi-LSTM后的表示,\tilde{a}_{i}是句子b中与\bar{a}_{i}最相关的部分,那向量可以理解为a句子中word i本身,句子b中与它相似的部分,同时把他们之间的相似与不同之处的信息也加了进来。从直观上来看这些信息的确能带来提升。

在Inference Composition这部分再加一层Bi-LSTM,继续加工获得深层次特征。然后再接一个Ave+Max Pooling,Max Pooling得到的是区分度最强的词;Ave-Pooling得到的是综合信息。最后再使用全连接加softmax得到最终结果。

ESIM模型并不复杂,使用Attention+BiLSTM,得到的结果也非常好。有些疑问就是attention加在那一层比较好,这里作者加到了第一层LSTM之后,不知道这里有没有区别。

Reference

[1] Kenter, Tom, and Maarten De Rijke. "Short text similarity with word embeddings." Proceedings of the 24th ACM international on conference on information and knowledge management. ACM, 2015.

[2] Hu, Baotian, et al. "Convolutional neural network architectures for matching natural language sentences." Advances in neural information processing systems. 2014.

[3] He, Hua, Kevin Gimpel, and Jimmy Lin. "Multi-perspective sentence similarity modeling with convolutional neural networks." Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing. 2015.

[4] Pang, Liang, et al. "Text matching as image recognition." Thirtieth AAAI Conference on Artificial Intelligence. 2016.

[5] Yin, Wenpeng, et al. "Abcnn: Attention-based convolutional neural network for modeling sentence pairs." Transactions of the Association for Computational Linguistics 4 (2016): 259-272.

关于短文本匹配的深度学习模型相关推荐

  1. 【NLP】相当全面:各种深度学习模型在文本分类任务上的应用

    论文标题:Deep Learning Based Text Classification:A Comprehensive Review 论文链接:https://arxiv.org/pdf/2004. ...

  2. DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算

    在NLP领域,语义相似度的计算一直是个难题:搜索场景下query和Doc的语义相似度.feeds场景下Doc和Doc的语义相似度.机器翻译场景下A句子和B句子的语义相似度等等.本文通过介绍DSSM.C ...

  3. 深度学习模型实战-深度学习模型在各大公司实际生产环境的应用讲解文章

    仓库地址:https://github.com/DA-southampton/Tech_Aarticle/edit/master/README.md 建这个仓库的是因为工作之后发现生产环境中应用的模型 ...

  4. 用Windows电脑训练深度学习模型?超详细配置教程来了

    选自towardsdatascience 作者:Ahinand 机器之心编译 编辑:Panda 虽然大多数深度学习模型都是在 Linux 系统上训练的,但 Windows 也是一个非常重要的系统,也可 ...

  5. 不用GPU,稀疏化也能加速你的YOLOv3深度学习模型

    水木番 发自 凹非寺 来自|量子位 你还在为神经网络模型里的冗余信息烦恼吗? 或者手上只有CPU,对一些只能用昂贵的GPU建立的深度学习模型"望眼欲穿"吗? 最近,创业公司Neur ...

  6. 【NLP-NER】命名实体识别中最常用的两种深度学习模型

    命名实体识别(Named Entity Recognition,NER)是NLP中一项非常基础的任务.NER是信息提取.问答系统.句法分析.机器翻译等众多NLP任务的重要基础工具. 上一期我们介绍了N ...

  7. 【AI初识境】深度学习模型评估,从图像分类到生成模型

    文章首发于微信公众号<有三AI> [AI初识境]深度学习模型评估,从图像分类到生成模型 这是<AI初识境>第10篇,这次我们说说深度学习模型常用的评价指标.所谓初识,就是对相关 ...

  8. 深度学习模型保存_Web服务部署深度学习模型

    本文的目的是介绍如何使用Web服务快速部署深度学习模型,虽然TF有TFserving可以进行模型部署,但是对于Pytorch无能为力(如果要使用的话需要把torch模型进行转换,有些麻烦):因此,本文 ...

  9. 微软开源项目NeuronBlocks - 像搭积木一样构建NLP深度学习模型

    在构建自然语言理解深度学习模型过程中,研究人员或者工程师们经常需要在编程细节和代码调试上花费大量精力,而不是专注于模型架构设计与参数调整.为了提升构建深度模型的效率,微软亚洲互联网工程院自然语言理解团 ...

最新文章

  1. Exchange 2013防止数据丢失DLP预览
  2. IC/FPGA 技术交流
  3. 如何确定foreach循环中的第一次和最后一次迭代?
  4. 论理想中的技术团队——领导力
  5. Wordpress不同页面显示不同小工具
  6. python line strip_Python进阶---python strip() split()函数实战(转)
  7. jquery-事件委托-delegate
  8. 中兴助力软银开启首次5G测试
  9. 【数据库原理实验(openGauss)】认识DBMS系统
  10. 我的世界java怎么自制皮肤_我的世界皮肤制作教程
  11. linux的软件源修改
  12. 3D摇杆控制器一种简单实现!Cocos Creator 3D!
  13. 2021 ICPC Gran Premio de Mexico 1ra Fecha
  14. 清默网络——RIP单播更新
  15. java表格点击添加按钮一行_JavaScript_JQuery实现动态表格点击按钮表格增加一行,功能实现:点击添加按钮,表 - phpStudy...
  16. 统一vscode和hbuildX开发工具格式化规则
  17. Qt实战:云曦日历篇
  18. 说说宾得机身的十大人性化设定和功能[转]
  19. 深度学习算法相关岗-校招、社招、实习-面试知识要点及答案分享
  20. guacamole 源码_Guacamole学习笔记

热门文章

  1. 大盘点 | 2020年5篇图像分割算法最佳综述
  2. C++文件读写——字符串分割
  3. Jquery中关于动画的一些操作函数
  4. RDKit | 化合物库的相似性分析
  5. R语言-安装使用指南
  6. java ado连接mysql_【转】Java JDBC对应C# ADO连接数据库之区别
  7. FungalTraits: 超越FUNGuild的最新真菌表型数据库
  8. 视频演示:高颜值免费在线绘图ImageGP
  9. ARM:钒和铁替代固氮酶的前世今生
  10. 扩增子和宏基因组数据分析流程和可视化方案—刘永鑫(南京,2020年11月27日)