文本匹配模型汇总

1 DSSM

DSSM是2013年提出来的模型主要应用场景为query与doc的匹配,在这之前,用的更多的还是一些传统的机器学习算法,例如LSA,BM25等。DSSM也算是深度学习在文本匹配领域中的一个先驱者,接下来我们会先从其结构开始讲起,并简单介绍下其变体。

1.1 模型

短文本与长文本匹配 python 短文本匹配模型_卷积


Term Vector是文本转向量后的值,论文中作者采用的是bag-of-words即词袋模型。然后是Word Hashing层,英文主流文本转vector的方式更多是采用embedding,但是该方法有一个致命的问题就是会出现OOV的问题,而作者提出了一种word hasing的方法,该方法一方面能降低输入数据的维度,其次也能保证不出现OOV的问题,接下来我们详细看下其原理。

1.2 word hashing

这里以good这个单词为例,分为三个步骤
–在good两端添加临界符#good#
–采用n-gram的方式分成多个部分,如果是trigrams那么结果是[#go, goo, ood, od#]
–最终good将会用[#go, goo, ood, od#]的向量来表示
在英文中,因为只有26个字母,加上临界符是27个符号,3个字母的组合是有限的,即17550种可能,因此也就不会出现OOV的问题。

对于discriminative,discriminate,discrimination 三个单词的意思很像,他们的Word Hashing中也有大部分是相同的。这样两个不同的单词也有可能具有相同的tri-grams,针对这个问题论文中做了统计,这个冲突的概率非常的低,500K个word可以降到30k维,冲突的概率为0.0044%。

可见该方法对于英文来说是有效可行的,但是并不适合中文。

1.3 特征抽取

接下来的结构就很简单了,三个全连接层,激活函数采用的是tanh,把维度降低到128,然后把两个序列的Semantic feature进行了余弦相似度计算,这里给一下前向传播的公式。

短文本与长文本匹配 python 短文本匹配模型_短文本与长文本匹配 python_02

1.4 输出层

输出层也很简单,一个softmax,因为是计算相似度所以可以看成是二分类,细节不再赘述。

1.5 变体

随着深度学习的发展,CNN、LSTM被提出,这些特征提取的结构也被应用到了DSSM中,其主要的区别就在于把特征提取层的全连接结构换成了CNN或者LSTM。

2 ESIM

https://arxiv.org/pdf/1609.06038.pdf

ESIM模型主要是用来做文本推理的,给定一个前提premise p 推导出假设hypothesis h,其损失函数的目标是判断 p与 h是否有关联,即是否可以由 p推导出 h,因此,该模型也可以做文本匹配,只是损失函数的目标是两个序列是否是同义句。接下来我们就从模型的结构开始讲解其原理。

2.1 模型

ESIM的论文中,作者提出了两种结构,如下图所示,左边是自然语言理解模型ESIM,右边是基于语法树结构的HIM,本文也主要讲解ESIM的结构,大家如果对HIM感兴趣的话可以阅读原论文。

短文本与长文本匹配 python 短文本匹配模型_短文本与长文本匹配 python_03


ESIM一共包含四部分,Input Encoding、Local Inference Modeling、 Inference Composition、Prediction,接下来会分别对这四部分进行讲解。Input Encoding

我们先看一下这一层结构的输入内容,输入一般可以采用预训练好的词向量或者添加embedding层。接下来就是一个双向的LSTM,起作用主要在于对输入值做encoding,也可以理解为在做特征提取,最后把其隐藏状态的值保留下来。

其中i与j分别表示的是不同的时刻,a与b表示的是上文提到的p与h。

短文本与长文本匹配 python 短文本匹配模型_卷积_04

2.2 Local Inference Modeling

这一层的任务主要是把上一轮拿到的特征值做差异性计算。这里作者采用了attention机制,其中attention weight的计算方法如下:

短文本与长文本匹配 python 短文本匹配模型_短文本与长文本匹配 python_05


然后根据attention weight计算出a与b的权重加权后的值,计算方法如下:

短文本与长文本匹配 python 短文本匹配模型_卷积_06


得到encoding值与加权encoding值之后,下一步是分别对这两个值做差异性计算,作者认为这样的操作有助于模型效果的提升,论文有有两种计算方法,分别是对位相减与对位相乘,最后把encoding两个状态的值与相减、相乘的值拼接起来。

短文本与长文本匹配 python 短文本匹配模型_人工智能_07

2.3 Inference Composition

在这一层中,把之前的值再一次送到了BiLSTM中,这里的BiLSTM的作用和之前的并不一样,这里主要是用于捕获局部推理信息短文本与长文本匹配 python 短文本匹配模型_算法_08短文本与长文本匹配 python 短文本匹配模型_卷积_09及其上下文,以便进行推理组合。

最后把BiLSTM得到的值进行池化操作,分别是最大池化与平均池化,并把池化之后的值再一次的拼接起来。

短文本与长文本匹配 python 短文本匹配模型_人工智能_10

2.4 Prediction

最后把 V送入到全连接层,激活函数采用的是tanh,得到的结果送到softmax层。

2.5 小结

ESIM与BiMPM在相似度匹配任务中都是使用较多的模型,但是ESIM训练速度快,效果也并没有逊色太多,如果加入了语法树,其最终效果也能进一步的提升。

3 ABCNN

https://arxiv.org/pdf/1512.05193.pdf

以CNN与attention机制做文本匹配的模型即ABCNN。
在文本任务上,大部分模型均是采用以LSTM为主的结构,本文的作者采用了CNN的结构来提取特征,并用attention机制进行进一步的特征处理,作者一共提出了三种attention的建模方法,下文会详细介绍。

在开始讲解之前,我们简单说明下attention机制,例如我们有两个序列A与B,当我们需要进行相似度比较时,A序列某个时刻的值该和B序列哪个时刻比较最合适呢,而attention机制就是为了解决这个问题的,把B序列的每个时刻的值做了一个加权平均,用加权平均之后的值与A进行比较,说白了attention就是一个加权平均的过程,其中的权重就是BP过程中不断更新得到的。

论文中,作者分为了两个部分进行介绍,首先是没有attention仅有CNN的基础模型BCNN,后续又介绍了添加了attention的ABCNN,其中又分别介绍了三种模式,下文也会以该顺序进行讲解。

3.1 BCNN

BCNN的结构如下图所示

短文本与长文本匹配 python 短文本匹配模型_算法_11


可以看到BCNN包括四部分,分别是Input Layer、Convolution Layer、Average Pooling Layer、Output Layer,第一层为Input Layer,第二层与第三层为卷积与池化层,最后是用LR作为Output Layer

3.1.1 Input Layer

Input Layer即输入层,该层主要是做词嵌入,论文中作者采用的是word2vec的方法,当然,也可以采用glove等其他方法,或者直接输入one-hot,并添加embedding层。作者设置的词向量维度是300维,图中所示,左边序列是5个词维度为[5,300],右边序列是7个词维度为[7,300],注意这里作者输入的维度是不固定的,后续的池化层会将维度处理为一样的。

3.1.2 Convolution Layer

Convolution Layer即卷积层,在文本处理中,卷积核的大小通常为[n, embedding_size],n指的是节点的个数,可以理解为n-gram,从而从字/词特征中提取出短语特征,而这里的卷积层和大家平时使用的卷积还不太一样,这里采用了Wide Convolution宽卷积,我们看个图

短文本与长文本匹配 python 短文本匹配模型_深度学习_12


如果不做padding,边缘位置只被卷积了一次,可能损失信息,因此对边缘进行padding,使得边缘与其他位置卷积的次数相同。

3.1.3 Average Pooling Layer

Average Pooling Layer即平均池化层,仔细看,图中的第二层和第三层的池化层是不一样的,第二层的池化层是w-ap,第三层是all-ap,有什么区别呢,w-ap的核大小是可以自己定义的即[n, 300],,其操作过程类似卷积,只不过是取平均值,而all-ap的核大小是和输入的值的维度相同的,这样也就保证了输出的维度是[1, 300],从而使两个序列在比较的时候的值的维度是相同的。

3.1.4 Output Layer

Output Layer即输出层,很简单的LR做一个二分类,不再赘述。

这就是BCNN的全部内容,接下来我们看加了attention的BCNN即ABCNN

3.6 ABCNN

ABCNN作者提出了三种结构,我们分别讲解。

3.6.1 ABCNN-1

短文本与长文本匹配 python 短文本匹配模型_卷积_13


第一种attention的方法是对representation进行了处理,首先,针对两个不同的序列,生成attention matrix A,如图中所示,这个矩阵可以保存了序列0与序列1每一个词/字向量的相似度,论文中作者采用的是欧氏距离,其计算过程为短文本与长文本匹配 python 短文本匹配模型_算法_14,其中短文本与长文本匹配 python 短文本匹配模型_深度学习_15表示的是欧氏距离,还是以图中为例,0序列的长度是5,1序列的长度是7,我们需要计算的是0序列中5个节点分别与1序列的7个节点的相似度的值,所以A最终的维度是[5, 7],这个相似度的值我个人认为还可以采用余弦相似度或者直接两个矩阵相乘(归一化后的值直接相乘就是余弦相似度,所以两个矩阵直接相乘得到的结果理论上来说也可以表示相似度),不过论文中提到欧式距离效果更好一些。

attention matrix生成好后,就能计算attention feature了,计算方法是定义一个权重矩阵W,如图中所示0序列对应的是短文本与长文本匹配 python 短文本匹配模型_深度学习_16,1序列对应的是短文本与长文本匹配 python 短文本匹配模型_算法_17,W的维度为[d, s],d表示的是词/字向量维度,论文中是300,s表示的是序列长度,然后用这个权重矩阵和attention matrix相乘,所以最终的attention feature为

短文本与长文本匹配 python 短文本匹配模型_深度学习_18


最终得到的attention feature维度和representation feature的维度是相同的。

3.6.2 ABCNN-2

短文本与长文本匹配 python 短文本匹配模型_深度学习_19


第二种attention是对卷积之后的结果进行操作,attention matrix的生成方法和1的一样,生成完成后,会分别针对列与行进行求和,还是以图中为例,卷积0的维度为[7, 300],卷积1的维度为[9,300],matrix的维度是[7, 9],生成的求和权重为[7, 1]与[1, 9],之后的pooling的操作不是简单的求平均,而是换成了把对应的行和求和的权重进行对位相乘,所以最后池化后的结果维度和输入维度是相同的。

ABCNN1与ABCNN2有三个主要的区别

1是对卷积之前的值进行处理,2是对池化之前的值进行处理
1需要两个权重矩阵 短文本与长文本匹配 python 短文本匹配模型_深度学习_16短文本与长文本匹配 python 短文本匹配模型_算法_17,参数多一些,更容易过拟合,2不存在这个问题,由于池化是在卷积之后执行的,因此其处理的粒度单元比卷积大,在卷积阶段,获取到的是词/字向量,而池化层获取到的是短语向量,而这个短语向量的维度主要看卷积层的卷积核大小,因此,1和2其实是在不同的粒度上进行了处理。

ABCNN-3

短文本与长文本匹配 python 短文本匹配模型_算法_22


第三种方式就是把第一种和第二种方式结合起来

待更

4 BiMPM

5 DIIN

6 DRCN

7 SiaGRU

https://aaai.org/ocs/index.php/AAAI/AAAI16/paper/view/12195/12023

8 RE2

https://www.aclweb.org/anthology/P19-1465.pdf

对话匹配模型

Multi-view

短文本与长文本匹配 python 短文本匹配模型_人工智能_23


先CNN卷每个句子,然后使用LSTM卷每个句子的cnn后的表示过滤噪声,从而用最后一个时刻的隐状态作为表示,与回复经过卷积池化后的表示进行相似度计算,

短文本与长文本匹配 python 短文本匹配模型_人工智能_24


短文本与长文本匹配 python 短文本匹配模型_算法_25

SMN

交互,即与之前不同的是,之前的是将整个对话不论几句,都将所有句子处理完后形成一个表示,然后用这个表示与回复计算相似度,而交互的则是将回复的表示与对话中的每个句子均进行一个交互

短文本与长文本匹配 python 短文本匹配模型_人工智能_26


与Multi-view模型类似, 这里作者也考虑同事提取词汇级和语句级的特征, 分别得到两个匹配矩阵M1和M2, 具体的:

  • Word-Matching-M1: 对两句话的词做word embedding, 再用dot(ei,ej)计算矩阵元素
  • Utterance-Matching-M2: 对两句话的词做word embedding, 再过一层GRU提取隐状态变量h, 然后用dot(hi,A*hj)计算矩阵元素
    得到的两个匹配矩阵可视为两个通道, 再传给CNN+Pooling获得一组交互特征{vi}. 交互特征传入第二个GRU层, 得到{h’i}
    最后的预测层, 作者设计了三种利用隐变量{h’i}的方式:
  • last: 只用最后一个h’last传入softmax计算score
  • linearly combined: 将{h’i}线性加权传给softmax
  • attention: 利用attention机制计算{h’i}的权重
    作者的实验表明采用attention的SMN效果最好, 但训练相对最复杂, last最简单且效果基本优于linearly combined。

DAM

对于context和response语义上的联系更进一步,将 attention 应用于多轮对话,打破之前的 RNN 和 CNN 结构,在多轮上速度快,达到了目前最好效果。其次,本文使用 self-attention 和 cross-attention 来提取 response 和 context 的特征

短文本与长文本匹配 python 短文本匹配模型_短文本与长文本匹配 python_27


短文本与长文本匹配 python 短文本匹配模型_算法_28


短文本与长文本匹配 python 短文本匹配模型_人工智能_29