Text CNN
Overview
本节我们来重点介绍一下卷积神经网络在文本分类问题当中的应用。CNN网络在图像领域已经占据了主导地位,在文本领域也有不错的表现。在 "Convolutional Neural Network for Sentence Classification" 一文中,作者使用了CNN进行文本分类任务,取得了非常不错的效果
事实上在很多情况下,Multi-Window-Size的CNN正确率和LSTM相差无几,下面我们来看一看模型的结构。
Model Structure
我们知道在CV领域中,CNN是使用卷积核在不同的channel上进行特征提取,每一个卷积核都会提取出一张feature map,然后我们再去做pooling。那么在文本分类的时候,我们显然是没有 R G B RGB RGB三个channel的。通常情况下,我们会将原始文本经过处理转变成一个shape为 [ b a t c h , s e q _ l e n , e m b e d d i n g _ d i m ] [batch, \ seq\_len, \ embedding\_dim] [batch, seq_len, embedding_dim]的矩阵,这里类比图像, s e q _ l e n seq\_len seq_len可以认为是 h e i g h t height height, e m b e d d i n g _ d i m embedding\_dim embedding_dim可以认为是 w i d t h width width。那么显然如果我们想要使用二维卷积,我们的shape是少了一个channel维度的
但是再转念一想,这不就是一张黑白图像么!我们就把这个矩阵当作是一个 c h a n n e l = 1 channel=1 channel=1的图像,然后再应用卷积,不就大功告成了。因此,我们每次使用一个 k e r n e l _ s i z e kernel\_size kernel_size为 [ w i n d o w _ s i z e , e m b e d d i n g _ d i m ] [window\_size, embedding\_dim] [window_size,embedding_dim]的卷积核来进行文本特征提取,这里:
- 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为 [ b a t c h , o u t _ c h a n n e l ∗ n ] [batch,out\_channel*n] [batch,out_channel∗n]的特征矩阵,再经过一个linear transformation,最后就得到了我们的输出。
值得一提的是,原论文采用的window_size是 [ 3 , 4 , 5 ] [3,4,5] [3,4,5]
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。