之前的博文已经介绍了 CNN 的基本原理, 本文将大概总结一下最近 CNN 在 NLP 中的句子建模 (或者句子表示) 方面的应用情况, 主要阅读了以下的文献:
- Kim Y. Convolutional neural networks for sentence classification[J]. arXiv preprint arXiv:1408.5882, 2014.
- Kalchbrenner N, Grefenstette E, Blunsom P. A convolutional neural network for modelling sentences[J]. arXiv preprint arXiv:1404.2188, 2014.
- Hu B, Lu Z, Li H, et al. Convolutional neural network architectures for matching natural language sentences[C]//Advances in Neural Information Processing Systems. 2014: 2042-2050.
- He H, Gimpel K, Lin J. Multi-perspective sentence similarity modeling with convolutional neural networks[C]//Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing. 2015: 1576-1586.
- Wenpeng Yin, Hinrich Schütze. Convolutional Neural Network for Paraphrase Identification. The 2015 Conference of the North American Chapter of the Association for Computational Linguistics
- Zhang Y, Wallace B. A Sensitivity Analysis of (and Practitioners Guide to) Convolutional Neural Networks for Sentence Classification[J]. arXiv preprint arXiv:1510.03820, 2015.
下面对文献中 CNN 的结构和细节进行梳理
Kim Ys Paper
模型结构及原理
模型的结构如下:
说明如下:
输入层
如图所示, 输入层是句子中的词语对应的 word vector 依次 (从上到下) 排列的矩阵, 假设句子有 n 个词, vector 的维数为 k , 那么这个矩阵就是
n×k
的
这个矩阵的类型可以是静态的 (static), 也可以是动态的(non static) 静态就是 word vector 是固定不变的, 而动态则是在模型训练过程中, word vector 也当做是可优化的参数, 通常把反向误差传播导致 word vector 中值发生变化的这一过程称为 Fine tune
对于未登录词的 vector, 可以用 0 或者随机小的正数来填充
第一层卷积层
输入层通过卷积操作得到若干个 Feature Map, 卷积窗口的大小为
h×k
, 其中
h
表示纵向词语的个数, 而
k 表示 word vector 的维数通过这样一个大型的卷积窗口, 将得到若干个列数为 1 的 Feature Map
池化层
接下来的池化层, 文中用了一种称为
Max-over-time Pooling
的方法这种方法就是简单地从之前一维的 Feature Map 中提出最大的值, 文中解释最大值代表着最重要的信号可以看出, 这种 Pooling 方式可以解决可变长度的句子输入问题(因为不管 Feature Map 中有多少个值, 只需要提取其中的最大值)
最终池化层的输出为各个 Feature Map 的最大值们, 即一个一维的向量
全连接 + Softmax 层
池化层的一维向量的输出通过全连接的方式, 连接一个 Softmax 层, Softmax 层可根据任务的需要设置(通常反映着最终类别上的概率分布)
最终实现时, 我们可以在倒数第二层的全连接部分上使用 Dropout 技术, 即对全连接层上的权值参数给予 L2 正则化的限制这样做的好处是防止隐藏层单元自适应(或者对称), 从而减轻过拟合的程度
实验部分
1. 数据
实验用到的数据集如下(具体的名称和来源可以参考论文):
2. 模型训练和调参
修正线性单元(Rectified linear units)
滤波器的 h 大小: 3,4,5; 对应的 Feature Map 的数量为 100;
Dropout 率为 0.5,L2 正则化限制权值大小不超过 3;
mini-batch 的大小为 50;
这些参数的选择都是基于 SST-2 dev 数据集, 通过网格搜索方法 (Grid Search) 得到的最优参数另外, 训练过程中采用随机梯度下降方法, 基于 shuffled mini-batches 之上的, 使用了 Adadelta update rule(Zeiler, 2012)
3. 预训练的 Word Vector
这里的 word vector 使用的是公开的数据, 即连续词袋模型 (COW) 在 Google News 上的训练结果未登录次的 vector 值是随机初始化的
4. 实验结果
实验结果如下图:
其中, 前四个模型是上文中所提出的基本模型的各个变种:
CNN-rand: 所有的 word vector 都是随机初始化的, 同时当做训练过程中优化的参数;
CNN-static: 所有的 word vector 直接使用无监督学习即 Google 的 Word2Vector 工具 (COW 模型) 得到的结果, 并且是固定不变的;
CNN-non-static: 所有的 word vector 直接使用无监督学习即 Google 的 Word2Vector 工具 (COW 模型) 得到的结果, 但是会在训练过程中被 Fine tuned;
CNN-multichannel: CNN-static 和 CNN-non-static 的混合版本, 即两种类型的输入;
博主自己下载了论文作者的实现程序(Github 地址), 最终在 MR 数据集上的运行结果如下:
- CNN-rand: 0.7669
- CNN-static: 0.8076
- CNN-non-static: 0.8151
和论文中的结果差不多
5. 结论
CNN-static 较与 CNN-rand 好, 说明 pre-training 的 word vector 确实有较大的提升作用(这也难怪, 因为 pre-training 的 word vector 显然利用了更大规模的文本数据信息);
CNN-non-static 较于 CNN-static 大部分要好, 说明适当的 Fine tune 也是有利的, 是因为使得 vectors 更加贴近于具体的任务;
CNN-multichannel 较于 CNN-single 在小规模的数据集上有更好的表现, 实际上 CNN-multichannel 体现了一种折中思想, 即既不希望 Fine tuned 的 vector 距离原始值太远, 但同时保留其一定的变化空间
值得注意的是, static 的 vector 和 non-static 的相比, 有一些有意思的现象如下表格:
原始的 word2vector 训练结果中, bad 对应的最相近词为 good, 原因是这两个词在句法上的使用是极其类似的(可以简单替换, 不会出现语句毛病); 而在 non-static 的版本中, bad 对应的最相近词为 terrible, 这是因为在 Fune tune 的过程中, vector 的值发生改变从而更加贴切数据集(是一个情感分类的数据集), 所以在情感表达的角度这两个词会更加接近;
句子中的! 最接近一些表达形式较为激进的词汇, 如 lush 等; 而, 则接近于一些连接词, 这和我们的主观感受也是相符的
Kim Y 的这个模型很简单, 但是却有着很好的性能后续 Denny 用 TensorFlow 实现了这个模型的简单版本, 可参考这篇博文; 以及 Ye Zhang 等人对这个模型进行了大量的实验, 并给出了调参的建议, 可参考这篇论文
下面总结一下 Ye Zhang 等人基于 Kim Y 的模型做了大量的调参实验之后的结论:
由于模型训练过程中的随机性因素, 如随机初始化的权重参数, mini-batch, 随机梯度下降优化算法等, 造成模型在数据集上的结果有一定的浮动, 如准确率 (accuracy) 能达到 1.5% 的浮动, 而 AUC 则有 3.4% 的浮动;
词向量是使用 word2vec 还是 GloVe, 对实验结果有一定的影响, 具体哪个更好依赖于任务本身;
Filter 的大小对模型性能有较大的影响, 并且 Filter 的参数应该是可以更新的;
Feature Map 的数量也有一定影响, 但是需要兼顾模型的训练效率;
1-max pooling 的方式已经足够好了, 相比于其他的 pooling 方式而言;
正则化的作用微乎其微
Ye Zhang 等人给予模型调参者的建议如下:
使用 non-static 版本的 word2vec 或者 GloVe 要比单纯的
one-hot representation
取得的效果好得多;
为了找到最优的过滤器 (Filter) 大小, 可以使用线性搜索的方法通常过滤器的大小范围在 1-10 之间, 当然对于长句, 使用更大的过滤器也是有必要的;
Feature Map 的数量在 100-600 之间;
可以尽量多尝试激活函数, 实验发现 ReLU 和 tanh 两种激活函数表现较佳;
使用简单的 1-max pooling 就已经足够了, 可以没必要设置太复杂的 pooling 方式;
当发现增加 Feature Map 的数量使得模型的性能下降时, 可以考虑增大正则的力度, 如调高 dropout 的概率;
为了检验模型的性能水平, 多次反复的交叉验证是必要的, 这可以确保模型的高性能并不是偶然
论文附录中还附上了各种调参结果, 感兴趣的可以前往阅读之
Kalchbrenners Paper
Kal 的这篇文章引用次数较高, 他提出了一种名为 DCNN(Dynamic Convolutional Neural Network)的网络模型, 在上一篇 (Kims Paper) 中的实验结果部分也验证了这种模型的有效性这个模型的精妙之处在于 Pooling 的方式, 使用了一种称为动态 Pooling 的方法
下图是这个模型对句子语义建模的过程, 可以看到底层通过组合邻近的词语信息, 逐步向上传递, 上层则又组合新的 Phrase 信息, 从而使得句子中即使相离较远的词语也有交互行为 (或者某种语义联系) 从直观上来看, 这个模型能够通过词语的组合, 提取出句子中重要的语义信息(通过 Pooling), 某种意义上来说, 层次结构的 feature graph 的作用类似于一棵语法解析树
DCNN 能够处理可变长度的输入, 网络中包含两种类型的层, 分别是一维的卷积层和动态 k-max 的池化层 (Dynamic k-max pooling) 其中, 动态 k-max 池化是最大化池化更一般的形式之前 LeCun 将 CNN 的池化操作定义为一种非线性的抽样方式, 返回一堆数中的最大值, 原话如下:
The max pooling operator is a non-linear subsampling function that returns the maximum of a set of values (LuCun et al., 1998).
而文中的 k-max pooling 方式的一般化体现在:
pooling 的结果不是返回一个最大值, 而是返回 k 组最大值, 这些最大值是原输入的一个子序列;
pooling 中的参数 k 可以是一个动态函数, 具体的值依赖于输入或者网络的其他参数;
模型结构及原理
DCNN 的网络结构如下图:
网络中的卷积层使用了一种称之为
宽卷积(Wide Convolution)
的方式, 紧接着是动态的 k-max 池化层中间卷积层的输出即 Feature Map 的大小会根据输入句子的长度而变化下面讲解一下这些操作的具体细节:
1. 宽卷积
相比于传统的卷积操作, 宽卷积的输出的 Feature Map 的宽度 (width) 会更宽, 原因是卷积窗口并不需要覆盖所有的输入值, 也可以是部分输入值 (可以认为此时其余的输入值为 0, 即填充 0) 如下图所示:
图中的右图即表示宽卷积的计算过程, 当计算第一个节点即
s1
时, 可以假使
s1
s1 节点前面有四个输入值为 0 的节点参与卷积 (卷积窗口为 5) 明显看出, 狭义上的卷积输出结果是宽卷积输出结果的一个子集
2. k-max 池化
给出数学形式化的表述是, 给定一个
k
值, 和一个序列
pRp
(其中
pk
),k-max pooling 选择了序列
p
中的前
k 个最大值, 这些最大值保留原来序列的次序(实际上是原序列的一个子序列)
k-max pooling 的好处在于, 既提取除了句子中的较重要信息 (不止一个), 同时保留了它们的次序信息(相对位置) 同时, 由于应用在最后的卷积层上只需要提取出 k 个值, 所以这种方法允许不同长度的输入 (输入的长度应该要大于 k) 然而, 对于中间的卷积层而言, 池化的参数
k 不是固定的, 具体的选择方法见下面的介绍
3. 动态 k-max 池化
动态 k-max 池化操作, 其中的
k 是输入句子长度和网络深度两个参数的函数, 具体如下:
- K
- l
- =
- max
- (
- k
- t
- o
- p
- ,
- L
- lLs)
其中
l
l 表示当前卷积的层数(即第几个卷积层),
L
是网络中总共卷积层的层数;
k
top
为最顶层的卷积层 pooling 对应的
k 值, 是一个固定的值举个例子, 例如网络中有三个卷积层,
k
top=3
ktop=3, 输入的句子长度为 18; 那么, 对于第一层卷积层下面的 pooling 参数
k
1=12
, 而第二层卷积层对于的为
k
2=6
, 而
k
3
=
k
top=3
动态 k-max 池化的意义在于, 从不同长度的句子中提取出相应数量的语义特征信息, 以保证后续的卷积层的统一性
4. 非线性特征函数
pooling 层与下一个卷积层之间, 是通过与一些权值参数相乘后, 加上某个偏置参数而来的, 这与传统的 CNN 模型是一样的
5. 多个 Feature Map
和传统的 CNN 一样, 会提出多个 Feature Map 以保证提取特征的多样性
6. 折叠操作(Folding)
之前的宽卷积是在输入矩阵
d×s
中的每一行内进行计算操作, 其中 d 是 word vector 的维数, s 是输入句子的词语数量而 Folding 操作则是考虑相邻的两行之间的某种联系, 方式也很简单, 就是将两行的 vector 相加; 该操作没有增加参数数量, 但是提前 (在最后的全连接层之前) 考虑了特征矩阵中行与行之间的某种关联
模型的特点
保留了句子中词序信息和词语之间的相对位置;
宽卷积的结果是传统卷积的一个扩展, 某种意义上, 也是 n-gram 的一个扩展;
模型不需要任何的先验知识, 例如句法依存树等, 并且模型考虑了句子中相隔较远的词语之间的语义信息;
实验部分
1. 模型训练及参数
输出层是一个类别概率分布(即 softmax), 与倒数第二层全连接;
代价函数为交叉熵, 训练目标是最小化代价函数;
L2 正则化;
优化方法: mini-batch + gradient-based (使用 Adagrad update rule, Duchi et al., 2011)
2. 实验结果
在三个数据集上进行了实验, 分别是 (1) 电影评论数据集上的情感识别,(2)TREC 问题分类, 以及(3)Twitter 数据集上的情感识别结果如下图:
可以看出, DCNN 的性能非常好, 几乎不逊色于传统的模型; 而且, DCNN 的好处在于不需要任何的先验信息输入, 也不需要构造非常复杂的人工特征
Hus Paper
模型结构与原理
1. 基于 CNN 的句子建模
这篇论文主要针对的是句子匹配 (Sentence Matching) 的问题, 但是基础问题仍然是句子建模首先, 文中提出了一种基于 CNN 的句子建模网络, 如下图:
图中灰色的部分表示对于长度较短的句子, 其后面不足的部分填充的全是 0 值 (Zero Padding) 可以看出, 模型解决不同长度句子输入的方法是规定一个最大的可输入句子长度, 然后长度不够的部分进行 0 值的填充; 图中的卷积计算和传统的 CNN 卷积计算无异, 而池化则是使用 Max-Pooling
卷积结构的分析
下图示意性地说明了卷积结构的作用, 作者认为卷积的作用是从句子中提取出局部的语义组合信息, 而多张 Feature Map 则是从多种角度进行提取, 也就是保证提取的语义组合的多样性; 而池化的作用是对多种语义组合进行选择, 过滤掉一些置信度低的组合(可能这样的组合语义上并无意义)
2. 基于 CNN 的句子匹配模型
下面是基于之前的句子模型, 建立的两种用于两个句子的匹配模型
2.1 结构 I
模型结构如下图:
简单来说, 首先分别单独地对两个句子进行建模 (使用上文中的句子模型), 从而得到两个相同且固定长度的向量, 向量表示句子经过建模后抽象得来的特征信息; 然后, 将这两个向量作为一个多层感知机(MLP) 的输入, 最后计算匹配的分数
这个模型比较简单, 但是有一个较大的缺点: 两个句子在建模过程中是完全独立的, 没有任何交互行为, 一直到最后生成抽象的向量表示后才有交互行为(一起作为下一个模型的输入), 这样做使得句子在抽象建模的过程中会丧失很多语义细节, 同时过早地失去了句子间语义交互计算的机会因此, 推出了第二种模型结构
2.2 结构 II
模型结构如下图:
图中可以看出, 这种结构提前了两个句子间的交互行为
第一层卷积层
第一层中, 首先取一个固定的卷积窗口
k1
, 然后遍历
Sx
和
Sy
中所有组合的二维矩阵进行卷积, 每一个二维矩阵输出一个值(文中把这个称作为一维卷积, 因为实际上是把组合中所有词语的 vector 排成一行进行的卷积计算), 构成 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 的优势还是较大的
Hes Paper
第四篇论文即 He 的文章中所提出的模型, 是所有基于 NN 的模型中, 在 Paraphrase identification 任务标准数据集 MSRP 上效果最佳的下面我们来学习一下这个模型
模型结构与原理
模型主要分为两个部分:
句子的表征模型: 得到句子的表征(representation), 以供后续的相似度计算;
相似度计算模型: 使用多种相似度计算方法, 针对句子表征后的局部进行相应的计算;
模型不需要借助 WordNet, 句法解析树等资源; 但是可以选择性地使用词性标注 word embedding 等方法来增强模型的性能; 与之前的模型区别在于, 文中的模型使用了多种类型的卷积池化方法, 以及针对得到的句子表征的局部进行相应的相似度计算(这样做的优点在于能够更加充分地挖掘出句子中的特征信息, 从而提升性能, 但同时使得模型变得复杂耗时)
模型的整体框架如下:
下面具体看看这两个模型是如何实现的
句子的表征模型
模型是基于 CNN 的, 卷积层有两种卷积方式, 池化层则有三种
卷积层
假设模型的输入为二维矩阵
- Sent
- ,
- S
- e
- n
- t
- R
- l
- e
n×Dim
, 其中
len
len 表示句子切分为 Token List 后的长度(Token 可以是词 / 字),
Dim
表示 Token 的 Embedding 表示的维度由此有
S
e
n
ti
表示矩阵的第 i 行, 即输入中的第 i 个 Token 的 Embedding 表示;
S
e
n
t
i:j
表示矩阵中的第 i 到第 j 行的一个切片, 也是一个子矩阵; Senti[k] 表示矩阵的第 i 行第 k 列的值, 对应是 Embedding 的第 k 个值; 而
Senti:j[k] 则是矩阵中第
i
行到第
j
行中的第
k 列的一个切片
卷积层有两种卷积的方式:(1)粒度为 word 的卷积;(2)粒度为 embedding 维度上的卷积如下图:
其中, 第一种卷积方式与之前的 Kim Y 提出模型中的相同, 相当于是 n-gram 特征的抽取; 而对于第二种卷积方式, 论文作者给出的解释是,(1)这种方式有助于充分地提取出输入的特征信息;(2)由于粒度更小, 所以在学习过程中的参数调整上, 每一个维度能够得到不同程度的参数调整(第二种卷积方式从直观上没有太多的物理意义, 而作者也是直说不能够给出符合人直观想法上的解释)
池化层
模型除了使用传统的 max-pooling, 还使用了 min-pooling 和 mean-pooling 方式
假设
- g
- r
- o
- u
- p
- (
- w
- s
- ,
- p
- o
- o
- l
- i
- n
- g
- ,
- sent)
表示卷积宽度为
ws
, 使用
p
o
oling
池化函数, 应用在输入的句子
sent
上我们使用了两种类型的 building block, 分别是
b
l
o
c
kA
和
b
l
o
c
kB
上, 定义如下
- b
- l
- o
- c
- k
- A
- =
- {
- g
- r
- o
- u
- p
- A
- (
- w
- s
- a
- ,
- p
- ,
- s
- e
- n
- t
- )
- :
- p
- m
- a
- x
- ,
- m
- i
- n
- ,
- mean}
这里
b
l
o
c
kA
有三组卷积层, 卷积窗口的宽度一致(都是
w
sa
), 每一组对应一种池化操作这里池化操作和卷积层是一一对应的, 也就是说并不是一个卷积层上实施三种池化操作(虽然也可以这么做, 作者没有这么做的原因是由于激活函数的存在, 对每个卷积结果都进行 max-pooling 和 min-pooling 是没有必要的)
而
b
l
o
c
kB
的定义如下:
- b
- l
- o
- c
- k
- B
- =
- {
- g
- r
- o
- u
- p
- B
- (
- w
- s
- b
- ,
- p
- ,
- s
- e
- n
- t
- )
- :
- p
- m
- a
- x
- ,min}
这里
b
l
o
c
kB
有两组卷积层, 卷积窗口的宽度为
w
sb
, 两组分别对应 max-pooling 和 min-pooling 的操作值得说明的是,
- g
- r
- o
- u
- p
- B()
中的卷积层对应有
Dim
个以 embedding dimension 为粒度的卷积窗口, 也就是对 embedding 的每一维度做卷积运算
这里只所以要组合这些多样的卷积和池化操作, 原因是希望能够从多个方面来提取出输入中的特征信息, 以供后续的决策任务
多种窗口尺寸
与传统的 n-gram 模型相似, 这里在 building block 中使用了多种尺寸的卷积窗口如下图所示:
其中
ws
ws 表示卷积时卷积的 n-gram 长度, 而
ws=
ws= 表示卷积窗口为整个 word embedding 矩阵
wsws 的值及 Feature Map 的数量都是需要调参的
相似度计算模型
下面介绍在得到句子的表征向量之后, 如何计算它们的相似度直观的想法是, 我们可以使用传统的相似度计算方法如余弦相似度等来计算两个句子向量的相似度但是, 直接应用这种做法在两个句子向量上并不是最优的, 原因在于最后生成的句子向量中的每一个部分的意义各不相同, 这样简单粗暴的计算势必会影响效果, 所以做法是对句子向量中的各个部分进行相应的比较和计算 (Structured Comparision) 为了使得句子向量中的局部间的比较和计算更加有效, 我们需要考虑如下方面:
(1) 是否来自相同的 building block;
(2) 是否来自相同卷积窗口大小下的卷积结果;
(3) 是否来自相同的 pooling 层;
(4) 是否来自相同的 Feature Map;
最终比较句子中的相应部分时, 需要至少满足以上两个条件为了识别句子中的哪些对应部分需要参与到相似度计算, 文中提供了两种算法
2.1. 相似度计算单元(Unit)
两种相似度计算单元如下:
2.2. 基于句子局部的相似度计算
算法 1 和算法 2 为句子表征向量的两种计算方法, 其中算法 1 仅用在
b
l
o
c
kA
blockA 上; 而算法 2 则都用在
b
l
o
c
kA
blockA 和
b
l
o
c
kB
blockB 上, 两种算法都是针对相同类型 (pooling 和 block 类型) 的输出做局部比较
给出如下的符号假设:
算法的伪代码如下:
下面的图示说明了在
b
l
o
c
kA
上, 两种算法的计算方式的区别, 算法一表现了向量在水平方向上的比较; 而算法二则是在垂直方向
需要注意的是, 在算法二中相同类型的 pooling 的输出 groups 中, 向量是两两进行比较的(图中的红色虚线只是为了说明比较的方向, 并不是只针对 group 中相同大小的卷积窗口作比较); 而算法一中的每一行都要作比较, 不仅仅是第一行
模型的其他细节
相似度向量输出 + 全连接层
基于句子局部的相似度计算之后, 得到相应的相似度向量; 然后这组向量之后连接一个全连接层, 最后 softmax 对应输出如果是计算相似度度量值, 可以用 softmax 输出的类别概率值
激活函数
使用 tanh 函数作为激活函数
实验部分
实验数据集
Microsoft Research Paraphrase Corpus (MSRP)
用于评测同义句检测 (Paraphrase Identification) 任务的经典数据集, 数据集来源于新闻; 包含 5801 对句子对, 其中 4076 对用于模型训练, 而 1725 对用于测试; 每一对句子拥有一个标签, 0 或者 1,0 表示两个句子不是互为同义句, 而 1 则表示两个句子互为同义句因此这是一个二分类的任务
Sentences Involving Compositional Knowledge (SICK)
数据来源于 2014 年 SemEval 比赛, 数据集有 9927 对句子对, 其中 4500 对用于模型训练, 500 对用于模型验证, 而剩下的 4927 对用于模型测试这些句子都是在图片和视频描述中抽取得到的, 每一对句子对有一个相关分数, 区间在[1, 5], 分数越高表示句子越相关
Microsoft Video Paraphrase Corpus (MSRVID)
数据集来源于 2012 年的 SemEval 比赛, 包含 1500 对短文本 (用于描述视频信息) 其中一般用于模型训练, 一半用于模型测试, 每一对句子有一个相关性分数, 区间在[0, 5], 分数越高表示句子越相关
模型训练
针对 MSRP 和其他两个数据集, 分别使用两种损失函数对于 MSRP 数据集, 损失函数 (Hinge Loss) 如下:
对于其余两个数据集, 损失函数 (KL-divergence Loss) 如下:
实验参数设置
wsws 的值
:
w
s
[1,3]
ws[1,3]和
ws=
ws=.
Word Embedding: 300 维的
GloVe word embedding
; 对于 MSRP 数据集, 还额外使用了 200 维的 POS embedding (Standford POS tagger)和 25 维的 Paragram Vectors (Wieting et al., 2015 PDF, 数据下载地址)因此对于 MSRP 任务而言, word embedding 的维数为 525 维 (200+300+25); 而其余两个任务则对应是 300 维
在 MSRP 上使用了 5 - 折交叉验证的方式, 对模型参数进行 tuning. Tuning 好的模型参数将会用在另外两个数据集任务上
只有在 MSRP 数据集任务上, 允许模型参数进行更新
输出的全连接层, MSRP 有 250 个神经元节点, 而 SICK 和 MSRVID 则是 150 个
在
b
l
o
c
kA
blockA 中, Feature Map 的数量与输入的 embedding 维数相同, 即 MSRP 是 525 个, 而 SICK 和 MSRVID 则是 300 个
优化算法使用随机梯度下降方法
学习率为 0.01, 而正则化参数
λ
=
104
λ=104.
实验结果
MSRP 数据集
可以看出, 文中的模型是所有基于 NN 的方法中在 MSRP 数据集上性能最好的
SICK 数据集
MSRVID 数据集
而模型在 SICK 和 MSRVID 数据集上的表现也很好
模型的敏感度分析
下面的表格说明了在不使用某种技术下, 模型性能在实验数据集上的变化情况
从中可以得出以下结论:
对于 MSRP 数据集任务而言, 增加 POS Embedding 和 Paragram Vector 效果显著;
移除相似度计算层的影响显著, 说明结构化的句子局部比较方法是有效且必要的;
Horizontal 和 Vertical 算法均有一定的提升效果, 而 Vertical 算法的提升程度更高;
max-pooling 方式确实要比 min-pooling 和 mean-pooling 强太多
总结
文中的模型包含两个部分: 卷积 - 池化模型和相似度计算模型实验部分已经验证了模型的有效性, 在 MSRP 数据集上模型取得了仅次于 state-of-art 的结果, 并且在基于 NN 的方法中是最好的模型中的相似度计算层是有必要的, 因为对卷积池化处理后的句子成分进行了针对性的比较, 从直观上要比直接扔进全连接层更合理, 而实验结果也表明了这一点
然而, 个人觉得, 文中的模型结构较为复杂, 而且其中有很多 trick 的地方, 比如为什么要对 word embedding 中的每一维度做卷积,
b
l
o
c
kB
blockB 中的 pooling 方式为什么只用了 max 和 min, 不用 mean 的方式等问题, 而这些方式或许是作者自己做了大量实验后, 从果到因而使用的
Yins Paper
Yin 的这篇论文提出了一种叫 Bi-CNN-MI 的架构, 其中 Bi-CNN 表示两个使用 Siamese 框架的 CNN 模型; MI 表示多粒度的交互特征 Bi-CNN-MI 包含三个部分:
句子分析模型 (CNN-SM)
这部分模型主要使用了上述 Kal 在 2014 年提出的模型, 针对句子本身提取出四种粒度的特征表示: 词短 ngram 长 ngram 和句子粒度多种粒度的特征表示是非常必要的, 一方面提高模型的性能, 另一方面增强模型的鲁棒性
句子交互计算模型 (CNN-IM)
这部分模型主要是基于 2011 年 Socher 提出的 RAE 模型, 做了一些简化, 即仅对同一种粒度下的提取特征做两两比较
LR 或 Softmax 网络层以适配任务
模型结构
论文提出的模型主要是基于 Kal 的模型及 Socher 的 RAE 模型的结合体, 如下图:
通过模型图可以看出模型的主要思想: 一方面利用 Kal 的模型进行多种粒度上的特征提取, 另一方面采取 RAE 模型的思想, 对提取出来的特征进行两两的相似度计算, 计算完成的结果通过 dynamic pooling 的方式进一步提取少量特征, 然后各个层次的 pooling 计算结果平摊为一组向量, 通过全连接的方式与 LR(或者 softmax)层连接, 从而适配同义句检测任务本身
这个模型具体的计算细节不再赘述了, 感兴趣的读者可以直接去看论文除了提出这种模型结构之外, 论文还有一个亮点在于使用了一种类似于语言模型的 CNN-LM 来对上述 CNN 部分的模型进行预训练, 从而提前确定模型的参数 CNN-LM 的网络结构如下图:
CNN-LM 模型的训练预料使用了最终的实验数据集, 即 MSRP; 另外, 由于 MSRP 的数据规模较小, 所以作者又增加了 100,000 个英文句子语料 CNN-LM 模型最终能够得到 word embedding, 模型权值等参数需要注意的是, 这些参数并不是固定的, 在之后的句子匹配任务中是会不断更新的从后面的实验结果中可以看出, CNN-LM 的作用是显著的
实验结果
论文仅使用了一种数据集, 即公认的 PI (Paraphrase Identification)任务数据集, MSRP 实验结果如下:
可以看出, CNN-LM 的预训练效果显著, 预训练后的模型性能很强(但是结果上比之前 He 提出的模型稍差一些)
本文结束, 感谢欣赏
- A Sensitivity Analysis of (and Practitioners Guide to) Convolutional Neural Networks for Sentence Classification
- Implementing a CNN for Text Classification in TensorFlow
- Kim Ys Implement: Convolutional Neural Networks for Sentence Classification
来源: https://www.cnblogs.com/bentuwuying/p/8480045.html