[转] 卷积神经网络详解
转自: https://zhuanlan.zhihu.com/p/26954569?utm_source=qq&utm_medium=social https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/
伊晓强
讲卷积神经网络的不少,这篇讲的比较通俗详细。
本文直接译自 https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/,其中涉及的的内容,图片,动画均归原作者所有。
卷积神经网络的直觉解释
什么是卷积神经网络,为什么它如此重要
卷积神经网络(Convolutional Neural Networks, ConvNets, CNN) 已经证实是一种在图像识别和分类方面非常有效的神经网络。ConvNets成功运用于人脸识别,对象识别和交通信号灯识别,以及助力机器人和自动驾驶等视觉功能。
图1
图1中,ConvNet 能够识别一个场景,系统能够给出相应的标签,如“桥”、“铁路”和“网球运动”。而图2给出了识别日常物体、人和动物的实例。最近,ConvNet在NLP的任务处理中也有很好效果(如句子分类)。
图2
ConNets 今天已经成为机器学习的重要工具。但是,对初学者来说,理解和学习 ConNet可能是个痛苦的经历。本文通过图像处理的例子,让读者理解CNN是如何工作的。
如果你是人工神经网络的新手,我推荐阅读神经网络快速指南(A Quick Introduction to Neural Networks),初步了解它的工作原理。本文中的多层感知机指的是“全连接层”。
LeNet 架构(1990)
LeNet 是早期的卷积神经网络之一。它带动了整个深度学习的发展。这个开创性的工作是由Yann Lecun 做的,称为 LeNet 5。之前,它经过了从1988年开始的几次成功的迭代。当时,LeNet 主要用于字符识别,如邮政编码以及数字识别等。
下面,我们从直觉的角度描述LeNet架构如何学习识别图像。近年来,有一些新的架构,他们多是基于LeNet 发展而来的,使用了几乎相同的概念。一旦理解了LeNet,这些新的架构就好理解了。
图3, 一个简单的ConvNet
图3中的CNN 和最初的LeNet很接近,它把输入图像分类成4个不同的类型:狗,猫,船或者鸟(最初的LetNet用于识别字符)。如上图所示,输入图像是个船,网络在4个分类中把最高的概率(0.94)正确的分配给了“船”。输出层各个概率的和应该是1(本文后面解释)。
图3展示了ConvNet的四种操作:
-
卷积
-
非线性(ReLU)
-
池化或者子采样
- 分类(全连接层)
这四个部分是每一种CNN的基本组成部分。理解这些部分如何工作很重要。下面描述这些操作的直观理解。
图像就是像素点矩阵
图4 每个图片就是一个像素值矩阵
彩色图片有三个“通道”,分别是红色,绿色,蓝色。构成3个二维矩阵。每个像素值的取值范围是0~255。
灰度图只有一个通道,本文只考虑这种情况,即,用一个二维矩阵表示一个图片。每个像素取值是0~255,其中,0表示黑色,255表示白色。
卷积
ConvNet由它的卷积操作得名。卷积操作的目的是从图像中获取特征。卷积操作通过使用输入数据小正方形区域学习图像特征来保留像素间的空间关系。我们这里不去讲解卷积的数学细节,但去理解它如何在图像上工作。
如上面的讨论,图像就是一个像素值矩阵。考虑一个5*5的矩阵,像素值都是0或者1。
同时,考虑另一个3*3的矩阵。
图5 卷积操作,输出矩阵叫做卷积特征或者特征图
然后,卷积的操作就如图5的动画所示。
花点时间了解上面的操作是如何进行的。我们把橙色的矩阵一个像素一个像素(称为步长)的沿每个位置划过绿色的原图,两个矩阵进行元素级别的乘法,再做和,得到粉色的输出矩阵。注意,3*3矩阵每个步骤只看到部分的图像。
在CNN术语里面,3*3矩阵称为“过滤器”,或者“核”,或者“特征探测器”。结果矩阵叫做“卷积特征”,“激励图”或者“特征图”。有必要说明,最初输入图像的过滤器材称为“特征探测器”。
很明显,对相同的输入图像,不同的过滤矩阵会产生不同的特征图。举例如下:
有这样一个图片:
下图中,可以看到使用不同的过滤器的效果。如其所示,我们只需要改变过滤矩阵的值就可以进行边缘检测、锐化和模糊,即,不同的过滤器能够获取图像的不同特征。更多示例在 8.2. Convolution Matrix
下面的动画提供了理解卷积操作的另一个好方法。
(以下图片请参看原链接) https://ujwlkarn.files.wordpress.com/2016/08/giphy.gif?w=748
图6 卷积操作
红色外框的过滤器划过输入图像(即卷积操作)产生一个特征图。对同一个图像,绿色外框的过滤器给出了不同的特征图。需要说明的是,卷积操作获取的是输入图像的局部依赖。也注意,对同一个图像,两个不同的过滤器如何产生不同的特征图。记住,这些图像和过滤器都是数字矩阵而已。
实践中,CNN是通过训练学到这些过滤器的值的(尽管我们仍然需要指定一些参数:如过滤器数量,过滤器大小,网络结构等)。过滤器越多,提取的特征就越多,我们的网络在识别未见过的图片时越好。
特征图(卷积特征)的大小由三个参数控制,需要在进行卷积操作之前确定:
- 深度:深度对应过滤器的数量。图7中,使用3个过滤器来对小船的图进行卷积操作,因而,产生3个不同的特征图。你可以把这3个特征图看成是堆叠的二维矩阵,即,这个特征图的深度是3。
图7 卷积操作
-
步长:即每次滑动的像素间隔。当步长是1时,每次滑动的间隔就是1个像素。当步长是2时,每次滑动就跳过一个像素。更大的步长会产生更小的特征图。
- 0填充:有时候,用0填充输入图像的边界是很有必要的,这样,过滤器就能作用到输入图像矩阵的边界像素上。0填充的一个好的特性是它使我们可以控制特征图的大小。增加0填充也叫宽卷积,不使用0填充的叫窄卷积。
非线性 (ReLU)
每次卷积操作之后的操作叫做ReLU。如图3所示,ReLU 代表Rectified Linear Unit,它是个非线性操作。它的结果由下图所示公式给出:
图8 ReLU 操作
ReLU 是像素层面的操作(应用到每个像素),把特征图里面所有的负的像素值设置成0。ReLU的目的是在ConvNet中引入非线性,因为我们的ConvNet需要学习的现实世界的数据是非线性的(卷积操作是个线性操作-矩阵元素层面的乘法和加法,因此,我们引入非线性函数,如ReLU来增加非线性)。
ReLU可以由图9理解。它显示图6中获取的特征图应用ReLU操作。
图9 ReLU 操作
也可以使用其他的非线性函数,如tanh,sigmoid等等。ReLU在多数情况下表现更好。
池化
空间池化(也叫子采样或者下采样)缩减每个特征图的维度但同时保留了最重要的信息。空间池化可以有不同的类型:Max, Average, Sum 等等。
在 Max 情况下,我们定义一个空间矩阵(例如2*2),取出该窗口中非线性特征图的最大值。也可以去均值或者和,实践中,最大池化工作最好。
图10 显示一个例子:使用2*2 窗口在非线性特征图(由卷积和ReLU操作获得)获取之后的最大池化操作:
图10 最大池化
我们以2为步长滑动2*2的窗口,并取出每个区域的最大值。如图10所示,这减少了特征图的维度。在如图11所示的网络中,池化分别应用于每个特征图(注意:因此,我们从三个输入图中获得三个输出图)。
图11 应用于非线性特征图的池化操作
图12 展示图9 中ReLU操作之后池化操作的效果
图12 池化操作
池化功能逐渐的减小输入表示的空间大小。特别地,池化操作
-
使输入表示(特征维度)更小,更可控
-
减小参数数量和网络计算量,因而,控制过拟合
-
使网络对输入图像小的变换,变形保持平稳(输入图像一个小的变形对池化结果没影响,因为我们取的是局部区域的最大值或者均值)
- 帮助达到输入图像的伸缩性平稳表达。(术语叫等变化)。这非常强大,因为我们能够探测到图片中的物体,不管它是如何摆放的。
小结
图13
到目前为止,我们了解了卷积,ReLU和池化。需要知道的是,这构成了任何一种CNN的基本模块。如图13所示,有两个卷积、ReLU和池化层。第二个卷积层用6个过滤器,对第一个卷积层的池化输出进行卷积操作,得到6个特征图。然后,每个特征图分别应用ReLU操作。再对6个特征图分别进行池化图操作。
总结:这些层从图像中提取了有用的特征,在网络中引入非线性,减少特征维度,同时致力于使特征对变形和伸缩等变化。
第二个池化层的输出作为全连接层的输入层,下节讨论。
全连接层
全连接层是传统的多层感知机网络。在输出层使用softmax激励函数。(其他分类器如SVM也可以用,但本文只针对softmax讲解)。“全连接”的意思是前层的每个单元都连接到后层的每个单元。
卷积和池化层的输出代表输入图像的高端特征。全连接层的作用是基于训练使用这些特征把输入图像分类成不同的类型。例如,图像分类任务有四个可能的输出。如图14所示(注意,图14并没有显示所有的连接)。
图14 全连接层 – 每个元素都和相邻层的元素连接
除了分类,增加全连接层通常也是学习特征非线性组合的廉价方式。从卷积和池化输出的特征有利于分类,但这个特征的组合可能会更好。
全连接输出的概率和是1。这是由全连接层的输出层,即作为激励函数的softmax函数保证的。Softmax把任意值组成的矩阵转换成和为1,每个元素是0到1的矩阵。
如上讨论:卷积+池化实现输入图像的特征提取,而全连接实现分类。
注意图15中,因为输入图像是船,目标的概率就是:船是1,其他是0:
-
输入是船
- 目标向量:[0,0,1,0]
图15 训练ConvNet
CNN训练的总体过程总结如下:
-
步骤1:用随机值初始化所有的过滤器,参数/权重
-
步骤2:网络训练输入图像,用前向传播(进行卷积,ReLU,和池化操作,以及全连接层的前向传播),发现每个类型的输出概率
-
假如输出船的概率是[0.2,0.4,0.1,0.3]
- 因为输入权重是随机的,所以第一个结果也是随机的
-
-
步骤3:计算输出层总的误差
- Total error = Σ 1/2 (目标概率-输出概率)^2
-
步骤4:使用反向传播算法计算误差对网络中所有权重的梯度,使用梯度下降更新所有过滤器值/权重和参数,来最小化误差。
-
权重按照对误差贡献的大小进行了调整
-
当用同一个输入图像训练,输出概率可能是[0.1,0.1,0.7,0.1],它更接近目标矩阵[0,0,1,0]
-
这意味着网络已经通过调整权重/过滤器,进而减小误差,学会了正确识别这个图像
- 参数,如过滤器数量,过滤器大小,以及网络结构等,是在第1步之前就确定的,因此在训练过程中并不变-只有过滤器和权重被更新。
-
- 步骤5对训练集里的所有图片重复步骤2-4
上面的在步骤训练ConvNet – 这意味着ConvNet的所有权重和参数被优化能够正确的分类训练集中的图像。
当一个新的图像(没见多的)输入到这个ConvNet中,网络将执行前向传播操作,并为每个类型输出一个概率(对新图像,使用正确分类前述的训练集优化得到的权重计算输出概率)。如果训练集足够大, 网络将(希望上)会泛化的很好,进而能进行正确分类。
注意1:前面的描述是简化的描述,许多数学细节被忽略了。
注意2:例子中我们使用 两套卷积和池化层。注意,这些操作可以在一个网络中重复任意次。实际上,今天一些性能最好的ConvNet有几十个卷积和池化层! 同时,也不是每个卷积层后面必须要有个池化层。如图16所示:我们可以在池化之前有连续多个卷积+ReLU操作。同时,图16展示每层的可视化。
图16
可视化卷积神经网络
通常,卷积步骤越多,网络就会学到越多的特征。例如,图像分类中,ConvNet可以在第一个层里面从原始像素里面探测到边缘,然后在第二个层次里面用边缘探测到简单的物体,进而从这些形状探测更高层次从特征,如脸部识别。这个过程如图17所示,这写特征使用卷积深度置信网学习。这个图只是用来阐述思想(这只是个例子,实际生活中的卷积过滤器可以探测到对人来说无意义的特征)
图17 卷积深度置信网学到的特征
Adam Harley 创建了MNIST手写数字数据库训练的CNN非常好的可视化。我强烈推荐看一下了解CNN是如何工作的。
下面看网络是如何处理“8”的。注意,图18没有单独显示ReLU操作。
图18 可视化训练手写数字训练ConvNet
输入图像是1024像素(2424),第一个卷积层,有6个55(步长1)的过滤器。可以看到,使用6个不同的过滤器产生深度为6的特征图。
卷积层1之后是22(步长是2)的最大池化层。你可以把鼠标放在池化层任意一个像素上,观察前一个卷积层44的网格。你会发现这个像素点是该网格的最大值(最亮值)。
池化层1 紧跟着16个55(步长1)的卷积过滤器。之后跟着池化层2:22(步长2)的最大池化。这两层概念同上。
然后是全连接网络:
-
第一层120个单元
-
第二层100个单元
- 第三层10个单元,对应10个数字,也叫输出层
注意图20,输出层的每个单元都连接到第二层的100个单元。
图20 可视化全连接层
其他 ConvNet 架构:
-
LeNet(1990s):本文涉及到
-
1990s到2012:这个阶段是CNN的培育阶段。随着越来越多的数据和计算能力,CNN能够处理的任务越来越有趣。
-
AlexNet (2012):由Alex Krizhevsky(及其他人)发布。它是LeNet更深更广的版本,大幅领先获得2012 ILSVRC竞赛的胜利。这和过去的方法相比是个巨大的突破,现在CNN 广泛的应用可以归功于这个工作。
-
ZF Net (2013):ILSVRC 2013的获胜者是来自 Matthew Zeiler 和 Rob Fergus的CNN。以ZF网络著称(取二人名字首字母)。这个网络是AlexNet的改进,通过调整一些超参数。
-
GoogleNet (2014) :ILSVRC 2014获胜者是来自Google 的 Szegedy 等人的CNN。主要的贡献是Inception Module,大幅减少网络中参数的数量(4M,AlexNet是60M)。
-
VGGNet (2014):ILSVRC 2014 第二名获得者是VGGNet。主要贡献是展示网络深度(层数)是决定性能的关键因素。
-
ResNets (2015): ILSVRC 2015获胜者是HeKaiming的残差网(Residual network)。这个网络是目前最好的网络,是实际应用的首选。
- DenseNet (2016年 8月)最近 Gao Huang 发表的Densely Connected Convolutional Network 每层和其他层都连接,在五个竞争激烈的对象识别benchmark中都获得重大改进。Torch对它有实现。
结论
本文中,用简单术语描述CNN背后的概念。有些细节过于简单化或者被跳过,但是希望这篇文章能够给你们带来他们如何工作的直觉感受。
本文启发于Denny Brits 发布的Understanding Convolutional Networks for NLP 。(我推荐读一下这篇文章)。有一些解释来源于那篇文章。对这些概念更彻底的理解,我建议你们读一下 Standord’s course on ConvNet 的注释,和其他一些下面链接提到的资源。如果有问题,请在下面留言。
本文的所有图片和动画属于各自的参考文献中的作者。
参考:
References
-
Clarifai Home Page
-
Shaoqing Ren, et al, “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”, 2015, arXiv:1506.01497
-
Neural Network Architectures, Eugenio Culurciello’s blog
-
CS231n Convolutional Neural Networks for Visual Recognition, Stanford
-
Clarifai / Technology
-
Machine Learning is Fun! Part 3: Deep Learning and Convolutional Neural Networks
-
Feature extraction using convolution, Stanford
-
Wikipedia article on Kernel (image processing)
-
Deep Learning Methods for Vision, CVPR 2012 Tutorial
-
Neural Networks by Rob Fergus, Machine Learning Summer School 2015
-
What do the fully connected layers do in CNNs?
-
Convolutional Neural Networks, Andrew Gibiansky
-
A. W. Harley, “An Interactive Node-Link Visualization of Convolutional Neural Networks,” in ISVC, pages 867-877, 2015 (link)
-
Understanding Convolutional Neural Networks for NLP
-
Backpropagation in Convolutional Neural Networks
-
A Beginner’s Guide To Understanding Convolutional Neural Networks
-
Vincent Dumoulin, et al, “A guide to convolution arithmetic for deep learning”, 2015, arXiv:1603.07285
-
What is the difference between deep learning and usual machine learning?
-
How is a convolutional neural network able to learn invariant features?
- A Taxonomy of Deep Convolutional Neural Nets for Computer Vision 发布于 2017-05-17