参考资料:文本分类之TextCNN与DPCNN
TextCNN 是在2014年的论文 《Convolutional Neural Networks for Sentence Classification》中提出来的。
以下是TextCNN的网络结构:
(1)TextCNN的第一层为 Embedding 层
Embedding 层的输入维度为 [n,k,2]:
其中n表示句子长度,k 为 word embedding (vector)的维度,2表示通道数。
即 embedding 采用的是 word2vec 的方式,代码中 k = 128
为了方便批处理,通常对长度不等的句子进行 padding 操作。
获得单词嵌入向量的方式目前可以分为:预训练和“新训练”。预训练的词嵌入可以利用其它语料库的单词分布得到更多的先验知识,而通过当前网络训练的词嵌入可以更好地捕获与当前任务相关的单词分布特征。
Embedding 层采用了双通道(static与non-static)的形式:
static 表示预训练的 word embedding ,在训练过程中不被改变;
non-static 表示“参与网络训练”的 word embedding ,其作为参数在训练过程中发生改变。
(2)TextCNN的第二层为卷积层 Conv1d
与CV领域不同的是,NLP中的卷积核只在一个方向上进行滑动,因此使用 Conv1d
一般情况下,Conv1d用于文本,Conv2d用于图像,Conv3d用于视频。
应用于CV中的卷积核,为了捕获长和宽两个维度的局部特征,卷积核通常在长宽两个方向上进行卷积操作。
而在句子中,一个单词是一个特征,也就是说,句子只具有长度一个维度。因此NLP中的卷积核的宽度与 word embedding 维度 k 相同,且卷积核只会在句子长度这一个方向上进行卷积操作。
Conv1d 层的输入维度为 [n,k,2],图中示例使用了 4 个大小为 m*k 的卷积核(实际为64个);
则输入的维度为 [n-m+1,1,4],即 4 个 (n-m+1)*1 的向量。
(3)TextCNN的第三层为最大池化层 MaxPool1d
与卷积层类似,NLP中的池化层也只在一个方向上进行 Pooling 操作。
MaxPool1d 层的输入是 4 个 (n-m+1)*1 的向量,的向量,输出 4 个标量。
即 MaxPool1d 会将一个向量转为标量。
(4)TextCNN的第四层为 softmax 输出层
由于卷积核尺寸通常不会很大,因此TextCNN在捕获长距离的文本特征时效果不理想,其在中短文本场景中具有较好的效果。在2017年提出的 DPCNN 能够有效捕获长距离的文本特征。