CNN最初是用于图像分类。因为图像的分类信息往往只是体现在图像的某个局部特征上,而CNN能通过训练,去寻找这个局部特征。CNN在图像里,采用的是2D的卷积,如图所示。

NLP中,对一段文字进行分类(比如情感分析)时,和图像一样,往往是局部的几个词会体现出要表达文字的情感,因此也可以用CNN进行处理。
和RNN不同,RNN适用于要根据整段话,提炼出相应的信息。因此RNN需要将这段文字进行encoder-decoder处理。CNN则适用于要抓取某几个词判断“情感”的场合。
此外,RNN实际上是“串行处理”,其运行速度较慢。而CNN可以采用并行处理的方式,运行速度比RNN快。
而在NLP中,同样可以把要处理的一句话看成图像。可以将一句话中的多个词排成一列,每一行代表着对应的这个词的词向量。这样,也就把NLP的问题也变成了图像问题,NLP的分类问题也就可以应用图像分类所采用的CNN了。

关于卷积
当然在NLP的CNN中,采用2D卷积,“横向”挪动卷积核其实是没有意义的。因为词向量本身就是一个完整的向量,不能再“拆”。因此卷积核只能“竖”着移动,这样在NLP中,实际上使用的是1D的卷积。卷积核的“宽度”必须和词向量的长度保持一致。
在图像分类中,输入到CNN的每幅图长宽的像素是一定的,所以同理在NLP中,输入到CNN的句子的长度也必须是定长的,不够长的只能补<pad>。
以下就是采用三个卷积核,采用了padding,并取max_pooling的计算过程。

max也可以换成avg,但目前并没有证据证明avg的性能比max更好。
max也能换成k-max,但同样也没有证据证明这种方式比max更好。
和图像分类相同,NLP也可以设置卷积时的stride, local-maxpooling等。
CNN数学表述
假设只有一个卷积核。对于由 n n n个单词组成的一句话, x 1 : n = x 1 ⊕ x 2 ⊕ . . . ⊕ x n \mathbf x_{1:n}=\mathbf x_1 \oplus \mathbf x_2 \oplus ... \oplus \mathbf x_n x1:n=x1⊕x2⊕...⊕xn,其中词向量 x i ∈ R k \mathbf x_i \in \mathbb R^k xi∈Rk


1万+

被折叠的 条评论
为什么被折叠?



