卷积神经网络(Convolution Neural Network, CNN)在数字图像处理领域取得了巨大的成功,从而掀起了深度学习在自然语言处理领域(Natural Language Processing, NLP)的狂潮。2015年以来,有关深度学习在NLP领域的论文层出不穷。尽管其中必定有很多附庸风雅的水文,但是也存在很多经典的应用型文章。
卷积神经网络在自然语言处理中又是如何应用的呢?接下来,我也想围绕几个问题作几个比较基本的阐述:
在NLP中CNN的输入可以是什么?
如果输入是词向量,每一行代表一个词,那么如何解决不同的文本长度不统一的问题?
NLP中CNN的常用超参数设置都有哪些?
接下来CNN在NLP的研究还可以从哪个方向进行?
首先,针对第1个问题,NLP中CNN的输入可以是什么?其实,任何矩阵都可以作为CNN的输入,关键是采用什么样的方法。如果你使用one-hot represention,那其实就是0-gram,这样输入的矩阵的大小肯定也是固定的(整个词表的长度);如果采用word2vec,那么每一行代表一个词语,文档中有多少个词语,就有多少行。这里,我们再来回顾一下词向量:其实它是神经语言概率模型[1]
的一个副产品,不过可以反映出词语的语义信息。word embedding技术,主要分为两种思想,Hierarchical Softmax和Negative Sampling两种,其中每种思想下又分为两种方法,CBow模型和Skip-Gram模型,关于word embedding的数学原理,这里不再赘述,可以参考word2vec中的数学原理一文,这篇博文讲的很清楚。这里需要注意的是,word2vec一般通过pre-training的方式获得,比如google的word2vec就是从大量的文本中预训练得到的。你在CNN中使用的使用,可以按照static和non-static两种方式,如果是non-static的话,则表明你在训练CNN的时候,需要对使用的word2vec做一个轻微的tuning。word2vec可以算是CNN进行NLP应用时候的标配。
针对第2个问题,如何解决不同的文本长度不统一的问题?这是一个非常显然的问题,在LeNet-5中,每个输入都是32乘32的图像文件,这样我们才能设置固定大小和数量的filters,如果图像分辨率发生了变化,那么就会造成多余的conv操作的结果丢失,从而对模型的结果产生影响,或者会使得网络内部状态发生混乱。在图像处理中,可以通过固定输入的图像的分辨率来解决,但是在自然语言处理中,由于输入的是文档或者sentence,而输入的长度是不固定的,那么如何解决这个问题呢?其实,在NLP中,研究人员一般都采用的是“单层CNN结构”,这里的单层并不是只有一层,而是只有一对卷积层和池化层。目前有两篇论文做的不错,一个是NYU的Yoon,另一个是Zhang Ye的分析报告[3]
,参看下面的图(图来自Yoon的论文[2],该论文的代码地址:yoon kim的github)
![](https://img.haomeiwen.com/i4437453/195839736bbc56d8.png)
![](https://img.haomeiwen.com/i4437453/584a39402d059bc9.png)
可以看到,每次在卷积的时候,都是整行整行的进行的。这好比是n-gram模型,如果每两行conv一次,那么就是2-gram,要知道,google最多也不过使用了5-gram模型,因为这种模型计算量非常大,但是如果在CNN中进行类似的操作,计算量反而减小了。在第二层的卷积层中,我们可以看到,每次得到的Feature Map的行数,是和输入的sentence的长度相关的。但是,在池化层,采用了1-max pooling的技术,从而将每个Feature Map的维度全部下降为1,因此,pooling结束之后,得到的向量的维度,就是卷积层Feature Map的数量。这样也便解决了输入长度的问题。但是,接下来无法再进行conv操作了,而且,在这个应用里,也不会出现像LeNet-5那样的Feature Map的组合输出的现象,因为只有一层卷积层。那么这里问题就来了,这样单层的结构到底效果如何?能不能扩展成多层的结构呢?能不能使用Feature Map的组合策略呢?单从Yoon的paper来看,结果是不错的,可是这样的结构一定适合其他应用问题吗?如果我们在conv操作的时候,不整行整行的卷积,那么这样就无法用n-gram去解释了,但是这样的效果如何呢?其实也有人做过了,是Nal的Paper,参考文献[4]. 个人不推荐这种部分卷积的做法。
针对第3个问题,CNN在应用的时候,超参数如何设定?下面,我们从几个方面进行阐述。首先是Filter Window的大小,由于在卷积的时候是整行整行的卷积的,因此只需要确定每次卷积的行数即可,而这个行数,其实就是n-gram模型中的n。一般来讲,n一般按照2,3,4这样来取值,这也和n-gram模型中n的取值相照应;当然,在文献[3]还详细分析了Filter Window大小对实验结果的影响,并且一直取值到7;其次是Feature Map的数量,在文献[2]中,针对2,3,4每一个Filter Window,都设置了100个,这样经过池化层之后,得到的向量是300维的;还有一些其他的超参数,比如为了防止过拟合,在全连接层加入了Dropout,从而随机地舍弃一部分连接,Dropout的参数为0.5;在Softmax分类时使用L2正则项,正则项的系数是3;训练的时候,SGD的mini-batchsize是50等。另外还有一个问题是,当训练的word embedding不足时,也就是待分类的document中包含没有被pre-training出来的词时,需要在某个区间上,对该词的词向量进行随机的初始化。
针对第4个问题,CNN在NLP的研究方向还可以从哪些地方进行?首先,我们来简要列举2015年CNN在NLP的应用研究列表(2016的paper还没有出来,等出来之后会在这里补上):
扩展CNN的输入,扩充词向量的维度,加入新特征[5];将RNN的输出作为CNN的输入[6],
![](https://img.haomeiwen.com/i4437453/838a10fa29246838.png)
![](https://img.haomeiwen.com/i4437453/070d8ecb5a7dc054.png)
卷积层的改造。如:将word2vec横向组合,以发现句子层级的特征[7];卷积层的非线性化改造[8];
![](https://img.haomeiwen.com/i4437453/9480080a38131108.png)
![](https://img.haomeiwen.com/i4437453/f42f20662149ec3e.png)
Pooling层的改造。使用k-Max pooling以保留更多的特征[9];分段pooling[10];
![](https://img.haomeiwen.com/i4437453/2cc721d00cdac992.png)
![](https://img.haomeiwen.com/i4437453/4057a2580b35cc5c.png)
CNN模型的组合。对同一输入做多重cnn分类,组合结果[11];一个句子一个CNN[12];
![](https://img.haomeiwen.com/i4437453/3199afe68b74e102.png)
![](https://img.haomeiwen.com/i4437453/541eb2c92e518cea.png)
PS:这里有几个问题供读者思考,也是我正在思考的问题:目前我们所看到的CNN在NLP中的应用,大部分的网络结构都非常浅,主要是对于文本的不定长的特点,不好用多层CNN网络去训练,但是如果网络不够深,似乎又无法捕捉到更深层次的特征。因此,我们到底应不应该在NLP中应用多层CNN结构?如果应该,应采取怎样的策略?可不可以把S2到C3的Feature Map的组合卷积过程应用到NLP中?这都是我们都应该考虑的问题。
网友评论