机器不学习:CNN和RNN在文本分类过程中的区别
机器不学习-机器学习、深度学习好网站
在最左边的输出层有两个channel,每个channel是一个二维的矩阵,矩阵的列的长度等于语句sentence的长度(也就是sentence中的单词个数,通过padding使得待分类的每个sentence都有相同的长度),矩阵的行向量表示每个单词的向量形式,文中作者使用了word2vec工具初始化了,也就是每个单词都做了embedding。两个channel在初始化的时候是一样的,而之所以使用了两个channel就是因为两个channel的目的不一样,其中一个为static,也就是在给定了embedding之后,其值就不会变了,另一个channel为 non-static,表示embedding向量是参数,也是需要在推导中求出来的。使用两个channel的目的是考虑到:第一,如果只是使用static,由于使用word2vec的训练语料和试验中的实验语料可能存在不一致,导致embedding存在偏差;第二,如果只是使用单方面的non-static向量,其初始化对其结果和收敛快慢都有影响。所以使用混合的channel能够使上面的两种问题得到“中和”。
在输入层之后就是卷积层,以上图为例,最上面的filter的shape是3*6,也就是对于这句话:“wait for the vedio and do n’t rent it”,这个filter每隔三个词就做一次卷积操作,对于长度为8的句子,在这个filter的卷积操作之后,会产生一个7*1的输出。当然卷积层的filter个数和filter的shape都是可以变的,原理是一样的。
后面的一层是pooling层,这篇论文使用的是max-pooling,也就是上文的7*1 的卷积层输出将会pooling成一个1*1的数值,有n个filter就会产生n个1*1的数值,这n个数值将会用于后面的全连接层。
之后是一个全连接输出层,输出层输出的个数对应的是文本的类别数量,将上面的n个pooling层输出全连接到输出层,输出层使用的是softmax激励函数。
先谈用CNN卷积的情况,这里面有几个关键点:
一个是文本跟图片不一样,图片有长宽,然后还有深度(RGB)。对应到文本上,假设文章总共N个词,每个词嵌入维度K维,那么输入是N * K的,N可以理解为高度,K作为长度,深度为1。那么卷积的时候的特征抽取器(filter)高度h一般设置多大呢? 一般可以从3开始,表示捕获住trigram特征。
更多的是使用几种不同的filter(比如有高度各为2,3,5的)。 特征抽取器(filter)的长度一般设置为词向量的维度,这样保证每个filter抽取出来一个N-h+1个特征点,而不是一个平面(想想为什么)。
最重要的,在文本上work的pooling层一般是max-pooling,对每个filter应用整个序列上的max-pooling得到一个特征点(也有用k-max-pooling得到k个点),组合多个filter就能得到一系列特征,最后一个全连接层做分类。
这里为什么是max-pooling而不是min-pooling呢?一般来说,pooling后我们引入非线性是用Relu,relu对于小于0的直接就不激活了。
然后我们对比图像的深度,文本一般深度只有一个,如何增加深度以及为什么增加呢? 一般我们的词向量都是先预训练出来的,然后在一个特定任务上使用,梯度会回传回来进一步finetune,如果语料不是特别大,这个finetune过程只会对部分词进行更新,有些词就一直不动,这样在测试阶段,出现那些没finetune到的词就会有所偏差。我们可以同时使用两份词向量(相当于通道数为2,深度加深为2),一份finetune一份静态地不更新,来缓解前面提到的问题。
二) 对于RNN做文本分类,相当于把每个词作为一个时间节点,把词向量作为每个单元的输入特征,一般会组合前向以及后向来构成双向特征,计算后每个单元有个状态特征以及输出特征,文本分类一般组合每一个单元的输出特征求个平均喂给全连接层来做分类。 求平均这个操作可以替换为更通用的注意力机制,复杂度更高点,效果更好。 复杂点的模型会分层来做,句子界别的rnn然后attention,最后文档级别在前一层的基础上再rnn+attention,效果据说能更进一步提升。
另外,对于情感分析,我们也可以看做是个文本分类的任务,正面,负面还是中性。 情感分析上,Tree-LSTM模型一般效果更好点, 每一个节点捕获左右子树的特征。
参考:1)http://blog.csdn.net/u010223750/article/details/51437854
2)http://blog.csdn.net/meanme/article/details/48845793