大数据文摘作品
编译 | 璐,高宁,樊恒岩,田奥
简介
卷积神经网络听起来像一个奇怪组合。这个名字涉及了生物学、数学,还有一点计算机科学乱入,但它却是计算机视觉领域最具影响的创新。在2012年,由于Alex Krizhevsky使用神经网络赢得了ImageNet挑战赛的冠军(这个比赛可被看作计算机视觉领域的奥运会),神经网络第一次崭露头角。神经网络把分类误差从26%降低到15%,这在当时是一个令人震惊的进步。
从那以后,大量公司在他们的核心业务中使用深度学习。Facebook把神经网络用在自动标签算法上,google把它用于相片搜索,亚马逊把它用于产品推荐,Pinterest把它用于房屋列表个性化,Instagram把它用于搜索框架。
然而,神经网络经典且最常用的使用案例仍是图像处理。就让我们一起来看看,CNN(卷积神经网络)是如何在图像处理任务中实现图像分类的。
问题描述
图像分类这项任务旨在把输入的图片分入某一特定类别(例如一只猫或者狗等)或者可能性最大的类别。对我们人类而言,图像识别的能力是我们从出生起就在学习的一项任务,这项任务对于成年人来说更是不费吹灰之力。无需多想,我们就能迅速而准确地识别出我们所处的环境和我们周围的物体。大多数时候,当我们看到图片或者是周围的世界时,甚至不用刻意观察,我们就可以立刻描绘出场景的特征,并给每个物体贴上标签。这些迅速识别模式、归纳知识以及适应不同图像与环境的技能一直是机器难以拥有的。
输入和输出
当电脑看见一张图像(把图像作为输入),它实际上看到的是一个由像素值组成的数组。基于分辨率和图像的大小,它会看到一个32 x 32 x 3的数组(3指的是RGB的值)。假设我们有一张JPG格式、大小为480 x 480的彩色图片,那么它对应的就是一个480 x 480 x 3的数组。数组中的每一个数字都是介于0到255之间的,这些数字代表像素在这一点的强度。尽管这些数字对于人类做图像分类是毫无意义的,它们却是电脑唯一能得到的输入信息。计算机识别图像的基本思路是,你把这个数组输入给电脑,它就会输出一个数字,代表该图像属于某一特定分类的概率(例如,80%的概率是猫,15%的概率是狗,5%的概率是鸟)。
计算机的任务
现在我们知道了问题所在,以及输入和输出,下面我们就该来思考一下怎么完成这个过程了。我们希望计算机能够区分开我们输入的所有图像,并且识别出其独特的特征,比如哪些特征是狗特有的,哪些是猫特有的。这个过程也会在我们的大脑中下意识地进行。当我们观察狗的图片时,我们会在图片中寻找可识别的特征,例如爪子或者4条腿,这样我们就能将它正确地分类。同样的,通过寻找例如边缘和曲线之类的底层特征,并通过一系列的卷积层建立一个更加抽象的概念,电脑也能进行图像分类。这是CNN工作原理的概览。下面让我们来了解一下它工作的细节。
与生物学的联系
首先,讲一点背景知识。当你刚听到卷积神经网络这一术语时,你可能会想到神经学或者生物学。没错,就是这样!一定程度上,CNN确实从视觉皮层的生物学中汲取了灵感。视觉神经中有一个小分区中的细胞对特定视觉区域很敏感。这个想法是从Hubel和Wiesel在1962年做的一个有趣的实验中扩展得来的。实验显示,大脑中的一些特别的神经细胞只会对特定方向的边缘做出反应。例如,一些神经元在看到垂直的边缘时会被激发,而另外一些则会被水平或者斜对角边缘激发。Hubel和Wiesel发现所有这些神经元都排列在一个圆柱构架中,它们一起工作,产生视觉感知。系统中特定部件完成特定任务的想法(视觉皮层中的神经细胞寻找特定特征)对机器也适用,它是CNN的基本原理。
结构
回到细节上来,CNN所需做的是,拿到图像,输入一系列卷积、非线性、池化(下采样)和完全连接的层中,最终得到一个输出。就像我们之前说的,输出可以是能最好描述图的分类的一个单一结果或者一组分类的概率。现在,最难的部分即是理解每一层的工作原理。首先让我们来看看最重要的部分。
第一层(数学部分)
CNN的第一层通常是卷积层。首先,你需要记住卷基层的输入是什么。如上所述,输入是一个32 x 32 x 3的像素值数组。现在,解释卷积层的最好的方法就是想象一个手电筒正从图像的左上角照过。我们假设这个手电筒的光覆盖了一个5 x 5的区域。然后,我们想象这个手电筒的光照过输入图像的所有区域。在机器学习的术语中,这个手电筒叫做过滤器(有时也被称作神经元或者内核),手电筒照过的区域称作感受域。现在这个过滤器也是一个数组(其中的数字被称为权重或者参数)。一个非常重要的注意事项是过滤器的深度要和输入的深度相同(这保证可以进行数学运算),所以这个过滤器的大小是5 x 5 x 3。现在我们以滤器的第一个位置为例,即图像左上角。随着过滤器在输入图像上滑动,或者进行卷积运算,过滤器中的值会和图像上的原始值相乘(又称作计算点积)。将这些乘积相加(从数学角度讲,一共会有75个乘积),你就得到了一个数字。记住,这个数字只是过滤器在图像左上角时得到的结果。现在,我们在输入内容的每一个位置重复这一过程。(下一步是把过滤器向右移动一个单位,然后再右移一个单位,以此类推)。输入内容上的每一个特有位置都会产生一个值。过滤器滑过所有位置后,你会发现你得到了一个28 x 28 x 1的数组,我们把它称作激活映射或特征映射。你得到一个28 x 28数组的原因是,5 x 5的过滤器在32 x 32的输入图像上有784个不同的位置。这784个数字映射成了一个28 x 28的数组。
(小注:包含上图在内的本文的一些图片,来自一本Michael Nielsen写的《神经网络和深度学习》,强烈推荐。)
假设现在我们用两个而非一个5 x 5 x 3的过滤器,那么我们的输出就变成了28 x 28 x 2的数组。通过使用更多的过滤器,我们能更好的保存空间维度。数学上讲,这就是卷积层上发生的事。
第一层(任务概况)
让我们从更高层次来看卷积实际在做什么吧。每一个过滤器都可以看做为一个特征标识器。这里的特征是指直线、简单的颜色以及曲线之类的东西,这些都是图片所共有的最简单特征。我们的第一个过滤器是一个7 x 7 x 3的曲线检测器。(为了简化这个问题,在这里我们先忽略过滤器有3个单位深度这一事实,只考虑过滤器和图片的最上层切片。)曲线检测器有一定的像素结构,在该结构中,沿着曲线形状的区域将具有更高的数值。
图片标题:左- 过滤器的像素化表现
右-可视化的曲线检测过滤器
现在让我们将这个数学问题可视化。当我们对左上角的输入使用这个过滤器时,这个区域的像素值和过滤器将进行乘法运算。以下图为例,我们将过滤器放在左上角。
图片标题:左-原始图
右-可视化过滤器在图片上的位置
记住,我们要做的是将过滤器的值与图片的原始像素值进行乘法运算。
图片内容:可视化的接受域 的像素值 * 过滤器的像素值
相乘和相加 = (50*30)+(50*30)+(50*30)+(20*30) +(50*30)=6600. (一个很大的数字!)
一般来说,如果输入图片的形状与过滤器所表现的曲线相类似,那么我们的乘积的和会是一个很大的数值。现在,我们尝试移动过滤器,看看会发生什么。
图片内容:过滤器在图片上的位置 接受域的像素值*过滤器的像素值
相乘和加和 = 0
这个值相比上一个要低很多!这是因为图片中没有任何部分与曲线检测过滤器对应。记住,这个卷积层的输出是一个激活映射。在这个只有一个过滤器(并且这个过滤器是曲线检测器)的卷积的案例中,激活映射会显示出图片中那些与过滤器的曲线相类似的区域。该示例中,28 x 28 x 1的激活映射的左上角的值将为6600。这个很高的值意味着输入中包含着某种类型的曲线激活了过滤器。激活映射的右上角的值是0,因为所输入的值并没有激活过滤器。(或者更简单的说,图片的右上角没有这样一个曲线)。这仅仅是一个过滤器,一个可以检测出向右外侧的曲线的过滤器。我们可以拥有更多的过滤器,如向左的曲线或者直线。过滤器越多,激活映射的深度越深,我们从输入中取得的信息也就越多。
免责声明:在本节中的所描述的简化版的过滤器,是为了说明一个卷积中所涉及到的数学问题。在下图中,你可以看到一个已经训练好的神经网络中,第一个卷积层中过滤器可视化的一些示例。但它们主要的想法还是一致的。第一个卷积层中的过滤器对于输入的图片进行卷积,当过滤器所代表的某个具体特征在输入中被发现时,过滤器就会被“激活”(或者得到很高的值)。
(提醒:上面的图片来自于斯坦福大学Andrej Karpathy 和Justin Johnson任教的 CS 231N 课程,如果想要更深入地了解CNN,这门课是你的不二选择。)
更深入地了解神经网络
在传统的卷积神经网络架构中,各个卷积层中穿插了其他的一些层。我强烈鼓励大家去了解这些层的具体功能和效果,但简单来说,这些层提供了非线性和保留维度的功能,从而提升神经网络的鲁棒性,并能防止过度拟合。一个经典的CNN架构如下:
输入-> 卷积->激活-> 卷积->激活->池化->激活-> 卷积->激活->池化->全连接
神经网络的最后一层是很重要的一个层,我们稍后会进行具体介绍。让我们先回顾一下到目前为止我们所学的内容。第一个卷积层上的过滤器是用来发现特征的,通过这些过滤器可以发现低层次的特征,例如边和曲线。然而,为了预测图片类型,我们需要让神经网络识别出高层次的特征,例如手、爪子或耳朵。让我们思考一下,神经网络中第一个卷积层的输出是什么?应该是一个28 x 28 x 3的体量。(假设我们使用的是3个5 x 5 x 3的过滤器)。
当我们进入另一个卷积层的时候,第一个卷积层的输出就成为了第二个卷积层的输入。接下来的步骤很难被可视化。在第一层中,输入是原始的图片。然而,当我们进入第二个卷积层的时候,第一层的计算结果,激活映射就成为了第二层的输入,每个输入都描述了某些低层次特征在原始图片中出现的位置。现在当你使用一组过滤器(让它通过第二个卷积层)时,输入中被激活的部分就代表了高层次特征。
这些特征可能是半圆形(由一条曲线和一条直线组成)或者方形(由几根直线组合而成)。当你使用更深层的神经网络和更多的卷积层时,你将得到更复杂特征的激活映射。训练完神经网络后,你会得到一些过滤器,当图片中是手写字母时它们会被激活,或者当识别到粉色时被激活等等。如果你想进一步了解卷积网络中过滤器的可视化,你可以参考Matt Zeiler 和 Rob Fergus一篇很优秀的研究报告(http://www.matthewzeiler.com/pubs/arxive2013/arxive2013.pdf)。你也可以在YouTube上看到Jason Yosinski做的一个很精彩的可视化展现视频(https://www.youtube.com/watch?v=AgkfIQ4IGaM)。还有一个有意思的事情是,当你使用更深层的神经网络,过滤器所覆盖的接受域会逐渐变大,这意味着过滤器考虑了原始输入中更大范围的信息(换句话说,这些过滤器对于更大范围的像素空间反应更敏感)。
全连接网络层
既然我们已经可以检测到这些高层级的特征,接下来我们就需要一个全连接网络层作为神经网络的结束层。该层将之前层(卷积层、激活层或者池化层)的处理结果作为输入,并输出一个N维的向量,N是程序所选择的类别的数量。例如你想做一个数字识别程序,一共有10个数字,那么N就是10。这个N维向量中每一个数字表示了目标对象属于该类的概率值。例如,一个数字识别程序的结果向量是[0 .1 .1 .75 0 0 0 0 0 .05],它的意思就是这个图片有10%的可能性是1, 10%的可能性是2, 75%的可能性是3,以及5%的可能性是9(注:你也可以使用其他方式表示输出,在这里我使用了Softmax回归模型的方法)。全连接网络层的功能是通过分析前一层的输出(代表高层次特征的激活映射)决定哪些特征值和某一个特定的类别相关性最高。
例如,如果程序预测某张图像是一条狗,它就会在代表一个爪子或四条腿等高级特征的激活映射中有较高的值。类似的,如果程序预测某张图像是一只鸟,它就会在代表翅膀和喙等高级特征的激活映射中有很高的值。本质上讲,一个全连接层关注与特定类相关性最强、并且有特定权重的高层特征,以便能在计算权重与前面一层乘积后得到不同类的正确概率。
模型训练
现在我要说的是我之前故意没有提到一个话题,它也可能是CNN最重要的部分。阅读中你可能已经产生了许多疑问:过滤器如何在第一个转换层知道它要寻找的边缘和曲线?完全连接层如何知道要查看什么激活映射?每个层中的过滤器的值要怎么确定?这些都是通过一个叫“反向传播”的训练过程实现的。通过这一训练,计算机可以正确调整其过滤值(或权重)。
在讨论反向传播之前,让我们先看一下使神经网络工作的条件。在我们出生的那一刻,我们的意识是一张白纸。我们不知道猫、狗、鸟是什么。类似地,在卷积神经网络被训练之前,权重或过滤值都是随机的。过滤器不知道如何查找边缘和曲线,在更高的层的过滤器不知道寻找爪子和喙。随着年龄的增长,我们的父母和老师给我们展示了不同的图片和图像,并告诉我们相应的标签。这个让图像和标签一一对应的想法就是CNN训练的过程。
让我们回到反向传播。假设我们有一个训练集,它有数千张狗、猫和鸟的图像,并且每一个图像都有一个正确的标签。
反向传播可以分为4个不同的部分:前向传递、损失函数、后向传递和权值更新。在向前传递时,你接受一个训练图像(它是一个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(均方误差),即½乘(实际值-预测值)的平方。
假设变量L等于那个值。可以想象,第一张训练图像的损失将非常高。现在,让我们直观地思考这个问题。我们想使得预测标签(ConvNet输出)与训练集的实际标签尽可能吻合(这意味着我们的网络预测是正确的)。为了达到这一目标,我们要尽量减少我们的损失。让我们把这一问题看作是微积分中的一个优化问题——我们想找出哪些权重最直接地导致网络的损失(或错误)。
现在,我们要做的是在网络中进行反向传递,它决定了哪些权重造成了最大的损失,并找出调整它们的方法,以减少损失。一旦我们计算出这个导数(dL/dW,W是权重),我们就可以进入最后一步,即权重更新。在这一步,我们对过滤器的权重进行更新,更新的方向即是我们刚才计算出的导数/梯度的反方向。
学习率(Learning Rate)是由程序员选择的参数。高学习率意味着在权重更新中采取更大的步骤,因此,该模型可能只需要较少的时间来收敛到最优的权重集上。然而,学习率过高可能导致跳跃过大而不够精确,无法收敛至最佳点。
正向传递、损失函数、后向传递和参数更新过程是一个训练迭代过程。程序将重复这一过程,为每一组训练图像(通常称为批处理)进行固定次数的迭代。在我们完成最后一个训练示例中的参数更新后,如果一切正常,网络就已经得到了足够的训练,即网络的权重得到了正确的调整。
测试
最后,为了检验我们的卷积神经网络是否有效,我们需要一套不同的图像和标签(不能在训练和测试之间重复使用!)。我们用训练过的卷积神经网络对图片标签作出预测,再比较输出和这些图片的真实标签,以检验我们的网络是否能正常工作。
企业如何利用卷积神经网络
数据,数据,数据!相比其他竞争对手,那些拥有海量数据的公司有着先天的优势。你给网络提供的训练数据越多,你可以做的训练迭代越多,你能做的权重更新就越多,而当你投入到生产中时,对网络的调整就越好。Facebook和Instagram可以使用数十亿用户当前的所有照片,Pinterest可以使用其网站上的500亿个引脚的信息,谷歌可以使用搜索数据,亚马逊可以使用每天产品销售产生的数以百万计的数据。而现在,你已经知道了使用这些数据背后的秘密了。