《Convolutional Neural Network Architectures for Matching Natural Language Sentences》句子匹配
模型结构与原理
1. 基于CNN的句子建模
这篇论文主要针对的是句子匹配(Sentence Matching)的问题,但是基础问题仍然是句子建模。首先,文中提出了一种基于CNN的句子建模网络,如下图:
图中灰色的部分表示对于长度较短的句子,其后面不足的部分填充的全是0值(Zero Padding)。可以看出,模型解决不同长度句子输入的方法是规定一个最大的可输入句子长度,然后长度不够的部分进行0值的填充;图中的卷积计算和传统的CNN卷积计算无异,而池化则是使用Max-Pooling。
- 卷积结构的分析
下图示意性地说明了卷积结构的作用,作者认为卷积的作用是从句子中提取出局部的语义组合信息,而多张Feature Map
则是从多种角度进行提取,也就是保证提取的语义组合的多样性;而池化的作用是对多种语义组合进行选择,过滤掉一些置信度低的组合(可能这样的组合语义上并无意义)。
2. 基于CNN的句子匹配模型
下面是基于之前的句子模型,建立的两种用于两个句子的匹配模型。
2.1 结构I
模型结构如下图:
简单来说,首先分别单独地对两个句子进行建模(使用上文中的句子模型),从而得到两个相同且固定长度的向量,向量表示句子经过建模后抽象得来的特征信息;然后,将这两个向量作为一个多层感知机(MLP)的输入,最后计算匹配的分数。
这个模型比较简单,但是有一个较大的缺点:两个句子在建模过程中是完全独立的,没有任何交互行为,一直到最后生成抽象的向量表示后才有交互行为(一起作为下一个模型的输入),这样做使得句子在抽象建模的过程中会丧失很多语义细节,同时过早地失去了句子间语义交互计算的机会。因此,推出了第二种模型结构。
2.2 结构II
模型结构如下图:
图中可以看出,这种结构提前了两个句子间的交互行为。
- 第一层卷积层
首先从Sentence x中任取一个向量xa,再从Sentence y中将每一个向量和xa进行卷积操作
同理以上操作,将两个句子中所有的向量两两组合,构成2D向量,构成Layer-2。下面给出数学形式化表述:
- 第一层卷积层后的Max-Pooling层
从而得到Layer-2,然后进行2×2的Max-pooling:
- 后续的卷积层
后续的卷积层均是传统的二维卷积操作,形式化表述如下:
- 二维卷积结果后的Pooling层
与第一层卷积层后的简单Max-Pooling方式不同,后续的卷积层的Pooling是一种动态Pooling方法,这种方法来源于参考文献[1]。
- 结构II的性质
- 保留了词序信息;
- 更具一般性,实际上结构I是结构II的一种特殊情况(取消指定的权值参数);
实验部分
1. 模型训练及参数
- 使用基于排序的自定义损失函数(Ranking-based Loss)
- BP反向传播+随机梯度下降;
- mini-batch为100-200,并行化;
- 为了防止过拟合,对于中型和大型数据集,会提前停止模型训练;而对于小型数据集,还会使用Dropout策略;
- Word2Vector:50维;英文语料为Wikipedia(~1B words),中文语料为微博数据(~300M words);
- 使用ReLu函数作为激活函数;
- 卷积窗口为3-word window;
- 使用Fine tuning;
2. 实验结果
一共做了三个实验,分别是(1)句子自动填充任务,(2)推文与评论的匹配,以及(3)同义句识别;结果如下面的图示:
其实结构I和结构II的结果相差不大,结构II稍好一些;而相比于其他的模型而言,结构I和结构II的优势还是较大的。