深度学习(卷积神经网络CNN)

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算法)。全连通层的工作原理是,根据之前其它层的输出(表示为高阶特征的激活图层),检测哪些特征与特定的类别相匹配。例如,程序若判定图像是一只狗,那么激活图层中表示狗的高阶特征,像是爪子、四条腿等特征将会具有很高的数值。再比如,程序若判定图像是一只鸟,那么激活图层中表示鸟的高阶特征,像是翅膀、鸟喙等就会具有很高的数值。基本上,全连通层的工作就是寻找与特定类别匹配的高阶特征,并设定相应的权重值。这样当我们把之前层的结果通过权重进行计算后,就能够正确估计其属于某一类别的可能性了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值