理解NLP中的卷积神经网络(CNN)

此篇文章是Denny Britz关于CNN在NLP中应用的理解,他本人也曾在Google Brain项目中参与多项关于NLP的项目。 
· 
翻译不周到的地方请大家见谅。

阅读完本文大概需要7分钟左右的时间,如果您有收获,请点赞关注 :)

一、理解NLP中的卷积神经网络(CNN)

现在当我们听到神经网络(CNN)的时候,一般都会想到它在计算机视觉上的应用,尤其是CNN使图像分类取得了巨大突破,而且从Facebook的图像自动标注到自动驾驶汽车系统,CNN已经成为了核心。

最近,将CNN应用于NLP也发现了一些有趣的结果。所以在这篇文章中,主要回答一下两个问题:1,什么是CNN?2,CNN如何应用到NLP中?

1.什么是卷积?

让我们先从图像中一些简单例子来理解一下什么是CNN吧。

理解卷积 最简单的一种方式就是将它的滑动窗口函数放到一个矩阵上,如下图就是一个清晰的卷积可视化结果。

这里写图片描述

上图为3x3卷积,对角线上为1,否则为0。源文件:http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

想象上面左图表示一个黑白图片,每个小方格表示一个像素,0表示黑色,1表示白色(通常灰度图像有0-255表示像素)。滑动的窗口我们通常称之为核,过滤器,或者是特征探测器。上面使用的是3x3的卷积核,每个元素乘以特定的值(对角线为1,其余为0),然后将所有的值加起来,得到新矩阵中的一个元素值。为了让所有元素都经过卷积,所以需要移动卷积核。

你可能会想这样做到底有什么作用,那就让我们来看看一个直观的例子吧。

将附近的像素求均值——模糊图片 
这里写图片描述 
上图卷积核将周围的像素求均值,导致原本有棱角(像素变化较大)的地方变得不明显了,导致图片变模糊。

利用像素和边缘的差异——边缘检测 
这里写图片描述 
实际上,理解上面的例子也很简单,想象一个像素周围像素和它相等的话,那么卷积后的值就为0了,那么显示出来也就是黑色。如果变化较大(边缘),值就会大于0,那么就会显示出白色,即边缘。

GIMP manual 和 这里 还有一些例子,可以用于理解卷积。

2.什么是卷积神经网络?

到目前为止你已经知道了什么是卷积,但什么是卷积神经网络呢?简单来说,CNN就是包含像ReLU(线性整流层)或tanh(双曲正切)这样非线性激活函数的多层卷积。在传统的前馈神经网络中,我们连接每一个输入的神经元,然后每个神经元输出给下一层,我们称之为全连接层,或仿射层。

卷积神经网络中,并不打算这么做,我们在输入层上使用卷积来计算输出。这导致了本地连接,每个输入区域都连接到输出中的一个神经元。每一层都使用不同的过滤器,通常是成百上千个,就像上面显示的那样,并结合了它们的结果。

在训练阶段,CNN会根据你想要执行的任务自动地学习其过滤器的值。例如,在图像分类中,CNN可能学会从第一层的原始像素中检测边缘,然后利用边缘检测第二层的简单形状,然后使用这些形状来得到更高层次的特征,比如更高层次的面部形状。最后一层是使用这些高级特性的分类器。

这里写图片描述

这种计算有两个方面值得注意:位置不变性(Location Invariance)和组合性(Compositionality)。假设你想要对图片中的大象进行分类。因为你在整个图像上滑动你的卷积核,你并不真正在意大象的位置。在实践中,池化层还可以使转换、旋转和缩放有不变性,但以后还会有更多内容。第二个关键方面是(本地)组合性。每个筛选器将一个本地的低级功能块组合成更高级别的表示。这就是CNNs在计算机视觉上如此强大的原因。它直观的感觉到像素,从边缘到形状,从形状到更复杂的物体。

然而,这些对NLP有什么作用呢?

不像图片的像素,NLP面对的常常是一个被表达为矩阵的文档或句子。常常每一行表达一个特征或句子,即每一行是一个单词所代表的向量。通常会使用词嵌入(word-embeddings)的方法,例如Word2vec或GloVe。也可以使用one-hot的方法,该方法是标注了单词在词典中的位置。如果一个文本中有10单词,每个单词用100维向量表示,利用上述方法会生成10X100的向量。这就是在NLP中的“图像”。

在机器视觉上,我们的卷积核会在图像的局部区域上滑动,但是在NLP中,我们通常使用的过滤器会滑过整个矩阵(单词)。因此,过滤器的“宽度(width)”通常与输入矩阵的宽度相同。高度,或区域大小(region size),可能会有所不同,但是滑动窗口一次在2-5个字是典型的。

一个NLP上的卷积实例大概是下面那样,请花一点时间理解下图。 
这里写图片描述

上图展示了CNN在文本分类的使用,使用了2种过滤器(卷积核),每个过滤器有3种高度(区域大小),即有6种卷积结构(左起第2列),所以会产生6中卷积后的结果(左起第3列),经过最大池化层(后面还会提到池化层),每个卷积的结果将变为1个值(左起第4列),最终生成一个向量(左起第5列),最终经过分类器得到一个二分类结果(最后一列)。原论文:Zhang, Y., & Wallace, B. (2015). A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification.

我们对于计算机视觉的直观印象是什么呢?“位置不变性”和“组合性”是图片的直观感觉,但是这些并不太适合NLP。在一句话中,你可能很关心某个单词是否出现,图片中像素相近的我们可以认为他们是相关的(同一个物体的一部分),但在一句话中,相近的词就不一定意味着表达的是同一件事,不同的划分可能产生完全相反的意思。组合性在NLP中也不明显,单词的组合(如一句话中用形容词修饰名词)如何在更高层次表达出来,表达的结果到底意味值什么,这些都不如计算机视觉任务明显。

如果你读到这里,可能就会感觉CNN好像不太适合处理NLP任务,像RNN才会给出一个更直观的理解,因为RNN的方式跟人类的阅读习惯类似(至少是我们认为的阅读习惯):即从左到右,逐句的阅读理解。 但有意思的是CNN在NLP中的效果很好。所有的模型都是错的,但有些是有用的(All models are wrong,but some are useful)。 就像简单的词袋模型,它显然是一个过于简单的错误假设,但它仍然是多年的标准方法,并取得了相当好的结果。

CNN的一个重要特点速度很快,非常快。卷积是计算机图形学的核心部分,在gpu的硬件上实现。相对于n元概率语言模型(n-gram), CNN在表示方面也很有效。使用大量的词汇,计算任何超过3元的东西会很快变得昂贵。甚至谷歌也没有提供超过5元的东西。卷积过滤器自动地学习良好的表示,而不需要表示整个词汇表。有大于5元的过滤器是完全合理的。我认为第一层的许多有经验的过滤器捕获的特征非常类似(但不局限于)n元,但CNN是以更紧凑的方式表示它们。

3.CNN的超参数

之前我们揭示了CNN是怎么应用在NLP任务上的,接下来我们就看看在构造CNN需要做的参数选择吧,希望这能让你更好的理解有关这个领域的相关文献。

宽卷积 VS 窄卷积

上面介绍卷积的时候,我们忽略了一个关于怎么使用卷积核细节,当我们将一个3x3的卷积核放在矩阵的中心,当然会有很好的效果,但是,矩阵边缘的像素点怎么以它们为中心进行卷积呢?

此时可以使用填充0(zero-padding)的方法,所有使用到的矩阵以外的元素都设为0。这样的话,你就可以将卷积核应用在所有输入尺寸的矩阵上了。最终也可以获得一个更大的或跟原矩阵一样大的输出。填充0的卷积称之为宽卷积,不使用0填充的卷积称之为窄卷积。具体效果可以看下面的在1维上的展示效果。 
这里写图片描述

Narrow vs. Wide Convolution. Filter size 5, input size 7. Source: A Convolutional Neural Network for Modelling Sentences (2014)

s1~s7可以看为像素点,c5表示连接有5个原像素点的卷积核,一共3个。左图是一个窄卷积,右图是一个宽卷积。那么左图的输出尺寸为3,具体的计算为(75)+1=3(7−5)+1=3,5为一个卷积连接5个原矩阵中的点。右边的输出尺寸为(7+245)+1=11(7+2∗4−5)+1=11,2*4表示有8个卷积使用了填充0的方法。

卷积移动的“步幅”(stride size)

“步幅”(stride size)是卷积的另一个参数,描述了卷积核每一步移动多大的距离。在上面的例子中我们都是设置步幅为1,下面是斯坦福cs231课程上展示的一个步幅为1的卷积核和步幅为2的卷积核的比较,可以看出步幅越大,卷积核输出的维度越小。 
这里写图片描述

Convolution Stride Size. Left: Stride size 1. Right: Stride size 2. Source: http://cs231n.github.io/convolutional-networks/

我们经常使用的卷积步幅为1,大的卷积核步幅或许可以用来建立一个类似于RNN的模型。

池化层(Pooling Layers)

卷积神经网络另一个突出的特征就是池化层,它经常被放在卷积层之后,池化层是对上一层卷积层的子采样,例如采集池化层过滤器覆盖区域下最大的值——称为最大池化。 
不必对整个矩阵进行池化,也可以通过窗口进行滑动(NLP中经典的做法是将池化层应用于整个卷积输出的结果,最终就直接得到一个数字——即这个尺寸下此句子的特征,如上面的例子。) 
这里写图片描述

Max pooling in CNN. Source: http://cs231n.github.io/convolutional-networks/#pool

我们为什么要用池化层呢?

第一:池化层可以保证输出矩阵大小是固定的。而分类任务常常要求输出维度固定,例如,如果池化层应用到1000个过滤器(卷积核)上,那么不管你的过滤器尺寸和你输入矩阵的大小,你都将得到一个1000维的输出。这就使得你可以选择可变的输入向量和过滤器尺寸,但得到的输出维度一致。

第二:池化层可以降维,但又能保证重要的信息。

在图像处理的领域,池化还可以提供转变和旋转的不变性,当你在一个区域上集中的时候,即使你把图像平移了几个像素,输出也会保持不变,因为无论如何,max操作都会选择相同的值。

详情可点击https://www.zhihu.com/question/36686900

通道(Channels)

通道就是从不同“角度”看待你的输入,在图像里面,RGB格式的图像就有3个通道(红,绿,蓝)。同样的,NLP中也有不同的通道,例如可以把通道分为不同的词嵌入方法(word2vec,GloVe等),不同语种的表达,或者同一个意思不同方式的表达。

二、CNN在NLP领域中的应用

现在就让我们一起来看看CNN具体在NLP中的应用吧。CNN很适用于与文本的分类任务,如情感分析,垃圾邮件检测,或是主题分类。 
1.经典做法 
【1】在各种分类数据集上对CNN架构进行评估,主要包括情感分析和主题分类任务。CNN的架构在数据集上获得了很好的性能,并且在一些方面达到了新的水平。令人惊讶的是,本文使用的网络非常简单,这就是它的强大之处。输入层是由连接的word2vec单词嵌入组成的句子。接下来是一个带有多个过滤器的卷积层,然后是一个最大池化层,最后是一个softmax分类器。本文还对两种不同的信道进行了静态和动态词嵌入的实验,其中一个信道在训练过程中进行了调整,另一个则没有。一个类似的,但稍微复杂一点的架构【2】。【6】添加一个额外的层,对这个网络架构执行“语义聚类”。 
这里写图片描述
2.输入向量的不同表达方式 
【4】从头开始训练CNN,不需要像word2vec或GloVe这样的预先训练的单词向量。它直接将卷积应用于一个独热向量(one-hot)。此外,作者还提出了一种空间高效的用于输入数据的单词表示法,从而减少了网络需要学习的参数的数量。在【5】中,作者将该模型扩展为一个额外的无监督的“区域嵌入”,即使用CNN预测文本区域的上下文来学习。这些论文的方法似乎对长篇文本(如电影评论)很有效,但它们在短文本上的表现并不清楚。从直观上看,使用预先训练的单词嵌入短文本会比使用长文本更有效。

* 3.CNN在NLP中的综合实验* 
构建一个CNN架构意味着有许多超参数要选择,其中一些我在上面介绍过:输入代表(word2vec, GloVe, one -hot),卷积过滤器的数量和大小,池策略(max, average)和激活函数(ReLU, tanh)。【7】对CNN体系结构中不同超参数的影响进行实证评价,考察其对性能的影响和对多个运行结果方差的影响。如果您想要实现您自己的CNN的文本分类,使用本文的结果作为起点将是一个好主意。一些突出的结果是,max-pooling总是优于average-pooling,理想的筛选器大小是重要的,但是依赖具体任务,并且正则化在NLP任务中似乎并没有很大的不同。

4.探索词的位置影响 
【8】探讨了CNNs的关系提取和关系分类任务。除了“向量”这个词外,作者还将词语的相对位置作为对卷积层的输入。该模型假设给定实体的位置,并且每个示例输入包含一个关系。【9】和【10】探索了相似的模型。

5.学习有意义的表达 
NLP的另一个有趣的用例可以在【11】和【12】中找到,来自微软的研究。这些论文描述了如何学习语义上有意义的句子表达,这些句子可以用于信息检索。论文中给出的例子包括根据用户当前阅读的内容向用户推荐有趣的文档。语句表示是基于搜索引擎日志数据进行训练的。

6.学习合适的词嵌入方法 
大多数CNN体系结构学习嵌入(低维的表示),以一种或另一种方式,作为他们训练过程的一部分。并不是所有的论文都集中在这方面的训练或调查学习的嵌入有多大意义。【13】提供CNN架构来预测Facebook帖子的标签,同时为单词和句子生成有意义的嵌入。然后,这些学习的嵌入被成功地应用到另一项任务——向用户推荐可能有趣的文档,并基于用户点击数据进行培训。

字符级别上的CNN

到目前为止,所有的模型都是基于单词的。但也有研究将CNNs直接应用于字符。【14】学习字符级的嵌入,将其与预先训练的词嵌入连接起来,并使用CNN作为词性标记的一部分。【15】【16】探讨了使用CNNs直接从字符学习,而不需要任何预先训练的嵌入。值得注意的是,作者使用了一个相对较深的网络,总共有9层,并将其应用于情绪分析和文本分类任务。结果表明,直接从字符级输入学习在大型数据集(数以百万计的例子)中非常有效,但是在较小的数据集上(成千上万的例子)表现得比较简单。【17】探讨了字符级的卷积在语言建模中的应用,将字符级的CNN的输出作为每个时间步中LSTM的输入。同样的模型适用于各种语言。

令人惊讶的是,以上所有的论文都是在过去1-2年发表的。显然,CNN在NLP上已经有了出色的效果,且其发展也在加速。

论文索引

    • [1] Kim, Y. (2014). Convolutional Neural Networks for Sentence Classification. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP 2014), 1746–1751.
    • [2] Kalchbrenner, N., Grefenstette, E., & Blunsom, P. (2014). A Convolutional Neural Network for Modelling Sentences. Acl, 655–665.
    • [3] Santos, C. N. dos, & Gatti, M. (2014). Deep Convolutional Neural Networks for Sentiment Analysis of Short Texts. In COLING-2014 (pp. 69–78).
    • [4] Johnson, R., & Zhang, T. (2015). Effective Use of Word Order for Text Categorization with Convolutional Neural Networks. To Appear: NAACL-2015, (2011).
    • [5] Johnson, R., & Zhang, T. (2015). Semi-supervised Convolutional Neural Networks for Text Categorization via Region Embedding.
    • [6] Wang, P., Xu, J., Xu, B., Liu, C., Zhang, H., Wang, F., & Hao, H. (2015). Semantic Clustering and Convolutional Neural Network for Short Text Categorization. Proceedings ACL 2015, 352–357.
    • [7] Zhang, Y., & Wallace, B. (2015). A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification,
    • [8] Nguyen, T. H., & Grishman, R. (2015). Relation Extraction: Perspective from Convolutional Neural Networks. Workshop on Vector Modeling for NLP, 39–48.
    • [9] Sun, Y.,www.thd178.com/   Lin, L., Tang, D., Yang, N., Ji, Z., & Wang, X. (2015). Modeling Mention , Context and Entity with Neural Networks for Entity Disambiguation, (Ijcai), 1333–1339.
    • [10] Zeng, D., Liu, K.,www.wanmeiyuele.cn  Lai, S., Zhou, G., & Zhao, J. (2014). Relation Classification via Convolutional Deep Neural Network. Coling, (2011), 2335–2344.
    • [11] Gao, J., Pantel, P., Gamon, M., He, X., & Deng, L. (2014). Modeling Interestingness with Deep Neural Networks.
    • [12] Shen, Y., He, X., Gao, J., Deng, L., & Mesnil, G. (2014). A Latent Semantic Model with Convolutional-Pooling Structure for Information Retrieval. Proceedings of the 23rd ACM International Conference on Conference on Information and Knowledge Management – CIKM ’14, 101–110.
    • [13] Weston, J., www.255055.cn/& Adams, K. (2014). # T www.365soke.cn AG S PACE : Semantic Embeddings from Hashtags, 1822–1827.
    • [14] Santos, C., & Zadrozny, B. (2014). Learning Character-level Representations for Part-of-Speech Tagging. Proceedings of the 31st International Conference on Machine Learning, ICML-14(2011), 1818–1826.
    • [15] Zhang, X., Zhao, J., & LeCun, Y. (2015). Character-level Convolutional Networks for Text Classification, 1–9.
    • [16] Zhang, X., & LeCun, Y. (2015). Text Understanding from Scratch. arXiv E-Prints, 3, 011102.
    • [17] Kim, Y., www.baohuayule.com   Jernite, Y., www.leyou1178.cn Sontag, D., & Rush, A. M. (2015). Character-Aware Neural Language Models.

猜你喜欢

转载自www.cnblogs.com/qwangxiao/p/8971924.html