一、论文梗概:
提出了如何有效利用CNN进行句级别的分类任务进行了实验对比验证。
Introduction: 提到CNN用于NLP的背景,前人做过的工作,并且解释CNN应用在NLP任务上的合理性。
Model: 介绍了本文提出的有static和none-stati两种channel的用于句级别分类的CNN模型结构,并进行公式推演。
Datasets and Experimental Setup:介绍实验过程,具体到使用的数据集,模型训练细节,模型的对比实验。
Results and Discussion:本文提出的模型取得很好的结果,对比单通道模型,多通道模型所具备的优点,还有提出进一步改进。
Conclusion:一个使用了预训练单词向量的单层卷积简单CNN也可以表现得非常好。
二、论文详情:
1.模型结构:
(1)输入层:
输入层就是句子中词语对应的词向量依次从上到下排列的,比如有n个词,词向量的维度是K,则这个矩阵就是n*k的矩阵。
(2)卷积层:
输入层通过h*k的卷积核的卷积层之后得到列数为1的Feature Map,其中h表示纵向词语的个数,k表示词向量的维度。卷积之后通过激活函数f得到feature。记为ci。它是由xi:i+h−1相邻的h个词语卷积得到的值,再 activation 之后的值,也是当前层的输出。卷积之后的值:w⋅xi:i+h−1+b,输出的feature值ci=f(w⋅xi:i+h−1+b),也就是sentence embedding。一个 n 长度的sentence就有[x1:h,x2:h+1,x3:h+2,…,xn−h+1:n]这些 word windows,卷积后的结果就是 c = [c1,c2,…,cn−h+1],维度为(1,n-h+1)
(3)池化层:
使用最大池化 max pooling,选出最重要的 feature,最终提取出来成为一个一维向量。
(4)全连接层+softmax层:
池化之后的一维向量通过全连接的方式接入一个softmax层进行分类,并且在全连接部分使用Dropout,减少过拟合。
2.对Word Vector(Embedding Layer)的处理【tricks】
论文中的实验结果显示:
(1)随机初始化结果CNN-rand效果远不如使用预训练的词向量CNN-static,(我的理解是pre-training的word vector显然使用了更大规模的文本数据信息,通用的特征提取器,比如Google的Word2Vector工具,可以跨数据集使用。当然,换另一个更好的预训练词向量,效果也会进一步提高)
(2)在过程中Word Vector可以fine-tuned的CNN-non-static比Word Vector固定不变的CNN-static效果好,(我的理解是适当的Fine tune也是有利的,是因为使得vectors更加贴近于具体的任务)
(3)CNN-multichannel(CNN-static和CNN-non-static的混合版本,两种输入拼接)效果最好,(我的理解是体现了一种折中思想,即既不希望Fine tuned的vector距离原始值太远,但同时保留其一定的变化空间,有种残差网络的意思)
3.模型训练和调参
(1)使用了修正线性单元(Rectified linear units)
(2)滤波器的h大小:3,4,5;对应的Feature Map的数量为100;(本模型的优势:拥有更大的容量(多个过滤器宽度和特征图))【tricks】
(3)Dropout率为0.5,L2正则化限制权值大小不超过3;(Dropout被证明是一个非常好的正则化器)
(4)mini-batch的大小为50;
(5)这些参数的选择都是基于SST-2 dev数据集,通过网格搜索方法(Grid Search)得到的最优参数。【tricks】
(6)训练采用随机梯度下降方法,基于shuffled mini-batches之上的,使用了Adadelta update rule。【tricks】
4.在单词随机初始化上做文章【tricks】
对在word2vec中没有的单词随机初始化时,我们通过从U[-a, a]中采样每个维度,使随机初始化的向量与预先训练的向量具有相同的方差,从而获得了微小的改进。