论文阅读笔记:Convolutional Neural Networks for Sentence Classification(TextCNN模型)

83 阅读3分钟

2014年的论文,遥想我在2018年工作的时候还以为CNN只能用来做图像(悲)。

作为到现在也经常用的一个模型,还是很有意义的。

背景

文章首先阐述了在当前(论文写作时的那个年代)词向量表示已经在自然语言领域取得了一系列成果,以及CNN已经被同年的多篇论文证明在语义分析,语句建模,搜索等领域有所成效,作者在一组无监督语言模型训练的词向量上放置了一层卷积,作为从词向量中提取的工具,这一简单的结构在各种任务中表现相当优异。

模型

image.png

基本上所有的TextCNN模型介绍都会拿出这张图吧,即使只看图这里也很容易看出来模型原理了,在原始维度为sequence_length * embedding_size的词向量矩阵上放置一个维度为filter_size * embeddingsize的卷积,随着卷积在纵向的不断滑动,类似其在图像中提取局部边界特征一样的,一个限制了尺寸的卷积会在句子上不断地进行滑动,提取局部句子的信息。

filter_size即是卷积的纵向维度,数值越大,单个卷积能够同时涵盖的词语越多,其实有点像ngram了。

此外因为是CNN,自然会设计多个通道,并且最后也会pooling,上图中采用四个卷积生成了四组结果,然后pooling成一个4维的向量,再过一个全连接层就可以dropout+softmax出结果了。

这个模型最需要理解的就是卷积在模型中的含义:提取局部特征。

与ngram的区别的话,脑杀一下大概是通过多通道学习多重语义以及采用pooling的方式总结各通道关注的语义内容,这么一看有点attention的味儿了,所以通常来说自然比fasttext这种直接ngram接全连接层的要好一些。

公式

按说后面的公式都不想放了,反正CNN的原理大家都懂,但就这么结束显得今天很摸,还是列一下。

x1:n=x1x2...xnx_{1:n} = x_1 ⊕ x_2 ⊕... ⊕ x_n

每个x是一个单词的词向量,x1:nx_{1:n}其实就是一个句子对应的词向量矩阵,自然,对于句子不等长的情况需要padding。⊕这个符号表示将各个向量x连接成为一个矩阵。

ci=f(wxi:i+h1+b),wRhkc_i = f(w · x_{i:i+h−1} + b), w∈R^{hk}

h是卷积尺寸,k是词向量维度,所以w其实就是卷积,f为非线性函数。
cic_i就表示卷积滑动到第i个词时的卷积输出结果。

自然的,卷积要在整个句子上滑动,于是会得到一个[c1,c2,...,cnh+1][c_1, c_2, ..., c_{n-h+1}]的feature map,其实就是一个通道的特征图,然后过池化层,文中采用了max_pooling取最大值,这是为了提取出该通道下最重要的特征信息,自己用的时候可以适当尝试其他的池化方案,说不定会有效果。

上面的过程描述了一个滤波器的运算过程,实际使用的时候会有多个不同h的滤波器,以取得多重语义,后面用全连接层统一即可。

后面的正则化不细说了,dropout+损失函数里的L2范数而已,实际写的时候也很方便。 再后面在各个任务的表现也摸了,这模型事到如今的广泛使用已经说明了它的作用。

总结

TextCNN的原理很简单:说白了就是在词向量上扫描CNN,希望学习到句子的局部信息。

话说回来,很容易看出来这个模型的重点就是它是要在词向量上跑的,所以如果有其它模型预先训练好的词向量用在CNN上,显然会有更好的效果,目前各种开源的词向量都挺多的,尤其是一些领域向量最好都试一试,总好过直接nn.Embedding。