TextCNN

第一个模型就是TextCNN
对于textcnn一个基本介绍可以参考这里
textcnn 模型的pytorch实现版本

需要参考的链接
文本分类模型pytorch实现-1
文本分类模型pytorch实现-2
文本分类模型多通道CNN讲解
文本分类模型深度CNN讲解
NLP如何入门不要看书,不要系统的学习,需要补那些线代的知识

这个里面包含了基本处理中文的代码,我可以看一看

CNN模型用在文本分类的方面,论文参考的是这里
详细过程原理图如下:

我对这个流程进行一个简单的梳理:

首先第一点,我们要弄清楚为什么CNN可以被用在文本分类(或者从更大的方面讲为什么可以用在自然语言处理NLP方面)

对于这一点,网络上有很多解释,我这里从最只用的角度去分析这个问题。

CNN可以被用于图像,是因为图像是一个二维物体(这里假设是灰度图,是二维情况,如果是彩色图当然是三维情况)。这样CNN卷积操作才可以被使用。
所以如果自然语言处理方面的任务想要使用CNN,一个核心操作就是要将文本想图像的方向类比-将文本转化为一个二维图像类似体(针对单通道情况)。
我们知道,文本处理过程中,我们需要将一个句子中每个单词转化为词向量。那么一个句子就相当于含有n个单词,每个单词含有d维词向量。那么一个句子就可以很简单的被当做一个n*d的二维图像。这样CNN就可以处理文本。

了解了上面这一点,TextCNN原理图中的第一步就可以清晰了解了。也就是图中最左边的7*5的句子矩阵。7代表的是句子长度,5代表的是单词词向量维度(当然这里只是简化了,一般词向量维度要远大于5,常用为200,300)。我们可以把这个句子矩阵中每个点类比为图像中的原始像素点。

接下来,我们的操作就是进行卷积。卷积一个基本的概念就是卷积核。对于卷积核,我们需要掌握两个部分,一个是卷积核的大小,一个是卷积核的数量。在论文中,设定的卷积核的大小是三种,分别是2,3,4(注意这里的2,3,4代表的是卷积核的高度(也就是竖着的方向),对于卷积核的宽度(也就是横着的方向)我们要设定它与词向量的维度是一样的)。对于每一个大小的卷积核,我们设定它的数量是2(一般在实际操作中,会远远大于2,常用200)。我们知道与卷积核对应的是卷积之后的通道数。所以这里每种大小的卷积核对应两个通道的输出。明白了这一点,也就明白了上图中第二列和第三列的内容。第三列对应的就是卷积之后的结果。

接下来,我们进行的就是最大池化操作,这里使用的是1-max pooling。经过这个操作之后,每个通道得到的就是一个像素点,将所有的这些点拼接起来。

全连接层和softmax层

流程就这样搞明白了,接下来,我们抓一下细节问题。

首先对于词向量,有静态(static)和非静态(non-static)两种。静态方式就是说明在训练过程中我们是不更新词向量的,我们使用的是一些已经训练好的词向量,比如说word2vec预训练的词向量。这种情况对于数据量比较小的情况效果比较不错。另一种非静态的方式是在训练过程中更新词向量(这个词向量可以是我们在pytorch 中embedding层去初始化词向量,还可以是使用预训练的词向量)。我们一般推荐的是使用预训练的词向量例如word2vec,然后在训练过程中进行更新。当然如果我们具有足够的资源和数据,使用embedding随机初始化词向量,在训练过程中更新也是可以的。

对于CNN中的通道,我们知道在图像中,我们是有着RGB三种通道的。一般来说文本文字矩阵是可以看做一个二维图像,如果想要使用通道数,我们一般是把同一个句子使用不同的embedding方式(比如说一个使用word2vec一个使用Glove或者一个使用静态词向量和fine-tunning词向量作为不同channel的做法)

posted @ 2019-03-15 11:30  DUDUDA  阅读(918)  评论(0编辑  收藏  举报