讲解 TextCNN 的模型结构:依次经过嵌入层、一维卷积层、最大池化层、全连接层与 softmax,利用卷积和池化抽取关键词特征来完成句子分类,并说明多通道设置与不同卷积核尺寸的作用。
Convolutional Neural Networks for Sentence Classification
文本分类的关键在于准确提炼文档或者句子的中心思想,而提炼中心思想的方法是抽取文档或句子的关键词作为特征,基于这些特征去训练分类器并分类。因为CNN的卷积和池化过程就是一个抽取特征的过程,当我们可以准确抽取关键词的特征时,就能准确的提炼出文档或句子的中心思想。
text-CNN模型

论文使用的模型主要包括五层,第一层是embedding layer,第二层是convolutional layer,第三层是max-pooling layer,第四层是fully connected layer,最后一层是softmax layer.

输入层
首先输入一个一维的由7个单词构成的句子,为了使其可以进行卷积,首先需要将其转化为二维矩阵表示,通常使用word2vec、glove等word embedding实现。d=5表示每个词转化为5维的向量,矩阵的形状是[sentence_matrix × 5],即[7 × 5]。
卷积层
在处理图像数据时,CNN使用的卷积核的宽度和高度的一样的,但是在text-CNN中,卷积核的宽度是与词向量的维度一致。这是因为我们输入的每一行向量代表一个词,在抽取特征的过程中,词做为文本的最小粒度,如果我们使用卷积核的宽度小于词向量的维度就已经不是以词作为最小粒度了。而高度和CNN一样,可以自行设置(通常取值2,3,4,5)。由于我们的输入是一个句子,句子中相邻的词之间关联性很高,因此,当我们用卷积核进行卷积时,不仅考虑了词义而且考虑了词序及其上下文。(类似于skip-gram和CBOW模型的思想)。
详细讲解卷积的过程:卷积层输入的是一个表示句子的矩阵,维度为n*d,即每句话共有n个词,每个词有一个d维的词向量表示。假设Xi:i+j表示Xi到Xi+j个词,使用一个宽度为d,高度为h的卷积核W与Xi:i+h-1(h个词)进行卷积操作后再使用激活函数激活得到相应的特征ci,则卷积操作可以表示为:(使用点乘来表示卷积操作)

因此经过卷积操作之后,可以得到一个n-h+1维的向量c形如:

以上是一个卷积核与输入句子的卷积操作,同样的,我们也可以使用更多高度不同的卷积核,且每个高度的卷积核多个,得到更多不同特征。
如上图,这里有(2,3,4)三种size,每种size有两个filter,一共有6个filter。然后开始卷积,从图中可以看出,stride是1,对于高是4的filter,最后生成4维的向量,(7-4)/1+1=4。对于高是3的filter,最后生成5维的向量,(7-3)/1+1=5。
池化层
池化的特点之一就是它输出一个固定大小的矩阵,还能降低输出结果的维度,(理想情况下)却能保留显著的特征。
因为在卷积层过程中我们使用了不同高度的卷积核,使得我们通过卷积层后得到的向量维度会不一致,所以在池化层中,我们使用1-Max-pooling对每个特征向量池化成一个值,即抽取每个特征向量的最大值表示该特征,而且认为这个最大值表示的是最重要的特征。当我们对所有特征向量进行1-Max-Pooling之后,还需要将每个值给拼接起来。得到池化层最终的特征向量。在池化层到全连接层之前可以加上dropout防止过拟合。
CNN中采用Max Pooling操作的利弊:
- Max Pooling可以把变长的输入X整理成固定长度的输入
- MaxPooling能减少模型参数数量,有利于减少模型过拟合问题
- 特征的位置信息在这一步骤完全丢失
- 即使某个特征出现多次,现在也只能看到一次,即同一特征的强度信息丢失了
如上图,每个filter最后得到两个特征。将所有特征合并后,使用softmax进行分类。
全连接层
全连接层跟其他模型一样,假设有两层全连接层,第一层可以加上relu作为激活函数,对于多分类来说,第二层则使用softmax激活函数得到属于每个类的概率,并选择categorical_crossentropy 作为激活函数。
通道
通道即是输入数据的不同“视角”。比如说,做图像识别时一般会用到RGB通道(红绿蓝)。你可以对每个通道做卷积运算,赋予相同或不同的权值。你也同样可以把NLP想象成有许多个通道:把不同类的词向量表征(例如word2vec和GloVe)看做是独立的通道,或是把不同语言版本的同一句话看作是一个通道。在词向量构造方面可以有以下不同的方式:
- CNN-rand: 随机初始化每个单词的词向量通过后续的训练去调整。
- CNN-static: 使用预先训练好的词向量,如word2vec训练出来的词向量,在训练过程中不再调整该词向量。
- CNN-non-static: 使用预先训练好的词向量,并在训练过程进一步进行调整。
- CNN-multichannel: 将static与non-static作为两通道的词向量。

