CNN在文本分类中的应用
参考了:https://www.kesci.com/home/project/5d15a8fe708b90002c6c368c?tdsourcetag=s_pcqq_aiomsg
和https://blog.csdn.net/u012808902/article/details/81155509
援引论文《Convolutional Neural Networks for Sentence Classification》
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络,是一种重要的深度学习算法。
什么是前馈神经网络
关于什么是前馈神经网络网上的资料也很多,这里就大概讲一下,前馈神经网络的大致结构长这样:
每个小圈圈叫神经元,他们会对输入用特定的函数处理后输出。我们把数据输入到蓝色的输入层,通过绿色的隐含层(隐含层可能不止一层)处理,最后在黄色的输出层输出,具体可以看我的这两篇博文:
https://blog.csdn.net/qq_43012160/article/details/95762591(讲MLP的,MLP是一种前馈神经网络的实现)
https://blog.csdn.net/qq_43012160/article/details/96101078(前馈神经网络部分)
比如一个简单的神经网络:
其实就是执行这样的操作:
CNN的隐含层包括卷积层和池化层两层。
在文本分类中,CNN的神经网络示意图如下:
CNN的输入层与word2vec
例如上图,我们输入要分析句子wait for the video and do not rent it
每个词我们通过word2vec算法,用维度为6的词向量表示他。
但是这句话明明有9个词啊,词向量维度怎么为6呢。
原因在于这里用的向量化不是独热编码,而是word2vec。由于在大词袋条件下独热编码的维度过高,大大影响计算效率,且独热编码无法有效表示词与词之间的上下文关系,所以就有了word2vec,word2vec本身也是利用前馈神经网络进行的训练。具体可以参看这篇博文:
https://blog.csdn.net/lilong117194/article/details/81979522
值得注意的是我们的训练过程最后真正有用的是那个输入层到隐含层之间的矩阵w,即lookup table,我们的训练都是在利用梯度下降和反向传播调整w矩阵。
值得注意的是我们的词向量维度N和我们认为相关的单词数C并没有关系,因为一个CV的矩阵乘上一个VN的矩阵会得到一个CN的矩阵,在乘完W输入隐层之前会有一个求平均的操作,这个求平均会使不管几行的矩阵都变成一个1N的向量。
输入层接收两个最初一样的词向量矩阵,只不过一个定义为static一个定义为non-static,non-static矩阵的值会因为反向传播而改变。
卷积层
隐含层的第一层是卷积层,什么是CNN里的卷积这里大概说一下,具体可以参考这篇博文:
https://blog.csdn.net/cheneykl/article/details/79740810
他这里举的是是图像处理里面RGB通道的例子,我们知道颜色都是由三原色构成的,Red红Green绿和Blue蓝,所以在图像处理中每个像素点其实都是一个三维的向量,每个维度分别代表他的RGB“程度”,最后由三原色综合起来,这个综合,或者说叠加,就是卷积运算。他能够使不同方面的数据整合起来。
这个不同方面信息的整合,在我们的文本分类算法里就是对上面说的未做过修改的static输入矩阵和通过反向传播修正后的non-static矩阵的进行的卷积运算。
这里的卷积核是一个我们自定义的矩阵,大小应该和CNN的窗口一样大,比如图中红色窗口大小为26,黄色为36.这里面的6即词向量的维度,2和3指的是认为的句子中与关键词有关的单词个数(包括关键词),比如3就是认为关键词的前一个词和后一个词与关键词有关。
一般会定义多个大小不同的窗口进行多次卷积,比如本例中就用了2个36的和2个26的窗口。代表我们认为相邻的2个或3个单词间都可能存在词义联系。
由于我们的窗口宽度为N,所以最后生成的会是几个列向量。
池化层
池化层可以看作对于信息的一种提取,这里选择的是一种称为Max-over-timePooling的方法。这种方法就是简单地从之前一维的Feature Map中提出最大的值,文中解释最大值代表着最重要的信号。
这样我们就从4个列向量中剥离出了4个最重要的特征。
softmax输出层
利用softmax将池化出的特征转化为最终分类结果的概率,并根据概率选择最终的分类结果。
模型中还使用dropout进行正则化防止过拟合,Dropout是指在模型训练时随机让网络某些隐含层节点的权重不工作,不工作的那些节点可以暂时认为不是网络结构的一部分,但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了,可以防止过拟合,这里不再深究。