当人们提到卷积神经网络(CNN), 大部分是关于计算机视觉的问题。卷积神经网络确实帮助图像分类以及计算机视觉系统核心取得了重要突破,例如Facebook自动照片加tag的功能啊,自动驾驶车辆等。
近年来,我们也尝试用CNN去解决神经语言学(NLP)中的问题,并且获得了一些有趣的结果。理解CNN在NLP中的作用比较困难,但是它在计算机视觉中的作用就更容易理解一些,所以呢,在本文中我们先从计算机视觉的角度出发谈一谈CNN,慢慢再过渡到NLP的问题中去~
什么是卷积神经网络
对我来说,最容易理解卷积的办法是把它理解成一个滑动的窗口函数,就像是一个矩阵一样。虽然很拗口,但是看起来很直观(如下图,自行领悟):
ConvoluTIon with 3×3 Filter. Source:
让我们发挥想象力,左边的矩阵代表一个黑白图像。每个方格对应一个像素,0表示黑色,1表示白色(通常来说,计算机视觉处理的图像是一个灰度值在0到255之间的灰度图)。滑动的窗口被称为一个(卷积)内核、过滤器(译者:有那么点滤波器的感觉)或者特征检测器(译者:用于特征提取)。
现在,我们用一个3×3的过滤器,将它的值与原矩阵中的值相乘,然后求和。为了得到右边的矩阵,我们需要将在完整的矩阵中每一个3×3子矩阵做一次 *** 作。
你可能在想这种 *** 作有什么作用,下面有两个例子
模糊处理
让像素与周围像素值平均后,图像发生模糊。
(译者:类似于将周围几个像素的数值平摊一下)
边缘检测
对像素与周围像素值做差后,边界就变得显著了。
为了更好地理解这个问题,先想想在一个像素变化平滑连续的图像上,一块像素点和周围的几个像素点相同的时候,会发生什么:那些因相互比较产生的增量就会消失,每个像素的最终值将会是0,也就是黑色。(译者:猜是没有对比度了)。如果那有很强的有着明显色差的边界,例如从白色到黑色的图像边界,那你就会得到明显的反差,从而得到白色。
这个 GIMP manual 网址有更多的例子。(译者:如锐化啊、边缘加强之类的,还有一个似乎是可以这样做卷积修图的软件)。如果想了解得更多的话,建议你们看看这个 Chris Olah’s post on the topic.
什么是卷积神经网络
你现在已经知道了什么是卷积了,那么什么是卷积神经网络呢?简单说来,CNN就是用好几层使用非线性激活函数(如,ReLu,tanh)的卷积得到答案的神经网络。
在传统的前馈神经网络中,我们将每一层的每个输出和下一层的每个输入相互连接,这也被称为完全连接层或仿射层。但是CNN中并不是这样。相反,我们使用卷积在输入层中计算输出(译者:卷积造成部分映射,参见之前的卷积图),这就导致了局部连接,一个输出值连接到部分的输入(译者:利用层间局部空间相关性将相邻每一层的神经元节点只与和它相近的上层神经元节点连接)。
每一层都需要不同的过滤器(通常是成千上万的),就类似上文提到的那样,然后将它们的结果合并起来。那还有一个叫做池(pooling layer)或者下采样层(subsampling layers)的东西,之后再说吧。
在训练阶段中,CNN能够通过训练集自动改善过滤器中的参数值。举个例子,在图像分类问题中,CNN能够在第一层时,用原始像素中识别出边界,然后在第二层用边缘去检测简单的形状,然后再用这些形状来识别高级的图像,如人脸形状啊,房子啊(译者:特征提取后可以通过特征分辨图像)。最后一层就是用高级的图像来进行分类。
在计算方面有两个值得注意的东西:局部不变性(LocaTIon Invariance)和组合性(ComposiTIonality)。
假设你要辨别图像上有木有大象,进行一次二分类(就是分成有大象和没有大象的两种)。
咱们的过滤器将扫描整个图像,所以并不用太在意大象到底在哪儿。在现实中,pooling也使得你的图像在平移、旋转、缩放的时候保持不变(后者的情况更多些)。
组合性(局部组合性),每个过滤器获取了低层次的图片的一部分,组合起来成了高层次图片。
这就是为什么CNN在计算机视觉上表现地如此给力。在从像素建边,从边到确立形状,从形状建立更加复杂的物体过程中,CNN会给人一个直观的感受。
CNN在NLP中的用途
相比于图像与像素,大多数的NLP问题的输入是句子或者文档构成的矩阵。矩阵的每一行一般来说是一个单词,也可以是一个字符(如,字符)。所以呢,每一行就是表示一个单词的向量。通常每一个向量是一个放弃词向量word embeddings(低纬度的表示方法),例如word2vec or GloVe, 它们也可以是one-hot vectors 用于表示单词。对于一个10个词的句子,用一个100维的embedding表示,我们就有10×100的矩阵作为我们的输出,这就是我们的“图像”。
在这样看来,我们的过滤器在一个图像的小块像素上滑动,但是在NLP问题上,我们用过滤器在矩阵的每一个完整的行上面滑动(就是一个单词)。所以呢,过滤器的宽度一般和输入矩阵的宽度相同。高度、区域大小一般各有不同,但是一般都是一次读2-5个单词。
将上面说的全部联系起来,那么一个用于NLP问题的CNN就是酱紫的(花点时间,试着理解下面这张图,想想每一维度是怎么被计算的,目前可以忽略池pooling,过会儿再说):
用于句子分类的卷积神经网络结构图。
我们有三种过滤器,它们的高度分别为: 2,3, 4,每种过滤器共两个。每个过滤器在句子矩阵里进行卷积并且产生一个长短不一的特征映射(feature maps),然后一个1-max pooling在每个映射上运行,每个特征映射的最大数值都被记录下来。因此,一个单变量特征向量由所有六个映射生成,这6个特征被级联以形成用于倒数第二层的特征向量。 最后的 Softmax层就以输入的形式接收到这些特征向量,然后用它来进行句子分类;这里我们假设二分类,也就是描述两个可能的输出状态。
Source: Zhang, Y., & Wallace, B. (2015). A SensiTIvity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification.
那我们能不能拥有像计算机视觉那样的直观感受呢?局部不变性(Location Invariance)和局部组合性(local Compositionally,译者:我猜是mac自动更换造成的书写错误)产生了对于图像处理的直观感受,但是这些对于NLP问题来说并不是特别直观。你可能更加注意一个单词出现在句子中的哪一个位置。(这里有一个疑问,因为后文说了,并不在意它在哪个位置,而是在意它有没有出现过)
相互靠近的像素非常可能有‘语义’上面的联系,比如可能是一个物体的一个部分,但是对于一个单词而言,上述的规律并不是总是对的。在大部分的语言中,一个词组可以被分成几个孤立的部分。
同样的,组合的特性也不是特别的明显。我们知道,单词之间肯定有特定的组合规律,才能相互连接,就像形容词用来修饰名词一样,但是这些规则究竟怎么运转,更高层次的表达究竟意味着什么,都不是像在计算机视觉中那样明显,那样直观。
在这样的情况下,CNN看上去并不是特别适合用于NLP问题的处理。然而,RNN就能够给你更加直观的感受啦。它们象征着我们如何组织语言(或者,最少也是我们脑海中怎么组织语言):从左到右依次读。幸运的是, 这并不代表CNN没用。所有的模型都有错误,但是并不代表着它们没用用。恰好,实际应用证明了CNN对于解决NLP问题相当不错。简单的词袋模型Bag of Words model是一个基于错误假设的过简单化模型,但是还是被当做标准方法这么多年,并且取得了不错的成绩。
一个对于CNN的争议就是在于他们的速度,他们快,非常快。卷积是计算机图形的核心部分,并在GPU上的硬件级别上实现(你可以想象这有多快了吧)。相比于类似N-Grams之类的东西, CNN在单词或者分类的表示方面效率极高。在处理大量的词汇时,快速运算超出3-Grams的数据开销巨大。甚至连Google都不可以计算超过5-Grams的数据。但是卷积过滤器可以自动学习到一种很好的表达方式,而不用多余地去表示所有的词汇。因此,它完全可以拥有一个大小大于5的过滤器。我想啊,在第一层中设计这么多自动学习的过滤器,它们提取特征的行为很像(但不局限于)N-Grams的方式,但是却用一个更加简洁有效的方法表示它们。
CNN 的超参(HYPER-PARAMETERS)
在解释CNN是如何作用于NLP问题之前,我们先看看在建立CNN的时候需要做哪些选择。希望这会帮助你更好地理解这一领域的文献。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)