大数据文摘作品,转载要求见文末
编译 | 璐,高宁,樊恒岩,田奥
卷积神经网络听起来像一个奇怪组合。这个名字涉及了生物学、数学,还有一点计算机科学乱入,但它却是计算机视觉领域最具影响的创新。在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回归模型的方法)。全连接网络层的功能是通过分析前一层的输出(代表高层次特征的激活映射)决定哪些特征值和某一个特定的类别相关性最高。