CNN 是卷积神经网络,通常用于图像领域,并且在图像分类取得非常好的效果。2014 年 Yoon Kim 在论文《Convolutional Neural Networks for Sentence Classification》中将 CNN 的思想应用到文本处理中,后续很多把 ConvNet 用在 NLP 任务上的工作都是基于这篇论文进行的。
1. CNN 文本分类模型
本文主要是对原始论文《Convolutional Neural Networks for Sentence Classification》内容的整理,首先了解 CNN 文本分类模型整体结构,下图是论文中的模型图。
可以看到模型比较简单,主要分为四个部分:输入层、卷积层、最大池化层、全连接层。
1.1 输入层
给定一个句子,输入层接收的输入是一个句子单词词向量矩阵 X,X 是一个 (n×k) 的矩阵,n 表示句子中单词数量,k 表示词向量维度。可以看到 X 的每一行对应了一个单词的词向量,而单词的词向量按照它们在句子中的顺序进行排列。
1.2 卷积层
在得到输入的词向量矩阵 X 之后,需要对 X 进行卷积操作。卷积核是一个 (h×k) 的矩阵,注意卷积核的列数是固定的 (为 k),与词向量维度一样。卷积核不断地向下移动,得到卷积后的值。
因为卷积核的列数与词向量矩阵 X 是一样的,所以经过卷积后的 feature map 也只有一列。有多个卷积核会生成多列向量,如下图所示,下图为 4 个卷积核卷积后的输出。
1.3 最大池化层
在卷积层中,多个不同的卷积核会生成多列向量 (feature map),最大池化会取出每一列中的最大值,最终形成一个一维向量。
1.4 全连接层
最后一层是全连接层,全连接层使用了 Dropout 防止过拟合,然后利用 Softmax 进行分类。
2. 模型的其他细节
2.1 使用多个不同尺寸的卷积核
刚刚我们了解到这个模型的卷积核列数必须为 k,但是其高度 (行数) 是可以变的,在使用的过程中可以采用不同高度的卷积核进行卷积操作,如下图所示。
2.2 模型的变种
作者在论文中还提出了模型的 4 种变种
- CNN-rand,单词的词向量是随机初始化的,并且在训练的过程中不断地更新。
- CNN-static,使用已经训练好的词向量,例如 Word2Vec,并且在后续训练中保持词向量不变。
- CNN-non-static,与 CNN-static 类似,都是使用已经训练好的词向量,但是在后续的训练中还会继续微调词向量。
- CNN-multichannel,使用两套词向量,均是用 Word2Vec 进行初始化,其中一套词向量在训练中保持不变,另一套会在训练中微调。输入的句子可以获取两种不同的词向量。可以理解为类似图像中的 RGB 通道,在这里两个通道分别表示两种词向量。
下图是 4 种模型的结果,可以看到 CNN-static 比 CNN-rand 效果更好,说明使用预训练的词向量比较有效;另外 CNN-non-static 比 CNN-static 效果要好,说明微调会使词向量更加适合当前任务。在实验中 CNN-multichannel 通常在小数据集效果更好。
3. CNN 文本分类总结
CNN 用于 NLP 任务中与 N-Gram 有相似之处,我们定义卷积核的高度为 3,则相当于使用卷积核在句子中进行一个 3-Gram 的操作,同时 CNN 具有很高的效率,比传统 N-Gram 要快很多。
CNN 中的卷积核宽度要与词向量的维度一样大,并且卷积核是在句子中单词的方向上进行移动的。
参考文献
论文:Convolutional Neural Networks for Sentence Classification
Understanding Convolutional Neural Networks for NLP