读了一篇文章,用到卷积神经网络的方法来进行文本分类,故写下一点自己的学习笔记:
本文在事先进行单词向量的学习的基础上,利用卷积神经网络(CNN)进行句子分类,然后通过微调学习任务特定的向量,提高性能。
在从无监督神经语言模型中获得单词向量(Tomas Mikolov等人做过相关工作,即谷歌的word2vector完成,将原始的1/V模型变化为分布式低维表示)后利用一层卷积层的CNN进行学习。
模型结构:
首先输入具有两个通道,分别对应static和non-static的方式,其中static方式表明单词向量不会随着训练过程而发生变化,我们可以采用各种各样的固定长度编码,包括one-hot(数据量很小的时候可以用),本文中采用的是google的word2vec的word embedding,将单词转化为维度固定的向量表达。
在卷积层当中,这里与图像识别中的CNN不同的是:这里的卷积核的宽度是一定的(即词向量的维数),而高度代表了词语的个数。例如h=3,即代表了3-gram的上下词信息,h=4,就代表4-gram的信息,h=n表示n-gram。每一个卷积核(Filter)的参数是共享的,代表着一个卷积核只能识别同一类特征。依次顺序往下扫描生成
然后在池化层的pooling采用max pooling,即将每一个Filter卷积得到列向量中的最大值ci取出来,其他的丢弃,因此能得到一个维度为X(X为Filter的数目,例如设置了h=3,4,5三个Filter,X就等于3)。这样做有一个好处,即文中原本只对单词进行了embedding,生成了维度固定的编码,但没有对文本进行这样的操作,因此没一段文本当中包含的单词数也是不同的,如果不进行maxpooling池化的话,会造成维度不一样的情况(实际上也可以对文本进行同维度编码,但是这样做有些复杂,又是一个研究方向了;另外也可以对文本进行padding,即设定一个固定的长度,多了就截掉,少了就补上,我在另外一篇字符级CNN的论文中看到这样的操作,就把长度设置为1014,认为能表达大部分的含义),在进行了maxpooling操作之后,从池化层出来的向量的维度统一变成了X。
经过一个池化层之后有一个全连接层,即通常的三层神经网络结构中隐层连接输出层的操作,采用softmax函数输出从属于不同类的分布概率,同时还加了一个dropout操作来防止过拟合,即对全连接层上的权值参数给予L2正则化的限制。
还要提到的一点就是前文所说的“两种通道”,实际上第一种通道就是static的,利用word2vec将单词统一编码,而另外一种通道就是non-static,这种方法中所有的单词向量并不是产生后就不发生变化的,而是在训练的过程中会被微调。
实际上本文的模型比较简单,但是实际效果非常好。在实验结果中可以看到non-static的方法大多数时候都是要比static方法稍好的,而static方法比rand的方法要好(rand是指word embedding过程中词的编码随机给出)。而结合static和non-static的multichannel方法相较于单纯的static和non-static方法,在较小的数据集上表现比他们都要好(因为这种混合的方法体现了一种折衷的想法,即不希望被微调的单词向量与原始产生的单词向量差距太大,也希望保持一定的动态变化空间)。