当人们提到卷积神经网络(CNNs), 一般是围绕计算机视觉。图像分类以及计算机视觉系统核心的重要突破的原因之一就是卷积神经网络,例如Facebook自动照片加tag的功能啊,自动驾驶车辆等。
最近呢,我们也尝试用CNN去解决神经语言学(NLP)中的问题,并且获得了一些有趣的结论。理解CNN在NLP中的作用是比较艰难的,但是它在计算机视觉中的作用就更容易理解一些,所以呢,在本文中我们先从计算机视觉中出发谈一谈,慢慢再过度到NLP的问题中去~
什么是卷积神经网络
对我来说,最容易理解卷积的办法是把它理解成一个滑动的窗口函数,就像是一个矩阵一样。虽然很拗口,但是看起来很顺畅(译者:翻译这句话确实挺蛋疼的,应该翻译成,如下图,自行领悟):
Convolution with 3×3 Filter. Source: http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution
让我们发挥想象力,左边的矩阵代表一个黑白图。每个方格对应一个像素,0表示黑色,1表示白色(通常来说应该是一个值在0到255之间的灰度图)。滑动的窗口被称为一个内核、过滤器(译者:有那么点滤波器的感觉)或者特征检测器(译者:用于特征提取)。
现在,我们用一个3×3的过滤器,将它的值与原矩阵中的值相乘,然后求和。为了得到右边的矩阵,我们需要将大矩阵的每一个3×3子矩阵做一次操作。
你可能在想你这样做能干什么,下面有两个例子
模糊处理
使像素与周围像素值平均后导致图像模糊
边缘检测
对像素与周围像素值做差后标注出了边界
为了更好地理解这个问题,先想想在一个平滑的图像上,一块像素点和周围的几个像素点相同的时候,会发生什么:那些增量会消失,每个像素的最终值将会是0,也就是黑色。(就是没有对比度了)。如果那有很强烈的锐利的边界,例如从白色到黑色,那你就会得到强烈的反差,从而得到白色。
The GIMP manual has a few other examples。(译者:如锐化啊、边缘加强之类的)。如果想了解得更多的话,建议你们看看这个Chris Olah’s post on the topic.
什么是卷积神经网络
你现在已经知道了什么是卷积了,那么什么是卷积神经网络呢?简单说来,CNN就是用好几层使用非线性激活函数(如,ReLu,tanh)的卷积得到答案的神经网络。
在传统的前馈神经网络中,我们将每一层的输出和下一层的输入相互连接,这也被称为完全连接层或仿射层。但是CNN中并不是这样。相反,我们使用卷积在输入层中计算输出。这就导致了局部连接,一个输出值连接到部分的输入(译者:利用层间局部空间相关性将相邻每一层的神经元节点只与和它相近的上层神经元节点连接)。
每一层都需要不同的过滤器,通常是成千上万的,就类似上文提到的那样,然后将它们的结果合并起来。那还有一个叫做池(pooling layer)或者二次抽样层(subsampling layers)的东西,下次再说吧。
在训练阶段中,CNN能够依赖训练集自动改善它过滤器中的值。举个例子,在图像分类问题中,CNN能够在第一层时,用原始像素中识别出边界,然后在第二层用边缘去检测简单的形状,然后再用这些形状来识别高级的图像,如更高层的人脸形状。最后一层就是用高级的图像来进行分类。
在计算方面有两个值得注意的东西:局部不变性(Location Invariance)和组合性(Compositionality)。
假设你要分别图像上有木有大象。
- 因为你的过滤器将扫描整个图像,所以并不用太在意大象到底在哪儿。在现实中,pooling也使得你的图像在平移、旋转、缩放的时候保持不变(后者更多)。
- 组合性(局部组合性),每个过滤器获取了低层次的图片的一部分,组合起来成了高层次图片。
这就是为什么CNN在计算机视觉上表现地如此给力。在从像素建边,从边到确立形状,从形状建立更加复杂的物体过程中,CNN会给人一个直观的感受。
TO BE CONTINUE.