TextCNN

原文链接:

https://arxiv.org/abs/1408.5882

论文实现:

https://github.com/Shawn1993/cnn-text-classification-pytorch

参考:

https://zhuanlan.zhihu.com/p/54902636

https://www.cnblogs.com/bymo/p/9675654.html

 

Yoon Kim在Convolutional Neural Networks for Sentence Classification(EMNLP 2014)提出了TextCNN,第一次将卷积神经网络应用于文本分类任务。CNN核心点在于可以捕捉局部相关性,具体到文本分类任务中可以利用CNN来提取句子中类似 n-gram 的关键信息。TextCNN利用多个不同size的卷积核提取句子中的关键信息(类似于多窗口的N-gram模型),使用Max-Pooling选择出最具影响力的高维分类特征,再使用带有Dropout的全连接层提取文本深度特征,最后接softmax进行分类。

TextCNN的网络结构:

TextCNN

第一步:生成表示句子的词嵌入矩阵。将每个单词用一个k维的词向量表示,由n个单词组成的句子拼接成一个n*k的矩阵,即矩阵的每一行为一个词向量。

第二步:卷积操作。使用多个h*k的卷积核进行卷积,论文中使用三种size的卷积核(2*k, 3*k, 4*k),使用不同size的卷积核进行卷积所得的结果分开存储。

第三步:Max-Polling。将第二步卷积所得的结果分别进行max-polling操作,选择卷积所得向量中最大的值,不同长度句子经过pooling层之后变成定长的表示。使用该步能保证全连接层的输入长度不受句子长度的影响。

第四步:将max-polling结果送入softmax全连接层,输出文本的类别概率分布。

TextCNN的训练方式有两种:静态(static)和非静态(non-static)。static方式采用word2vec预训练的词向量,训练过程不更新词向量,特别是数据量比较小的情况下,采用静态的词向量往往效果不错。而non-static的方法是随机初始化词嵌入矩阵或使用word2vec训练好的词向量,再在后面训练的时候对其进行更新。推荐的方式是 non-static 中的 fine-tunning方式,它是以预训练(pre-train)的word2vec向量初始化词向量,训练过程中调整词向量,能加速收敛,当然如果有充足的训练数据和资源,直接随机初始化词向量效果也是可以的。

 

举例说明TextCNN的运算过程:

TextCNN

第一层输入为最左边的7乘5的词向量矩阵,其中词向量维度为5,句子长度为7。然后经过 filter_size分别为(2,3,4) 的卷积层,每个filter_size 有两个输出 channel。第三层是一个1-max pooling层,每一个卷积核输出的特征值列向量通过在整个句子长度上取最大值得到了6个特征值组成的feature map作为分类器的输入。最后接一层全连接的 softmax 层,输出每个类别的概率。

 

总结:

TextCNN是文本分类领域一个经典的模型,基于CNN网络的特性,该算法易于并行化。max-polling保证了不同长度句子经过pooling层之后都能变成定长的表示,但同时引发了一个问题,全局的max pooling丢失了结构信息,因此很难去发现文本中的转折关系等复杂模式。针对TextCNN的这一缺点,有人提出使用k-max-polling替换max pooling。