Text CNN

Overview

本节我们来重点介绍一下卷积神经网络在文本分类问题当中的应用。CNN网络在图像领域已经占据了主导地位,在文本领域也有不错的表现。在 "Convolutional Neural Network for Sentence Classification" 一文中,作者使用了CNN进行文本分类任务,取得了非常不错的效果

TextCNN使用场景 textcnn模型_cnn

事实上在很多情况下,Multi-Window-Size的CNN正确率和LSTM相差无几,下面我们来看一看模型的结构。

Model Structure

我们知道在CV领域中,CNN是使用卷积核在不同的channel上进行特征提取,每一个卷积核都会提取出一张feature map,然后我们再去做pooling。那么在文本分类的时候,我们显然是没有TextCNN使用场景 textcnn模型_卷积核_02三个channel的。通常情况下,我们会将原始文本经过处理转变成一个shape为TextCNN使用场景 textcnn模型_cnn_03的矩阵,这里类比图像,TextCNN使用场景 textcnn模型_cnn_04可以认为是TextCNN使用场景 textcnn模型_深度学习_05TextCNN使用场景 textcnn模型_卷积核_06可以认为是TextCNN使用场景 textcnn模型_神经网络_07。那么显然如果我们想要使用二维卷积,我们的shape是少了一个channel维度的

TextCNN使用场景 textcnn模型_卷积核_08

但是再转念一想,这不就是一张黑白图像么!我们就把这个矩阵当作是一个TextCNN使用场景 textcnn模型_卷积核_09的图像,然后再应用卷积,不就大功告成了。因此,我们每次使用一个TextCNN使用场景 textcnn模型_神经网络_10TextCNN使用场景 textcnn模型_神经网络_11的卷积核来进行文本特征提取,这里:

  • window_size表示每次我们希望看到几个单词(我们默认使用token level),window_size的选取也很重要,因为选小了,我们可能会捕捉不到上下文信息;选的太大,可能会导致计算资源的浪费或者模型准确率的下降
  • embedding_dim就是词向量的维度,这里我们不难发现,卷积核的kernel_size是一个矩形。文本比较特殊的是,每一个token是用一个向量进行表示,因此如果我们的卷积核每次不能覆盖一个完整的单词,那么就会丢失掉很多的信息。这一点与图像不一样,因为图像的每个像素点就是一个scalar,我们不会把像素点再用一个向量进行表示。

Multi Window Size

上面我们提到卷积核的window_size对模型的表现能力会产生很大影响,那么我们自然会想到使用多种大小的window_size,这样不就能取长补短了么?因此我们使用多组卷积核,每组卷积核的window_size互不相同,然后就得到了多张feature map。接着我们将所有的feature map进行一个concatenation,再丢进池化层

(当然也可以先对每张feature map进行池化,再concatenation,效果一样),得到一个shape为TextCNN使用场景 textcnn模型_神经网络_12的特征矩阵,再经过一个linear transformation,最后就得到了我们的输出。

TextCNN使用场景 textcnn模型_cnn_13

值得一提的是,原论文采用的window_size是TextCNN使用场景 textcnn模型_神经网络_14

Static vs Non-Static

论文中还提出了许多提升模型效果的方法,其中一个就是Non-Static CNN。Static CNN就是我们使用了静态的词向量,如最经典的word2vec,直接将与训练好的词向量复制到我们的Embedding Layer中,不随卷积层一起训练。那么Non-Static CNN就是在训练过程中同时训练更新词向量,根据不同的任务做一下fine tuning,作者发现Non-Static CNN效果要优于Static CNN。

现Non-Static CNN效果要优于Static CNN。