A Beginner's Guide To Understanding Convolutional Neural Networks


Introduction


        卷积神经网络CNN,虽然它听起来就像是生物学、数学和计算机的奇怪混杂产物,但在近些年的机器视觉领域,它是最具影响力的创新结果。随着Alex Krizhevsky开始使用神经网络,将分类错误率由26%降到15%并赢得2012年度ImageNet竞赛(相当于机器视觉界的奥林匹克),它就开始声名大噪了。从那时起,一票公司开始在它们的核心服务中使用深度学习技术。例如Facebook用它进行自动的图像标签,google用它做照片检索,amazon用它做产品推荐,Pinterest用它做个性化家庭定制推送(?),Instagram用它搭建他们的搜索架构。

        基于CNN最经典也是最流行的应用应当是图像处理领域。那么,就让我们看看怎样使用CNN技术来设计图像分类算法。

The Problem Space

        图像分类主要指将输入图像进行硬分类或模糊分类(例如猫图、狗图等)。对于人类来说,这是出生后就应当学会的第一个技能,并在成人后能够做到非常轻松自然地做到这一点。我们能够不假思索地连续快速地分辨所处的环境,周边事物等。无论我们看到图片还是真实景象,都能够马上对其进行判断并打上标签,有时候这种行为就是下意识的。这种识别技术主要基于人们的先验知识与环境,而这些是我们的机器所无法拥有知识的。


Inputs and Outputs

        当我们的电脑看到一副图片时,机器只是看到一个由像素值组成的矩阵,例如说32*32*3,其中32表示其分辨率或图像大小,3表示RGB三原色。为了把问题阐述清楚,我们这里定义一个JPG格式的彩色图像,大小为480*480,那么表示的矩阵就是480*480*3。矩阵里每一点取值范围0-255,表示为该点的像素强度(灰度值)。在我们人类进行图像识别的时候,这些像素点一点儿意义也没有,它们只是作为机器进行图像识别的输入而已。机器的输出呢,可以是一组概率值,这组概率值表明了当前的图像是某一类图像的可能性有多大。(比如0.8可能性是猫,0.15可能性是狗,0.05可能性是鸟等)

What We Want the Computer to Do

        我们知道了问题的输入和输出,现在要考虑该怎么解决它。我们想要计算机做的是分辨出所有给出的图中所具有独特特征,例如说狗图或猫图的独特特征,这些特征是在某一分类图中一致,而跟其它类型图不同。这件事在我们自己的脑中同样也是自动完成的。例如,当我们看一副狗图时,我们能够根据图中物体的爪子或4条腿分辨其是小狗。类似地,计算机也可以通过寻找一些低等级特征,例如边缘或纹理等,并由此通过一系列卷积层来建立更抽象的概念,来实现分类识别。大体上这就是CNN所做的事。接下来让我们更具体地展开说。

Biological Connection

        先让我们从一些背景知识开始吧。当你第一次听到卷积神经网络(CNN)这个短语时,也许你会想起生物神经科学领域的一些东西;可以说,某种程度上你是对的。CNN是从神经生物学中视觉皮层这个概念上获取了灵感。在大脑的视觉皮层中,有着许多由细胞组成的,对特定的视觉领域敏感的微小区域。这个理论由Hubel以及Wiesel在1962年通过实验获得了证实。(Video) 在实验中,大脑内一些独立的神经元细胞仅对给实验者展示的某些特征放电或有反应,例如特定方向的边缘。例如,在展示垂直边缘、水平边缘或对角线边时,一些神经元开始放电。Hubel和Wiesel发现,这些神经元聚集并被组合成为纵列或柱形的结构,从而产生视觉。在一个系统整体中,不同的部分负责不同的任务(例如视觉皮层的神经元细胞负责感知视觉),这样的构造,正是CNN的基础。

Structure

        回到细节里来。针对CNN的具体行为,一个更加细化的视角是,用户将图像经过一系列卷积、非线性、池化(下采样)、以及全连通层后,获得了输出结果。就像之前说的,这种输出结果也许是一个用于描述该图像的分类结果或是一个分类的可能性。现在的难点在于,如何理解每一层都做了些什么。那么,让我们进入这个最重要的部分。

First Layer – Math Part

        CNN的第一层通常都是卷积层。你必须记住的第一件事应当是卷积层(conv layer)的输入是什么。就像之前说的,输入是一个32*32*3的像素数列。要解释这个卷积层,最好的办法就是想象一下下面场景:你举着手电筒将光束打在一幅图像的左上角。我们假定这个光束覆盖的范围是5*5。那么现在,想象光束逐渐滑动平移,经过整幅图像。在机器学习的语言里,这个手电筒就被称作滤波器filter(或神经元neuron,或内核kernel),而它照过的区域叫做感知区(receptive field)。这个滤波器也可以表示为一个数组(数组中的数字可称为加权weight或参数parameter)。一个重要的点在于,滤波器的深度必须跟输入图像深度一致(才能保证计算不出错)。那么,这个滤波器的维度就变成了:5*5*3。现在,以这个滤波器最初的位置为例,它应当处于图像的左上角。随着滤波器的平移(或称卷积convolving),经过整幅图像。它将自身数组中的值与图像对应位置的像素值进行相乘(即点乘),将点乘结果加起来(数学上一共有75次乘加),就有了一个数。记住,这个数只代表滤波器在图像左上角初始位置时的卷积值。现在,我们一边移动滤波器一边重复这个计算(顺序是从左到右,然后从上到下。下一步是往右移一个像素)。这样,图像上每个单独的像素位置都会产生一个滤波(卷积)后的数值。在遍历整个图像后,你会得到一个28*28*1的数列,我们称之为激活图activation map或特征图feature map。28的原因是32-5+1=28。这样一共就有784个值。


        (注:上图使用的图片,是从这本特别棒的书中引用的 "Neural Networks and Deep Learning" by Michael Nielsen. 强烈推荐它)

        如果现在我们有两个5*5*3的滤波器,而不是一个,那么输出结果就会变成28*28*2,随着使用越来越多的滤波器,我们能够获取到越来越多的空间维度信息。从数学的角度,这就是卷积层所做的事。

First Layer – High Level Perspective

        让我们讨论一下,从更高的层面上,该如何看待这个卷积层所做的事。事实上,这些滤波器可以看做是特征识别器。这里的特征,指的是那些直线边缘、颜色、纹理等。考虑所有图像中都共通的一些最简单的特征。让我们把第一个滤波器改成大小为7*7*3的纹理识别器。(在这个章节,为了降低复杂度,我们忽略滤波器与图像的深度,仅考虑其顶层的灰度数列及其计算)。作为一个纹理识别器,它的像素结构将会在纹理形状的对应区域内具有较高的数值。(记住,所有的滤波器都只是数值和数值的组合)


        现在,让我们回到数学上。当我们把滤波器放到图像左上角时,它开始进行7*7范围的内积计算。这里我们用给出的特征提取滤波器举一个例子,见下图。    


        记住,我们做的事是矩阵对应的像素值相乘再相加。


        基本上,在输入图像中,如果当前形状跟我们的滤波器大体相像,卷积后的计算结果将会是一个很大的值!那么让我们看看如果移动滤波器到其它位置会发生什么。


        计算结果很小!这是因为滤波器和当前形状完全不同。记住,这个卷积层的输出是一个激活图层(activation map)。那么,针对这个单边缘滤波器卷积的简单例子来说,它的激活图层(activation map)将会展示出当前图像中最有可能是边缘特征的区域。在上图中,左上区域的卷积结果为6600,这个大数值表明图中对应位置有这样的边缘特征使得滤波器被激活了。而右上区域的值为0,表示当前区域没有任何能够激活滤波器的特征。(或更简单地说,图中该区域没有对应的图像特征)。记住,这只是一个滤波器。这只是一个检测竖直向右偏线状特征的滤波器。我们可以再添加其它滤波器用于检测竖直左偏或垂直特征等。滤波器越多,激活图层activation map的深度就越深,对于输入图像我们就能够获取到越多的信息。

        声明:文中所述的滤波器是为了卷积计算上的简化而定义的。下图给出了一些用于第一卷积层的实际滤波器示例,但主要参数(原理)还是类似的。第一层的滤波器通过对输入图像的卷积和“激活”(或计算极值点),来寻找输入图像中特定的特征。


        (注:上图来自于斯坦福Andrej Karpathy以及Justin Johnson CS 231N course 。推荐给需要深入理解CNN的朋友们)

Going Deeper Through the Network

        在传统的CNN结构中,在这些卷积层之间还夹杂有其它类型的层。我强烈建议大家去钻研并理解它们的功能和效果,这里仅给出一个大致的介绍。这些层提供了非线性特性nonlinearities与维度保留特性preservation of dimension用于提高整个网络结构的鲁棒性以及控制过拟合(control overfitting)。一个经典的CNN结构像下图所示:


        然而,最后一层是非常重要的一层,我们稍后会介绍。现在让我们回过头来看看到目前已经学了哪些东西。我们讨论了第一卷积层的滤波器的设计与检测方法。它们用来检测边缘、纹理这类低阶特征。正如大家想象的,要想预测图像中的事物,我们需要一个网络结构用于识别像手掌、爪子、耳朵这样的高阶特征。然后让我们想一下第一卷积层的输出应当是什么:一个28*28*3的数列结构(假设我们用的是三个5*5*3的滤波器)。当我们进入第二个卷积层的时候,第一卷积层的输出就变成了第二卷积层的输入。这就比较抽象,比较难以想象了。要知道,当我们讨论第一层时,输入就是未经处理的原始图像;但是,当我们讨论第二卷积层时,输入已经变成了第一层的卷积结果,也就是一个激活图层activation map。这个输入的每一层基本上描述了某些低阶特征在原始图像中出现的位置。现在,当你把它输入给第二层,也就是再使用一系列滤波器对其卷积时,输出就应当是表示更高阶特征的激活图层,例如说半圆(结合了一个曲线和直线边缘)、方形(结合了一些直线边缘)等。当你将数据继续经过更多的卷积层时,你就会得到更加高阶特征的激活图层。在整个网络的最后,你也许会用一些滤波器用以激活图像中的手写特征handwriting、粉红色 物体pink object等。如果你想知道更多关于滤波器可视化的信息,Matt Zeiler与Rob Fergus在他们的ConvNets模型与其研究论文research paper中有精彩的阐述。同样,在YouTube上,Jason Yosinski提供了一个非常棒的讲解视频video。另外一件有趣的事是,当你的网络结构越深,滤波器的感知区域范围就越大,这意味着它们在处理时,能够将对应原始图像中更大区域的信息都揽括在内(能够对更大的像素空间进行反应和感知)。

Fully Connected Layer

        检测出高阶特征后,我们可以锦上添花地在网络结构的最后添加一个全连通层fully connected layer。全连通层输入一个数列(无论这个输入是来自卷积层conv、线性整流ReLU层还是池化层pool),输出一个N维向量,N是由程序指定的分类类别数量。例如,对于一个数字分类程序,N就应该取10(0~9共10个数字)。这个N维向量中的每一个数字表示被分到该类的几率。例如,还是针对数字分类程序的分类结果为[0 .1 .1 .75 0 0 0 0 0 .05],这就表示这个输入的图像为1的概率有10%,为2的概率10%,为3的概率75%,为9的概率5%。(注:输出的表示方法不止这一种,这里只是展示了这种小数概率表示的softmax算法)。全连通层的工作原理是,根据之前其它层的输出(表示为高阶特征的激活图层),检测哪些特征与特定的类别相匹配。例如,程序若判定图像是一只狗,那么激活图层中表示狗的高阶特征,像是爪子、四条腿等特征将会具有很高的数值。再比如,程序若判定图像是一只鸟,那么激活图层中表示鸟的高阶特征,像是翅膀、鸟喙等就会具有很高的数值。基本上,全连通层的工作就是寻找与特定类别匹配的高阶特征,并设定相应的权重值。这样当我们把之前层的结果通过权重进行计算后,就能够正确估计其属于某一类别的可能性了。


Training (AKA:What Makes this Stuff Work)

        现在这个部分是我特意在之前的讨论中未提及的,很可能是关于神经网络的最重要的部分。也许你在之前的阅读时会有很多问题。比如,第一卷积层的滤波器怎么知道该如何查找边缘和纹理?而全连通层又是怎样知道该如何查找激活图层的?每一层的滤波器都是怎样设定其值的?计算机在解决这些问题时主要依靠一个训练过程training process,称作反向传播算法backpropagation(BP算法)。

        在讨论反向传播之前,我们必须先回过头来讲讲让神经网络(生物学意义上的)工作起来需要什么。当我们出生时,我们的大脑是一片空白的。我们并不知道什么是猫、狗、鸟儿。类似地,在CNN运行之前,滤波器的数值和权重等参数都是随机的。滤波器并不知道该如何寻找边缘和纹理。高阶层的滤波器同样也不知道该如何寻找爪子、鸟喙这类高阶特征。当我们逐渐长大,父母以及老师会利用照片、影像与之对应的标签来教会我们这些动物的辨别方法。这种利用标签的图片同样也是CNN所使用的训练过程。在深入研究之前,我们先简单地打个比方:我们有一个训练集,其中有几千张图片,绘制着猫、狗、鸟儿,同时每张图片上都有一个标明这是哪种动物的标签label。好的,现在回到我们的反向传播算法。

        反向传播算法可以分为4个部分:前向传播forward pass,损失函数loss function,反向传播backward pass,权重更新weight update。在前向传播的过程中,你将一个训练数据(32*32*3的图像数列,表示一个数字)输入整个网络。由于所有权重或滤波器系数都是随机生成的,输出很可能是类似这样的结果[.1 .1 .1 .1 .1 .1 .1 .1 .1 .1],基本上这样的输出难以判别是一个有效分类的。系统以目前的参数/权值是很难寻找低阶特征,并且也很难以此进行可靠的分类的。于是进入算法的损失函数阶段。记得我们刚才使用的输入是训练数据,那么除了图像数列外还附带标签。比方说这个输入的训练数据是3,那么标签就应当是[0 0 0 1 0 0 0 0 0 0]。通过其输出结果和标签的比较,就能够计算损失函数了。损失函数的定义方法很多,这里就用一个常见的均方差算法MSE(mean squared error),如下式


        这里我们使用变量L保存这个损失函数的结果。可以想象,在训练刚开始时这个值会相当的大。现在让我们用直觉去想想,我们想要找到一个“点”使得预测的标签(也就是网络的输出)和训练标签相同(这意味着我们的网络预测的结果是正确的)。那么我们需要做的就是最小化损失函数L。将其具象化,其实就是一个演算calculus优化的问题,我们想要找到哪些输入(在我们的系统中就是权值)更直接地影响到损失L,或者说误差。

    

        上图表示,针对这个问题具象化的一个方法是将其放在由一个误差(损失相关)坐标轴、两个权值坐标轴组成的3D图中。(当然大部分神经网络的权值显然大于2,这只是为了简化)。想要最小化误差值就需要不断调节权值w1和w2。用图上的话说,我们要找到这个碗状曲面的z轴最低点。要做到这一点,就需要求出误差在各个方向(权值)上的导数(斜率)。

        在数学上,这等价于针对某一层的权重W,计算导数dL/dW。那么现在,我们想要做的就是对网络进行一次反向传播backward pass,以判断哪些权重对损失L有较大的影响,并且调整这些权重以减小损失。一旦导数计算出来之后,我们就可以进行最后一个步骤:更新权重。我们将所有滤波器的权重进行更新使得它们随着其梯度方向的变化而改变(change in the direction of the gradient梯度下降法?)


        学习速率learning rate是由程序员所指定的参数。高学习速率表明在进行权重更新的跨度大,这样模型就能更快地汇集到最优的权重集上面来。但是,过高的学习速率有可能导致跨度过大而难以精确地收敛到最优解上。


        这整套流程:前向传递forward pass、损失函数loss function、后向传递backward pass、参数更新parameter update合起来称为一代epoch。针对每个训练图像,程序会重复进行多代epoch的训练。每次迭代结束后,我们都希望能够让网络通过良好地训练,正确地调节其每层的权重。

Testing

        最后,要想验证我们的CNN是否运作正确,我们需要准备另外一套数据和标签(不能与训练集重复!),将其送入CNN进行测试。我们会比较输出结果与金标准ground truth是否一致,以验证网络是否正确。

How Companies Use CNNs

        数据,数据,数据。这神奇的单词,那些有着大量数据的公司才能在激烈的市场竞争中获得潜在的先机。在网络训练的过程中,你的训练数据量越大,能够进行的训练迭代就越多,能够进行的权重调整也越多,调优的结果就越好。Facebook与Instagram公司拥有旗下数亿规模用户照片;Pinterest公司的网站上也有500亿张拼趣图片pin供其使用;Google坐拥海量的用户搜索数据;而Amazon则每天都在接收着几百万项用户产品购买的信息。现在你能明白隐藏在这些数据之下的魔力了吧。

Disclaimer  

        尽管这篇文章是针对CNN模型的入门材料,但其并不是一个全面广泛的深度学习概述。文章并没有提及很多重要的概念,例如非线性nonlinear和池化pooling层、网络的超参数(滤波器规格size、步长stride、衬垫?padding)等。同样地,例如网络架构、批规范化batch normalization、梯度消失vanishing gradients、dropout、初始化技巧、非凸优化non-convex optimization、biases、损失函数的选取、数据增强变换data augmentation、规整化regularization method、计算性能考虑computational consideration、反向传播修正优化等概念,都没有提及。




  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值