如何理解卷积神经网络(An Intuitive Explanation of Convolutional Neural Networks)


本篇为Ujjwal Karn在其博客中的博文An Intuitive Explanation of Convolutional Neural Networks的自翻,主要帮助自己更好地理解卷积神经网络,英语不好,翻译水平有限,烦请指正。


卷积神经网络是如何工作的,它为何如此重要?


卷积神经网络(也称ConvNet或CNNs)是神经网络的一个分类,它已被证明在图像识别和分类领域十分有效。ConvNets已在在人脸识别、机器人和自动驾驶在汽车中除视觉驱动外的物体和交通信号这些领域取得了成功。

图1

上面的图1中,ConvNet可以识别景色并且系统可以给出与之相关的标注(“一个足球运动员正在踢足球”),同时图2给出了一个用于识别日常物品、人类和动物的ConvNet的例子。最近,ConvNets在一些自然语言处理任务(例如句子分类)上也表现的很有效率。

图2

因此ConvNets在今天的大部分机器学习的实践中都是很重要的工具。然而,理解ConvNets并第一次学习如何使用它是一段吓人的经历(intimidating experience)。这篇文章的主要目的就是阐述卷积神经网络是如何工作在图片上的。


如果你是机器学习小白,我推荐你看一看这篇关于 多层感知机的简单教程,从而在开始前明白它是如何运作的。多层感知机在本文中以“全连接层”代称。



LeNet结构


LeNet是最先被提出的卷积神经网络,它帮助推动了深度学习领域的发展。自从1988依赖,在徐错连续成功的迭代发展下,Yann LeCun所提出的具有先锋意味的网络叫做LeNet。在当时,LeNet结构主要还是被用来做字符识别任务,例如读取邮政编码、字符等等。


下面我们会让你尝试去感觉LeNet架构是如何学习去识别图片的。近些年来有许多新的架构是在LeNet的基础上做了提升,但是他们全部都使用了LeNet中的主要思想,并且如果你对LeNet有清楚的认知,就能类比地去轻松理解这些架构图3


图3中的卷积神经网络和原始的LeNet的架构十分类似,将一张输入图片进行分类:狗、猫、船和鸟(LeNet的原始架构主要是用来字符识别任务)。上图很好的说明,在接收到一张船的图片作为输入时,网络正确地在四个分类中给船分配了最高的概率(0.94)。输出层所有可能性的总和应该是1(后文会作解释)。


在图3中主要做了4个主要的操作:

  1. 卷积

  2. 非线性激活(ReLU)

  3. 池化或下采样

  4. 分类(全连接层)

这些操作是每一个卷积神经网络的基石,所以理解这些操作对于理解卷积神经网络是很重要的一步。我们会试图去感知隐藏在每个操作背后的意思。



一张图像是一个像素值的矩阵


本质上,只要是图片就可以用一个像素值的矩阵来表示。

图4

通道是卷积中的术语,指图像的某一部分。标准数码相机拍下的一张图片拥有三个通道——红、绿、蓝——你可以把他们想象成三个二维的矩阵叠加在一起(每个矩阵代表一种颜色),每个元素中是范围为0到255的像素值。


另一方面来看,一张灰度图像只有一个通道。在这篇文章中,我们只会考虑灰度图像,也就是我们只有一个二维矩阵来表示图像。每个单元格用范围从0到255的像素值——0表示黑色,255表示白色。



卷积操作


ConvNet的名字便来源于卷积操作(Convolution operator)。卷积在ConvNet中的主要用途是从输入图像中提取特征。卷积通过把输入数据看做小方块来学习特征,从而保持像素之间的关系。我们不会去深入去看这里间距的数学细节,但我们会试图理解他是如何在图像上运作的。


正如我们上述讨论的,每个图片都可看做是像素值的矩阵。考虑一个5x5的图像,他的像素值只有0或者1(注意,对于灰度图,像素值的范围是从0到255,下面的绿色矩阵是像素值只有0或1的特例)。

5x5


同时,考虑一个3x3的矩阵。

3x3


接下来,用这个5x5和3x3的矩阵进行卷积操作如下所示。
卷积操作


可以花一点时间去理解上面的操作是如何完成的。我们在原始图像(绿)上以1个像素值的距离(也叫做步长)滑动黄色矩阵,在每次滑动后,计算元素之间的乘法(两个矩阵之间)后将这些乘法的结果相加最后得到最后的整型输出,这个输出在最后的输出矩阵(粉)中是单个的元素。注意,3x3的矩阵在每一步(stride)看起来都是输入图像的一部分。


在CNN的属于中,上面的3x3矩阵被叫做滤波器或者特征检测器。通过在图像滑动滤波器并计算点积形成的矩阵被称为卷积特征(Convolved Feature)或激活映射(Activation Map)或特征图(Feature Map)。要着重注意这里滤波器在这里作为原始输入图像的特征检测器。


从上面的动画容易发现,如果滤波器矩阵有不同的,那么在相同的输入图像下也会产生不同的特征图。举个例子,以下图为输入图像:

输入图像


下面的表格列出了,在上面的图像中应用不同的滤波器会有怎样的效果。可以看出,我们只要在卷积操作前改变滤波器矩阵的值,就可以进行例如边缘检测、锐化和模糊等操作——这意味着,不同的滤波器可以从一张图片中检测不同的特征,例如边缘、曲线等。更多的例子在8.2.4中提及。

图5

下面这张动画是另一个理解卷积操作的有效方法。

图6

一个滤波器(红框)从输入图片上滑动(卷积操作)来产生特征图。另一个滤波器的卷积(绿框)在同一个输入图片上给出了不同的特征图。需要注意的是,卷及操作捕获了原始图像中的局部依赖关系。同样注意到这两个滤波器是如何在同一个原始图像上产生不同的特征图的。记住一点,上述的图像和两个滤波器都只是我们上面讨论的数值矩阵而已。


在实践中,一个CNN网络会在训练过程中自主地对于这些滤波器的值进行学习(尽管我们仍然要在训练前给出例如滤波器数量、滤波器大小、网络结构等这些具体的参数)。我们使用越多的滤波器,从图像中提取出的特征就越多,我们的网络在从未见过的图片上识别样式就会越好。


特征图(卷积特征)的大小由三个参数控制,我们需要在卷积操作执行前决定:

  • 深度(Depth):深度代表我们在卷积操作中使用的滤波器的数量。在图7所示的网络中,我们使用三个不同的滤波器对原始的船图像进行卷积,并由此产生如图所示的三个不同特征图。你可以将这三个特征图想象成二维矩阵叠成的堆,这样的话,特征图的“深度”自然就是3了。

图7

  • 步长(Stride):步长指我们在输入矩阵上滑动滤波器矩阵时移动了几个像素值。当步长为1时,我们每次将滤波器矩阵移动一个像素单位。当步长为2时,移动两个像素单位。越大的步长会产生越小的特征图。
  • 零填充(Zero-padding):有时候,在输入矩阵的边界周围用0进行填充十分方便,这样我们就可以把滤波器应用到输入图像矩阵的边界上。零填充的一个很好的特点是允许我们控制特征图的大小。使用零填充也叫宽卷积,不使用零填充叫做窄卷积。在[14]中有清楚的解释。


非线性函数(ReLU)


有一种叫做ReLU的附加操作在图3中的每个卷积操作之后都要进行。ReLU代表校正的线性单元(Rectified Linear Unit),是一种非线性运算,输出如下。

图8


ReLU是一种元素上的操作(应用在每个像素上),它将特征图上的每个负数像素值以0作替换。ReLU的目的是在ConvNet中引入非线性,因为大部分现实世界中我们要通过ConvNet学习的数据都是非线性的(卷积是线性操作——逐元素进行矩阵乘法和加法,所以我们引入一个类似ReLU的非线性函数来解释非线性)。


ReLU操作可通过下面的图9清楚地理解。图9为在上面的图6的特征图上进行ReLU操作后的结果。这里的输出特征图也被叫做“校正”特征图(Rectified feature map)。

图9

其他的非线性函数,例如tanh或者sigmoid也可以用来替代ReLU,但是ReLU在大多数情况下都要表现的更好。



池化操作


空间池化(Spatial Pooling,也被叫做二次采样(subsampling)或者下采样(downsampling)对每个特征图进行降维并保留最重要的信息。空间池化可以有不同的类型:最大池化(Max Pooling)、平均池化(Average Pooling)、求和池化(Sum Pooling)等。


以最大池化为例,我们定义一个空间领域(spatial neighborhood)(例如一个2x2的窗口),并将这个窗口应用在校正特征图上,去取每个窗口中的最大值。我们也可以用取平均值的方法(平均池化)或者将窗口中的所有元素进行求和(求和池化)来替代最大池化操作。在实践中,最大池化往往表现更好。


图10中展示了在校正特征图(在卷积+ReLU后获得)上利用2x2窗口进行池化的操作:

图10

我们以2个单位(cells)(也称为步长stride)来滑动这个2x2的窗口并取每个区域的最大值。图10中可以看到,这个操作将特征图进行了降维。


图11中的网络中,我们在每层特征图上独立地进行池化操作(要注意的是,正因如此,我们最后从三层输入图得到了三层的输出图)。

图11


图12展示了我们在图9中进行了ReLU操作后的校正特征图上进行池化的效果。

图12

池化函数的功能是逐步地减少输入表示的空间大小。特别地,池化可以

  • 让输入表示(特征维度)更小,更加易于操作(manageable)。
  • 减少了参数的数量和网络的计算量,从而控制过拟合。
  • 使得就算输入图像产生小的变化(transformations)、失真(distortions)和转化(translations)后网络也可以不变(具有鲁棒性)(输入上小的失真也不会改变池化的输出——因为我们在领域(local neighborhood)中使用最大/平均值)
  • 帮助我们获取一个比例上几乎不变的表示(更准确的说法是“等变”(equivariant))。这是很强大的,因为无论物体在图像中的哪个位置,我们都能从图像中检测到物体。


小总结


到现在我们已经得知了卷积、ReLU和池化是如何工作的。需要认识到这些层是任何卷积神经网络的基石。如图13中所示,我们使用了两个卷积、ReLU和池化层——第一个卷积层使用6个滤波器来产生共计6个特征层,第二个卷积层作用在第一个卷积层的输出上。随后ReLU分别作用在6层特征图上。在之后在每层校正特征图上应用最大池化操作。


这些层协同作用来提取图片中有用的特征,为了让这些特征能在缩放和平移后仍然在一定程度上相同,我们在网络中引入了非线性来减小维度。


第二个池化层的输出将会作为最后一层全连接层的输入,我们将在下一节讨论全连接层。


全连接层


全连接层是在输出层使用softmax激活函数(也会使用例如SVM的其他分类器,这篇文章中使用softmax)的传统多层感知机。“全连接”这个词意味着上一层的所有神经元都和下一层的所有神经元相连接。如果你对多层感知机不熟悉的话可以参考这篇文章。


卷积和池化层的输出表示着输入图像的高级特征(high-level features)。全连接层的意义就是利用这些特征并基于训练数据来进行分类。例如图14,现在有一个四种可能输出的图像分类任务(注意图14并没有画出节点之间的全连接)。

图14

添加全连接层除了分类,也(经常)被当做是学习这些特征的非线性组合的简便方法。卷积和池化后的大部分特征对分类来说很有用,但这些特征的组合有可能更有效果。


全连接层输出的可能性总和为1。这是因为在输出层我们使用了Softmax激活函数。Softmax激活函数获取任意实质分数的向量,并将其值压缩至0到1之间,并使得总和为1。



组合——使用反向传播来训练


如上述,卷积+池化层像是输入图像的特征提取器(Feature Extractors),全连接层有点像分类器(classifier)。


注意看图15,输入图像为一艘船,那么类别是船的目标概率为1,其他类为0。

  • 输入图像 = 船
  • 目标向量 = [0,0,1,0]

图15

卷积神经网络的所有训练过程可以总结为:

  • Step1:随机初始化所有的滤波器和参数/权重
  • Step2:网络将训练图片作为输入,经过前向传播(卷积、ReLU和池化操作以及全连接层的前向传播)并得到输出中每种分类可能的概率。
    • 假设一张船的输入图像,最后的概率向量为[0.2,0.4,0.1,0.3]
    • 因为对于第一个训练而言,权重是随机的,那么输出的可能性自然也是随机的。
  • Step3:计算输出层的总误差(Total Error)(四个类别的总和)。
    • Total Error = ∑ ½ (target probability – output probability) ²
  • Step4:使用反向传播来计算相对于网络中所有权重的_误差梯度_,使用_梯度下降法_(gradient descent)来更新所有滤波器的值/权重以及参数的值从而减小误差。
    • 权重按照其对误差梯度的重要程度来进行调整。
    • 当一张相同的图片再次被输入,输出的值可能为[0.1,0.1,0.7,0.1],更接近目标向量[0,0,1,0]。
    • 这意味着我们的网络_学习_到了通过调整其权重/滤波器来正确分类特定图像,从而减小输出误差。
    • 如滤波器数量、滤波器大小、网络结构等这些参数在Step1之前就被指定,并且在训练过程中不会被改变——只有滤波器矩阵和连接权重会更新。
  • Step5:对训练集中的所有图片重复Step2-4。

上面的这些步骤就是ConvNet中的训练——这本质上意味着ConvNet中的所有权重和参数都已经经过了优化,可以从训练集中正确分类图像。


当使用一个新(未见过)的图像作为ConvNet的输入时,网络会进行一次前向传播并给出每种类别可能性的输出(对一张新图片来说,输出的可能性是经过已经被优化过,可以正确分类之前的训练样本的权重所计算的)。如果你的训练集足够大,网络就可以很好地(但愿)泛化在新图像之上,并且将他们正确分类。


Note 1:上面的步骤是极度简化过后的,避免了数学上的细节从而感知训练过程。若要关注其中的数学公式并彻底理解,可以阅读文献[4]和[12]。


Note2:上面的例子中我们使用了两组交替的卷积池化层。但要注意,这些操作(译注:即卷积、激活、池化)可以在某卷积神经网络中重复使用任意次。实际上,今天一些表现最好的ConvNet中都有几十层的卷积池化层!还有要注意的是,并不是每个卷积层之后都一定要添加池化层。从图16中可看到,在池化前,我们使用了一连串各种各样的卷积+ReLU操作。同时也要注意一下图16的ConvNet中每一层是如何池化的。

图16


可视化卷积神经网络


一般而言,使用越多的卷积,我们的网络就有能力学习如何识别更复杂的特征。举个例子,在图像分类领域,一个ConvNet可能是学习如何用第一层中未经处理的像素值去检测边缘,之后用这些边缘区检测第二层的简单形状,再用这些形状去检测更高阶的特征,例如更高层中的面部形状[14]。如图17中所示——这些特征是使用一个叫做卷积深度信念网络(Convolutional Deep Belief Network)学习到的,在图中只是展示了一下这个idea(此处仅为示例:因为可能实际的卷积滤波器探查到的目标对我们人类来说毫无意义)。

图17


Adam Harley做了一个非常棒的可视化,这个可视化过程是识别MNIST手写数据集的卷积神经网络。我强烈推荐点击这里来理解CNN工作的细节。


我们可在下图中看到输入一个“8”,网络会如何工作。注意图18的可视化没有单独地展示ReLU层。

图18

输入图像包含1024个像素(32x32),第一层的卷积层(Convolution Layer 1)以6个唯一的5x5(步长为1)滤波器与输入图像的卷积构成。可以看到使用6个不同滤波器产生了深度为6的特征图,


第一层卷积层之后是第一层的池化层(Pooling Layer 1),它分别对第一层卷积层输出的6张特征图进行2x2的最大池化(步长为2)操作。你可以用鼠标指针指向池化层的任意一个像素来观察在前面的卷积层上形成的2x2的方格(如图19所示)。你会注意到池化层中像素值取的是这个2x2方格中最大的值(最亮的那个)。

图19


池化层1之后是16个执行卷积运算的5x5(步长为1)的滤波器。之后是进行2x2最大池化(步长为2)的卷积层2。这两层的主要思想和前面的一样。


随后使用三层全连接层(fully-connected,FC):

  • 第一层有120个神经元
  • 第二层有100个神经元
  • 第三层有10个神经元代表10个字符——也叫输出层。

注意图20中是如何表示的,输出层中的十个结点,每一个都和第二层的全连接层中的每个结点全部相连(所以叫全连接层)。


同时注意为什么输出层中“8”是唯一亮着的结点——这意味着网络正确地识别了我们的手写文字(更亮的结点代表输出更大,例如此处8比其他字符的可能性都要大)。

图20

可点击这里来查看三维可视化。



其他的ConvNet体系架构


卷积神经网络自20世纪90年代初开始出现。我们前面讨论的LeNet是最早出现的神经网络之一。其他有影响力的体系架构在[3]和[4]中有列出。


  • LeNet(1990s):上文已涉及。
  • AlexNet(2012):2012年,Alex Krizhevsky(等人)发表了AlexNet,它是LeNet的一个更深更广的版本,在2012年以巨大优势赢得了ILSVRC举办的ImageNet挑战赛。
  • ZFNet(2013):ILSVRC2013年的赢家是Matthew Zeiler和Rob Fergus。他们设计的神经网络被称为ZFNet(Zeiler和Fergus的首字母简写)。通过调整结构的超参数,对AlexNet进行了改进。
  • GoogLeNet(2014):2014年的ILSVRC的赢家由来自Google的Szegedy等人赢得。这个网络最大的贡献是对_初始模块_的进一步发展,他们极大地减少了网络所需要的参数数量(由AlexNet的60M减少到了4M)。
  • VGGNet(2014):2014年的ILSVRC的亚军由VGGNet获得。它的主要贡献在于,表明了网络的深度(层数)是网络取得良好性能的关键组成部分。
  • ResNets(2015):Kaiming He(等人)研究的Residual Network是2015年ILSVRC的赢家。ResNets是目前最先进的卷积神经网络模型,是在实际问题中使用ConvNet的默认选择(截止2016年5月)。
  • DenseNet(2016年8月):最近由Gao Huang(等人)发表的,Densely Connected Convolutional Network以前馈方式将每个层直接连接到其它层。DenseNet已被证明在五个竞争激烈的对象识别基准任务上比以前最先进的体系结构有着显著的改进。点击这里查看Torch中的实现。


结论


在本篇博文中,我尝试着用简单的语言解释卷积神经网络背后的主要概念。这其中有很多的细节我都简化/省略了,但希望这篇文章可以让你对其工作原理有个感觉。


本博文收到Denny Britz的Understanding Convolutional Neural Networks for NLP的启发,并且本文中的大量解释说明都是基于这篇文章的。要更好地理解这些概念,我推荐你去浏览关于Stanford’s course on ConvNets这门课程的notes,或者查看在引用中提到的其他非常优秀的资源。如果你有任何概念上的不理解或意见建议,欢迎在下面评论。


本文中所有的图片和动图版权归作者所有,引用中有标记。



引用

  1. karpathy/neuraltalk2: Efficient Image Captioning code in Torch, Examples
  2. Shaoqing Ren, et al, “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”, 2015, arXiv:1506.01497
  3. Neural Network Architectures, Eugenio Culurciello’s blog
  4. CS231n Convolutional Neural Networks for Visual Recognition, Stanford
  5. Clarifai / Technology
  6. Machine Learning is Fun! Part 3: Deep Learning and Convolutional Neural Networks
  7. Feature extraction using convolution, Stanford
  8. Wikipedia article on Kernel (image processing)
  9. Deep Learning Methods for Vision, CVPR 2012 Tutorial
  10. Neural Networks by Rob Fergus, Machine Learning Summer School 2015
  11. What do the fully connected layers do in CNNs?
  12. Convolutional Neural Networks, Andrew Gibiansky
  13. A. W. Harley, “An Interactive Node-Link Visualization of Convolutional Neural Networks,” in ISVC, pages 867-877, 2015 (link). Demo
  14. Understanding Convolutional Neural Networks for NLP
  15. Backpropagation in Convolutional Neural Networks
  16. arXiv:1603.07285
  17. What is the difference between deep learning and usual machine learning?
  18. How is a convolutional neural network able to learn invariant features?
  19. A Taxonomy of Deep Convolutional Neural Nets for Computer Vision
  20. Honglak Lee, et al, “Convolutional Deep Belief Networks for Scalable Unsupervised Learning of Hierarchical Representations” (link)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部