人工智能
AlexNet发表的2012年是具有里程碑意义的一年,自那以后,计算机视觉领域的所有突破几乎都来自深度神经网络。本文深入探讨了深度学习,尤其是非常擅长与理解图像的深度卷积神经网络。
现在,我打开Google Photos,输入“海滩”,就能查看我过去10年里去过的所有海滩的照片。我从来没有浏览过我的照片,也没有一张张给它们贴标签;相反,谷歌是根据照片本身的内容来识别海滩的。
这个看似平凡的功能是基于一种叫做深度卷积神经网络的技术,该技术允许软件以一种以前的技术无法实现的方式理解图像。
近年来,研究人员发现,随着他们构建的网络层数越深,积累了越大的数据集来训练软件,软件的准确性就越高。这使得软件对计算能力产生了几乎无法满足的需求,从而提振了英伟达和AMD等GPU厂商的财富。谷歌在几年前开发了自己的定制神经网络芯片,其他公司也争相效仿谷歌的做法。
以特斯拉为例,特斯拉聘请了深度学习专家Andrej Karpathy负责其自动驾驶系统Autopilot项目。特斯拉目前正在开发一种定制芯片,为未来版本Autopilot的神经网络操作提供加速。
又或,以苹果公司为例:最近几款iphone的核心芯片A11和A12都包含一个“神经引擎”,用来加速神经网络操作,并支持更好的图像和语音识别应用程序。
我为这篇文章采访过的几位专家都将当前的深度学习热潮追溯到一篇特定的论文:AlexNet,名字来自它的主要作者Alex Krizhevsky。
“在我看来,AlexNet发表的2012年是具有里程碑意义的一年,”机器学习专家、《智能机器如何思考》(How Smart Machines Think)一书的作者Sean Gerrish说。
在2012年之前,深度神经网络在机器学习领域几乎是一潭死水。但后来,Krizhevsky和他在多伦多大学的同事们在一项备受瞩目的图像识别竞赛提交了参赛作品,并取得了比以往任何成绩都要精确得多的成果。几乎一夜之间,深度神经网络成为图像识别的主要技术。其他使用该技术的研究人员很快证明了图像识别精度的进一步飞跃。
在这篇文章中,我们将深入探讨深度学习。我将解释什么是神经网络,它们是如何被训练的,以及为什么它们需要如此多的计算能力。然后我将解释为什么一种特殊类型的神经网络——深度卷积网络——在理解图像方面非常擅长。
一个单神经元的例子
“神经网络”(neural network)这个短语可能仍让人感觉有点模糊,所以让我们从一个简单的例子开始吧。假设你想用一个神经网络,根据红灯、黄灯和绿灯来决定一辆车是否通行。神经网络用单个神经元就可以完成这项任务。
神经元接受每个输入(1表示打开,0表示关闭),将其乘以相关的权重(weight),并将所有权重值相加。然后,神经元添加偏差(bias),该偏差确定神经元“激活”的阈值。在这个例子中,如果输出是正的,我们就认为神经元已经被“激活”了——否则就认为神经元没有被激活。这个神经元相当于不等式“green - red - 0.5 》 0”。如果评估结果为真,即意味着绿灯亮,红灯关,那么车应该通行。
在真实的神经网络中,人工神经元需要多走了一步。将加权输入相加并加入偏差后,神经元再应用非线性激活函数。一个流行的选择是sigmoid函数,它是一个s形函数,总是产生0到1之间的值。
激活函数的使用不会改变我们这个简单的红绿灯模型的结果(除了阈值需要是0.5而不是0),但激活函数的非线性对于使神经网络能够建模更复杂的函数是必不可少的。如果没有激活函数,每一个神经网络,不管多么复杂,都可以简化成其输入的线性组合。线性函数不能模拟复杂的现实世界现象。非线性激活函数使神经网络能够近似任何数学函数。
一个简单的示例网络
当然,有很多方法可以近似函数。神经网络的特别之处在于,我们知道如何用一些微积分、一堆数据和大量的计算能力来“训练”它们。我们可以构建以一个通用神经网络为基础的软件,让它查看大量的标记示例,然后修改神经网络,使其为尽可能多的有标记样本产生正确的标签,而不是让人类程序员直接为特定任务设计一个神经网络。我们的目标是使得到的网络能够推广(generalize),为先前不在训练数据集中的样本生成正确的标签。
早在AlexNet之前研究人员就开始试图实现这一点了。1986年,三位研究人员David Rumelhart, Geoffrey Hinton 和 Ronald Williams发表了一篇关于反向传播的里程碑式的论文。反向传播是一种有助于使训练复杂神经网络在数学上变得容易操作的技术。
为了直观了解反向传播是如何工作的,让我们来看看Michael Nielsen在他的在线深度学习课本中描述的一个简单神经网络。这个网络的目标是以代表一个手写数字的28×28像素的图像作为输入,并且正确地识别这个数字是什么。
每个图像都有28个×28 = 784个输入值,每个输入值都是0和1之间的实数,表示像素的亮度或暗度。Nielsen构建了这样一个神经网络:
在这张图中,中间和右边的每一个圆都是一个神经元。每个神经元对其输入进行加权平均,添加一个偏差值,然后应用一个激活函数。注意左边的圆圈不是神经元——这些圆圈代表网络的输入值。虽然图像只显示了8个输入圆,但实际上有784个输入——每个输入对应输入图像的一个像素。
右边的10个神经元分别应该为不同的数字“点亮”:当输入是手写数字0时,顶部的神经元应该被触发;当输入是手写数字1时,第二个神经元应该被触发;如此类推。
每个神经元从它前面一层的每个神经元接受输入。因此,中间这15个神经元的每一个都有784个输入值。这15个神经元中的每一个都有一个权重参数,对应于它的784个输入。这意味着这一层单独就有15×784 = 11760个权重参数。同样,输出层包含10个神经元,每一个都从中间层的15个神经元获得输入,并添加另外15×10 = 150个权重参数。除此之外,这个网络还有25个偏差变量——每个偏差变量分别对应25个神经元中的每一个。
训练神经网络
训练的目标是优化这11935个参数,以最大限度地提高正确的输出神经元——并且只有那个输出神经元——在显示一个手写数字图像时亮起来的机会。我们可以用一个名为MNIST的著名数据集来完成此操作,该数据集提供60000张有标记的28×28像素图像:
这里显示了MNIST数据集中的160个图像
Nielsen展示了如何使用74行Python代码来训练这个网络——不需要特殊的机器学习库。训练从为11935个权重和偏差参数中的每一个选择随机值开始。然后,软件会浏览示例图像,为每一个图像完成以下两个步骤的操作:
前馈步骤:在给定输入图像和网络的当前参数的条件下,计算网络的输出值。
反向传播步骤:计算结果与正确的输出值偏离多少,然后修改网络参数,以略微改进其在特定输入图像上的性能。
这是一个示例。假设网络显示下面这张图:
如果网络校准良好,那么网络的“7”输出应该接近1,而网络的其他9个输出应该都接近0。但是,假设在显示这个图像时,网络的“0”的输出为0.8。这就太高了!训练算法将改变“0”输出神经元的输入权重,使其在下次显示这张图像时更接近于0。
为此,反向传播算法为每个输入权重参数计算一个误差梯度(error gradient)。这是一种测量在输入权重发生给定变化时,输出误差会发生多大变化的方法。然后,算法使用这个梯度来决定每个输入权重的变化量——梯度越大,参数的变化就越大。
换句话说,这个训练过程“教导”输出层的神经元减少对会将它们推向错误答案的输入(即中间层的神经元)的注意力,而将注意力更多地放在将它们推向正确方向的输入。
该算法对其他每个输出神经元重复这一步骤。它减少“1”、“2”、“3”、“4”、“5”、“6”、“8”和“9”神经元(而不是“7”神经元)输入的权重,从而将这些输出神经元的值向下推。输入的值越高,输出误差相对于该输入的权重参数的梯度越大——因此它的权重会减少得越多。
相反,训练算法增加了导致“7”输出的输入权重,这将导致该神经元在下一次显示这张特定图像时产生更高的值。同样的,输入值越大,其权重的增加也越大,使得“7”输出神经元在以后的几轮中会更加注意这些输入。
接下来,算法需要对中间层执行相同的计算:将每个输入权重改变到可以减少网络错误的方向——同样,使“7”输出更接近于1,其他输出更接近于0。但是每个中间神经元都是输出层所有10个神经元的输入,这使得事情在两个方面复杂化了。
首先,任何给定中间层输入的误差梯度不仅取决于该输入值,而且还取决于下一层的误差梯度。该算法被称为反向传播算法,因为来自网络中较后一层的误差梯度是向后传播的,并且用于计算前一层的梯度。
此外,每个中间层神经元都是输出层中所有10个神经元的输入。因此,训练算法必须计算一个误差梯度,以反映特定输入权重的变化如何影响所有输出的平均误差。
反向传播是一种爬山算法:每一轮算法都会使输出结果更接近训练图像的正确结果——但只会接近一点点。随着算法得到越来越多的样本,它会“爬坡”到一组最优参数,这组参数能够正确分类尽可能多的训练样本。要达到较高的精度,需要成千上万的训练样本,算法可能需要对训练集中的每幅图像进行几十次循环遍历,才能达到性能的最高点。
Nielsen展示了如何用74行Python代码实现所有这些。值得注意的是,使用这个简单程序训练的神经网络能够识别MNIST数据库中95%以上的手写数字。通过一些额外的改进,像这样一个简单的两层神经网络能够识别98%以上的数字。
AlexNet带来的突破
你可能认为上世纪80年代反向传播的发展会开启基于神经网络的机器学习的快速进步时期,但事实并非如此。当然,在20世纪90年代和21世纪初就有人致力于这项技术。但对神经网络的兴趣直到2010年初才真正兴起。
我们可以从ImageNet竞赛的结果中看出这一点。ImageNet竞赛是由斯坦福大学计算机科学家李飞飞组织的年度机器学习竞赛。在每年的比赛中,参赛者都会得到超过一百万张图像的训练数据集,每张图像都被手工标记一个标签,标签有大约1000种类别,比如“消防车”、“蘑菇”或“猎豹”。参赛者的软件根据其对未被包含在训练集的其他图像进行分类的能力进行评判。程序可以进行多次猜测,如果前五次猜测中有一次与人类选择的标签相匹配,则被认为识别成功。
这项竞赛始于2010年,前两年深度神经网络并没有发挥主要作用。顶级团队使用了各种其他的机器学习技术,但结果相当平庸。2010年获胜的团队的top-5错误率高达28%。2011年,这个错误率为25%。
然后是2012年。来自多伦多大学的一个团队提交了参赛作品——即后来以主要作者Alex Krizhevsky命名的AlexNet——击败了所有竞争者。使用深度神经网络,该团队得到了16%的top-5错误率。最接近的竞争对手当年的错误率为26%。
上面讨论的手写识别网络有两层,25个神经元,以及大约12000个参数。AlexNet要大得多,也复杂得多:8个可训练的层、650000个神经元,以及6000万个参数。
训练这种规模的网络需要大量的计算能力,而AlexNet被设计利用现代GPU提供的大量并行计算能力。研究人员想出了如何在两个GPU之间分配网络训练的工作,从而给了它们两倍的计算能力。不过,尽管进行了积极的优化,在2012年可用的硬件条件下(两个Nvidia GTX 580 GPU,每个3GB内存),网络训练进行了5到6天。
看看AlexNet的结果对于理解这是一个多么厉害的突破是很有帮助的。以下是AlexNet论文中的截图,展示了一些图像和AlexNet的top-5分类:
AlexNet能够识别出第一张图片中有一只螨虫,即使这只螨虫只是在图片边缘的一个小形状。AlexNet不仅能正确识别美洲豹,它的其他top猜测——美洲虎、猎豹、雪豹和埃及猫——都是长相相似的猫科动物。AlexNet将蘑菇的图片标记为“木耳”——蘑菇的一种。“蘑菇”——官方正确的标签,是AlexNet的第二选择。
AlexNet的“错误”几乎同样令人印象深刻。照片上,一只斑点狗站在樱桃后面,AlexNet的猜测是“斑点狗”,而官方的标签是“樱桃”。AlexNet意识到这幅画中含有某种水果——“葡萄”和“接骨木浆果”是它的前五种选择——但它并没有完全认识到它们是樱桃。在一张马达加斯加猫站在树上的照片中,AlexNet列出了一群会爬树的小型哺乳动物。很多人(包括我)都可能会弄错。
这是真正令人印象深刻的性能表现,表明软件可以识别各种方向和背景中的常见对象。深度神经网络迅速成为图像识别任务最受欢迎的技术,此后机器学习领域就再也不回头看其他技术了。
“随着基于深度学习的方法在2012年取得成功,2013年的绝大多数参赛方法都使用了深度卷积神经网络,”ImageNet的赞助商写道。这种模式在随后的几年里持续,后来的获胜者的技术建立在AlexNet团队开创的基本技术之上。到2017年,使用更深层的神经网络的参赛者将top-5错误率降到3%以下。考虑到这项任务的复杂性,可以说计算机比许多人能更好地完成这项任务了。
卷积网络:概念
从技术上讲,AlexNet是一个卷积神经网络。在这一节中,我将解释卷积网络是做什么的,以及为什么这种技术对现代图像识别算法至关重要。
我们之前讨论的简单的手写识别网络是完全连接的:第一层的每个神经元都是第二层每个神经元的输入。这种结构足以完成相对简单的识别28×28像素的数字的任务。但它不能很好地扩展。
在MNIST手写数字数据集中,字符总是居中的。这大大简化了训练,因为这意味着(比如说)“7”这个数字在图像的顶部和右侧总是有一些暗像素,而左下角总是白色的。一个“0”几乎总是中间白色,在边缘有一些较暗的像素。一个简单的、完全连接的网络可以相当容易地检测出这类模式。
但假设你想构建一个可以识别出可能位于大图像中任何位置的数字的神经网络。一个完全连接的网络是不能很好地工作的,因为它没有一种有效的方法来识别位于图像不同部分的形状之间的相似性。如果你的训练集恰好大多数“7”都位于左上角,那么你最终会得到一个更擅长识别左上角的“7”的网络。
从理论上讲,你可以通过确保你的训练集在每个可能的像素位置上都有很多每个数字的样本来解决这个问题。但在实践中,这将是巨大的浪费。随着图像的大小和网络深度的增加,连接的数量——也就是输入权重参数的数量——将会激增。你需要更多的训练图像(更不用说更多的计算能力)来达到足够的准确性。
当神经网络学会识别图像中某个位置的形状时,它应该能够将这种学习应用到图像其他部分的相似形状识别中。卷积神经网络为这一问题提供了一个优雅的解决方案。
所以,想象一下,如果我们把一个大的图像分割成28×28像素的方格,然后,我们可以将每个方格输入到之前探讨的完全连接的手写识别网络中。如果“7”的输出在这些方格中至少有一个亮起,那就表示图像整体上可能有一个7。这就是卷积网络的本质。
卷积网络在AlexNet中的重要作用
在卷积网络中,这些“模板”被称为特征检测器,它们所看到的区域称为感受野。真实特征探测器往往具有远小于28像素的感知场。在AlexNet中,第一个卷积层具有特征检测器,其感知场是11*11像素。 AlexNet中的后续卷积层具有三或五个单位宽的感受域。
当特征检测器扫过输入图像时,它会生成一个特征图:一个二维网格,指示探测器被图像的不同部分激活的强度。卷积层中通常有多个特征检测器,每个特征检测器扫描输入图像以获得不同的图案。在AlexNet中,第一层有96个特征探测器,产生96个特征图。
为了使其更具体,这里给出网络训练后AlexNet第一层中96个特征探测器中每个探测器学习的视觉模式的直观表示。探测器可以定位水平线或垂直线、从浅到深的画面渐变、棋盘图案和许多其他形状。
彩色图像通常表示为每个像素拥有三个数字属性的像素图:分别为红色值、绿色值和蓝色值。AlexNet的第一层就采用图像的这种“三数字”表示,并将其转换为96数字表示,即图像中的每个“像素”具有96个值,由96个特征检测器一一对应。
在此例中,这96个值中的第一个指示图像中的特定点是否与此模式匹配:
第二个值指示特定点是否与此模式匹配:
第三个值指示特定点是否与此模式匹配:
。。.依旧为AlexNet的第一层中的其他93个特征检测器。第一层输出图像的新表示,其中每个“像素”是96个数字的向量(正如我稍后将解释的,这个新表示也按比例缩小了四倍)。
这就是AlexNet的第一层。接下来还有四个卷积层,每个层都将前一层的输出作为输入。
正如我们所见,第一层检测基本图案,如水平线和垂直线,明暗渐变和曲线。第二层使用这些输出作为构建块,来检测稍微复杂的形状。例如,第二层的特征检测器通过组合找到曲线的第一层特征检测器的输出来找到圆。第三层通过组合第二层的特征,找到更复杂的形状。第四层和第五层以此类推,能够找到的图案越来越复杂。
2014年,研究人员Matthew Zeiler和Rob Fergus发表了一篇论文,文中提供了一些有用的方法来对ImageNet的五层神经网络所识别的模式类型进行可视化。
第一层在单侧具有11个单元的感受野,而后面的层在一侧具有三至五个单元的感受野。注意,后面的这些层正在查看由较早层生成的要素图,这些要素图中的每个“像素”代表原始图像中的多个像素。因此,每个图层的感知区域都比前面的图层包含原始图像的比例更大。这也是后面的图层中的缩略图图像看起来比前面的图层更复杂的部分原因。
网络的第五层,也是最后一层(上图),能够识别这些图像中各种元素。
右边的九个图像可能看起来不太相似。但是如果你看一下左边的九个热图,你会发现这个特殊的特征探测器没有聚焦在每个图像前景中的物体上。相反,它专注于每个图像背景中的草地部分!
显然,如果您尝试识别的类别之一是“草”,草地检测器就是很有用的,而且对识别许多其他类别的目标也很有用。在五层卷积层之后,AlexNet有三层全连接层,就像我们的手写识别网络中的层一样。这些层参考了第五层卷积层产生的每个特征映射,因为它们试图将图像分类为1000个可能的类别之一。
因此,如果图片背景中有草,则更有可能显示出野生动物。另一方面,如果图片背景中有草,则不太可能是室内家具的图片。这和其他第五层特征检测器提供了有关照片中可能内容的大量信息。网络的最后几层合成了这些信息,以便对整个图片所描绘的内容产生有根据的猜测。
不同卷积层之间的差异:共享输入权重
我们已经看到卷积层中的特征检测器执行了令人印象深刻的模式识别,但到目前为止,我还没有解释卷积网络实际上是如何工作的。
卷积层是一层神经元。像任何神经元一样,它们会对输入进行加权平均,然后应用激活函数。使用反向传播技术来训练参数。
但与上述神经网络不同,卷积层未完全连接。每个神经元仅从前一层中的一小部分神经元获取输入。而且,至关重要的是,卷积网络中的神经元具有共享的输入权重。
放大AlexNet第一个卷积层中的第一个神经元。该层具有11×11像素的感受野,因此第一神经元在图像的一个角上观察11×11像素。这个神经元从这121个像素中获取输入,每个像素存在三个参数值——红色、绿色和蓝色。所以神经元总共有363个输入。像任何神经元一样,这个神经元对这363个输入值进行加权平均,然后应用激活函数。因为它有363个输入值,所以还需要363个输入权重参数。
AlexNet第一层中的第二个神经元看上去与第一个神经元很相似。它还会看到一个11×11像素的正方形,但其感受野比第一个神经元的感受野偏移了四个像素。这在两个感受野之间产生了七个像素的重叠,这避免了跨越两个神经元之间的线路就会错失信息的模式。第二个神经元还采用描述其11×11像素平方的363个值,将每个值乘以权重参数,将这些值相加,并应用激活函数。
第二个神经元使用与第一个神经元相同的输入权重。第一神经元的左上像素使用与第二神经元的左上像素相同的输入权重。所以这两个神经元寻找完全相同的模式;他们只有四个像素偏移的感受野。
当然,神经元的总数远不只两个:在55×55的网格中,实际上有3025个神经元。这3025个神经元中的每一个都使用与前两个神经元相同的363个输入权重集。所有这些神经元一起形成一个特征检测器,无论它位于图像中的哪个位置,都可以“扫描”特定的图案。
人类的视觉系统与神经网络的样式匹配技术遵循的原则是相近的。如果我们看的东西总是在一个方向上的,比如说人类的眼睛,那么我们更习惯于以通常的方向来识别它们。
训练数据越充分,网络性能越好,各大厂商纷纷发力
AlexNet的论文很快就在机器学习学术界引起轰动,其重要性也在工业界得到迅速认可。谷歌对这项技术特别感兴趣。
2013年,谷歌收购了由AlexNet论文的作者开办的创业公司。他们使用该技术为Google相册添加了新的图片搜索功能。谷歌的查克·罗森伯格写道:“我们直接从一个学术研究实验室走向了前沿研究,并在短短六个多月内推出了新的功能。”
与此同时,2013年的一篇论文描述了Google如何使用深度卷积网络从Google街景图像中的照片中读取邮编。作者写道:“该系统帮助我们从街景图像中提取了近1亿个真实街道上的数字。”
研究人员发现神经网络的性能随着网络的深度而不断提高。 “我们发现这种方法的性能随着卷积网络的深度而增加,最佳性能出现在我们训练的最深层的架构中,我们的实验表明,更深层次的架构可能会获得更好的精度,收益递减。”
因此,在AlexNet诞生后,神经网络不断深入。在2014年AlexNet获胜后两年,Google团队向2014年ImageNet竞赛提交了获奖作品。与AlexNet一样,它基于深度卷积神经网络,但Google使用更深层次的22层网络来实现6.7-百分之五的错误率 - 比AlexNet的16%错误率大大提高。
更深层的网络只适用于大型训练集。出于这个原因,Gerrish认为ImageNet数据集在深度卷积网络的成功方面发挥了关键作用。ImageNet比赛为参赛者提供了一百万张图片,并要求他们将这些图片分配给1000个不同类别中的一个。
“拥有一百万张图像来训练网络,意味着每个级别上有1000张图像。”Gerrish说。他说,如果没有如此大的数据集,“需要训练的参数数量就太多了。”
近年来,人们一直致力于积累更大的数据量,以便用于训练更深、更准确的网络。所以自动驾驶汽车企业一直专注于积累路测里程,途中采集到的图像和测试视频可以用于训练图像识别网络。
深度学习算力需求几无止境,GPU厂商盆满钵满
更深层的网络和更大的训练集可以提供更好的性能,激发了对更多计算力的永不满足的需求。AlexNet成功的一个重要原因是认识到了神经网络训练可以利用显卡的并行计算能力进行高效快速的矩阵操作。
这对于GPU制造商Nvidia和AMD来说,无疑是一笔可观的财富。这两家公司都致力于开发面向机器学习应用的独特需求而开发的新芯片,AI应用程序现在占这类公司GPU销售额的很大一部分。
2016年,谷歌宣布创建了名为Tensor Processing Unit(TPU)的定制芯片,专门用于神经网络操作。 Google早在2006年就考虑为神经网络构建专用集成电路(ASIC),但情况在2013年变得紧迫起来。“那时我们意识到,神经网络快速增长的计算需求可能要求我们将运营的数据中心数量增加一倍。“
最初,TPU的访问权限仅限谷歌自己的专有服务,但后来逐步开放,允许任何人通过谷歌的云计算平台使用该技术。
当然,谷歌并不是唯一一家致力于AI芯片的公司。iPhone的最新版本芯片就具备针对神经网络操作优化的“神经引擎”。英特尔也在开发针对深度学习而优化的一系列芯片。特斯拉最近宣布将不再使用英伟达的芯片,转而支持自研的神经网络芯片。另据报道,亚马逊也在开发自己的AI芯片。
全部0条评论
快来发表一下你的评论吧 !