人工智能A7论坛 >> Tensorflow和深度学习笔记_论坛版 >> 6 CNN 在自然语言处理中的应用 >> 6.3 CNN在文本分类中的应用

6.3.1 网络结构:

采用的是最经典的结构,也就是

这张图虽然以前提过,但由于是经典图,这里再详细说明一下: 

1)最左边输入层:
在最左边的输层有两个channel,每个channel是一个二维的矩阵,矩阵的列的长度等于语句sentence的长度(也就是sentence中的单词个数,通过padding使得待分类的每个sentence都有相同的长度),矩阵的行向量表示每个单词的向量形式,文中作者使用了word2vec工具初始化了,也就是每个单词都做了embedding这部分就是6.1所说的“文本表示成二维矩阵”的内容,不难理解。

  输入层为什么得有两个channel呢?

两个channel在初始化的时候是一样的,而之所以使用了两个channel就是因为两个channel的目的不一样,其中一个为static,也就是在给定了embedding之后,其值就不会变了,另一个channel为 non-static,表示embedding向量是参数,也是需要在推导中求出来的。使用两个channel的目的是考虑到:第一,如果只是使用static,由于使用word2vec的训练语料和试验中的实验语料可能存在不一致,导致embedding存在偏差;第二,如果只是使用单方面的non-static向量,其初始化对其结果和收敛快慢都有影响。所以使用混合的channel能够使上面的两种问题得到“中和”。 

2)卷积层
在输入层之后就是卷积层,以上图为例,最上面的filtershape3*6,也就是对于这句话:“wait for the vedio and do nt rent it,这个filter每隔三个词就做一次卷积操作,对于长度为8的句子,在这个filter的卷积操作之后,会产生一个7*1的输出。当然卷积层的filter个数和filtershape都是可以变的,原理是一样的。 

3)POOLing
后面的一层是pooling层,这篇论文使用的是max-pooling,也就是上文的7*1 的卷积层输出将会pooling成一个1*1的数值,有nfilter就会产生n1*1的数值,这n个数值将会用于后面的全连接层。

需要说明的是,npooling层的输出,就构成了句子的embedding结果。注意理解word embedding和句子embedding的差异。

 

4)输出层 
之后是一个全连接输出层,输出层输出的个数对应的是文本的类别数量,将上面的npooling层输出全连接到输出层,输出层使用的是softmax激励函数。

从上面的描述可以看出,CNN对于分本分类的思路很清晰,实现起来也不难

 

下面的图显示的是另外一种稍微有点diffCNN文本分类模型(来自IDL吕钦的PPT)。可以看到在隐层和embedding层之间多了一条直接连接的线,这条线叫做high way。通常在神经网络层数比较深的时候,通过high way(也叫跨层连接)可以缓解梯度弥散问题,提升训练效果