Convolutional Neural Networks for Sentence Classification 的 原文,本文将CNN和NLP结合;
介绍了一系列的对比实验,实验结果证明了:
另外,对cnn模型进行了小改动:将static vectors和non static vectors变成cnn模型中的两个channels,类似于图像中的rgb三通道。
卷积之后得到的列向量维度也是不同的,可以通过pooling来消除句子之间长度不同的差异
当手头上没有large supervised training dataset的时候,用word2vec(或相似的unsupervised nlp模型得到)初始化word vectors能提高performance。
这是本文的模型,基本也就是CNN的结构,可以看出TextCNN由输入层,卷积层,最大池化层,全连接层等四层构成。
一般由是onehot处理后的非负整数构成的向量,这里使用word2vec预训练好的词向量构建(或者随机初始化)。一般都会定义最大文本长度(25啊,50啊什么的),padding实现;
上图中是双通道2*3=6个卷积核,卷积核大小为 卷积大小(n-gram) * 词向量维度(embed) = 2 * 300 = 600,一般卷积大小设2,3,4,5等。论文中实现的是
a. CNN-rand(随机初始化词向量);
b.CNN-static(word2vec预训练词向量,训练过程中不变);
c. CNN-no-static(word2vec预训练词向量,训练过程中微调);
d. CNN-multichannel(多个通道,论文中使用的是双通道,即b和c)
w是权重,b是偏移量,f就是一个非线性函数,即激活函数。
形成这个向量,称为feature map。我们可以通过改变h的大小,生成很多feature maps。
现在一般不直接用词向量,会构建Embedding层嵌入。
池化层工作与卷积层大同小异,不同于卷积层将卷积核中数据相加;池化层的池化核将池化核中数据求平均或者是只保留最大值。
论文中采用的是最大池化,然后级联。
最大池化层:对于每个feature map,采取选出这个向量中的最大值(意在找到最重要的特征),同时也解决了每个feature map不等长,统一了维度的问题。
也叫输出层,是池化后级联,再使用图像领域中首先提出的的dropout,防止过拟合(也可加l2正则化b),然后使用激活函数分类输出。
然后再将这个传递到 全连接层:这是一个softmax层(因为涉及到句子的分类问题),输出的就是对于不同的label的概率分布
由于数据集相对较小,很容易就会发生过拟合现象,所以这里引如dropout来减少过拟合现象。
也就是产生一定的概率来mask掉一些点。
CNN-rand : 所有的word vector都是随机初始化的,在训练过程中更新
CNN-static : word vector用word2vec得出的结果,在整个train process中所有的words保持不变,只学习其他参数
CNN-non-static : pretrained vector在训练过程中要被fine-tuned
CNN-multichannel : two sets of word vectors. 初始化时两个channel都直接赋值word2vec得出的结果,每个filter也会分别applied到两个channel,但是训练过程中只有一个channel会进行BP
模型中除了这些参数改变,其他参数相同。
模型根据词向量的不同分为四种:
CNN-rand,所有的词向量都随机初始化,并且作为模型参数进行训练。
CNN-static,即用word2vec预训练好的向量(Google News),在训练过程中不更新词向量,句中若有单词不在预训练好的词典中,则用随机数来代替。
CNN-non-static,根据不同的分类任务,进行相应的词向量预训练。
CNN-multichannel,两套词向量构造出的句子矩阵作为两个通道,在误差反向传播时,只更新一组词向量,保持另外一组不变。
在七组数据集上进行了对比实验,证明了单层的CNN在文本分类任务中的有效性,同时也说明了用无监督学习来的词向量对于很多nlp任务都非常有意义。
static模型中word2vec预训练出的词向量会把good和bad当做相似的词,在sentiment classification任务中将会导致错误的结果,而non-static模型因为用了当前task dataset作为训练数据,不会存在这样的问题。具体可参看下图:
one channel将word2vec得到的结果直接static的传入整个模型,另一个channel在BP训练过程中要进行fine-tune。每一个filter都要分别应用到这两个channels上。
例如上图中就能看出,系统有2 filters,对2个channels分别卷积后得到4 stacks。
这里用到了dropout和l2正则项,避免过拟合。
dropout就是将pooling之后的结果随机mask一部分值。
比如,我们在这里pooling之后的结果是z,我们将z处理成y之后向前传递的时候,然后我们就做一个 and 操作。
每一次梯度下降,调整参数的时候,依靠这个阈值s来约束中间的参数。
一句话,non-static更适应specific task
CNN在NLP的一个尝试,并且效果还不错。
同时证明了,pre-trained的word vector 是deep learning在NLP领域重要的组成部分
注意到:一个卷积核对于一个句子,convolution后得到的是一个vector;max-pooling后,得到的是一个scalar。
[1] Convolutional Neural Networks for Sentence Classification
[2] Convolutional Neural Networks for Sentence Classification论文解读
[3] 中文短文本分类实例三-TextCNN(Convolutional Neural Networks for Sentence Classification)