深度学习是加深了层的深度神经网络。基于之前介绍的网络,只需通过叠加层,就可以创建深度网络。本章我们将看一下深度学习的性质、课题和可能性,然后对当前的深度学习进行概括性的说明。
一、加深网络
关于神经网络,我们已经学了很多东西,比如构成神经网络的各种层、学习时的有效技巧、对图像特别有效的CNN、参数的最优化方法等,这些都是深度学习中的重要技术。本节我们将这些已经学过的技术汇总起来,创建一个深度网络,挑战MNIST数据集的手写数字识别。
1.向更深的网络出发
话不多说,这里我们来创建一个如下图所示的网络结构的CNN(一个比之前的网络都深的网络)。
如上图所示,这个网络的层比之前实现的网络都更深。这里使用的卷积层全都是3 × 3的小型滤波器,特点是随着层的加深,通道数变大(卷积层的通道数从前面的层开始按顺序以16、16、32、32、64、64的方式增加)。此外,如上图所示,插入了池化层,以逐渐减小中间数据的空间大小;并且,后面的全连接层中使用了Dropout层。
这个网络使用He初始值作为权重的初始值,使用Adam更新权重参数。把上述内容总结起来,这个网络有如下特点。1.基于3×3的小型滤波器的卷积层。2.激活函数是ReLU。3.全连接层的后面使用Dropout层。4.基于Adam的最优化。5.使用He初始值作为权重初始值。
从这些特征中可以看出,上图的网络中使用了多个之前介绍的神经网络技术。现在,我们使用这个网络进行学习。先说一下结论,这个网络的识别精度为99.38% ,可以说是非常优秀的性能了!
上图的网络的错误识别率只有0.62%。这里我们实际看一下在什么样的图像上发生了识别错误。下图中显示了识别错误的例子。
观察上图可知,这些图像对于我们人类而言也很难判断。实际上,这里面有几个图像很难判断是哪个数字,即使是我们人类,也同样会犯“识别错误”。
这次的深度CNN尽管识别精度很高,但是对于某些图像,也犯了和人类同样的“识别错误”。从这一点上,我们也可以感受到深度CNN中蕴藏着巨大的可能性。
2.进一步提高识别精度
在一个标题为“What is the class of this image ?”的网站上,以排行榜的形式刊登了目前为止通过论文等渠道发表的针对各种数据集的方法的识别精度,如下图。
参考刚才排行榜中前几名的方法,可以发现进一步提高识别精度的技术和线索。比如,集成学习、学习率衰减、Data Augmentation(数据扩充)等都有助于提高识别精度。尤其是Data Augmentation,虽然方法很简单,但在提高识别精度上效果显著。
Data Augmentation基于算法“人为地”扩充输入图像(训练图像)。具体地说,如下图所示,对于输入图像,通过施加旋转、垂直或水平方向上的移动等微小变化,增加图像的数量。这在数据集的图像数量有限时尤其有效。
除了如上图所示的变形之外,Data Augmentation还可以通过其他各种方法扩充图像,比如裁剪图像的“crop处理”、将图像左右翻转的“flip处理”A 等。对于一般的图像,施加亮度等外观上的变化、放大缩小等尺度上的变化也是有效的。不管怎样,通过Data Augmentation巧妙地增加训练图像,就可以提高深度学习的识别精度。
3.加深层的动机
本节就加深层的重要性,给出一些增补性的数据和说明。
首先,从以ILSVRC为代表的大规模图像识别的比赛结果中可以看出加深层的重要性。这种比赛的结果显示,最近前几名的方法多是基于深度学习的,并且有逐渐加深网络的层的趋势。也就是说,可以看到层越深,识别性能也越高。
下面我们说一下加深层的好处。其中一个好处就是可以减少网络的参数数量。说得详细一点,就是与没有加深层的网络相比,加深了层的网络可以用更少的参数达到同等水平(或者更强)的表现力。这一点结合卷积运算中的滤波器大小来思考就好理解了。比如,下图展示了由5 × 5的滤波器构成的卷积层。
这里希望大家考虑一下输出数据的各个节点是从输入数据的哪个区域计算出来的。显然,在上图的例子中,每个输出节点都是从输入数据的某个5 × 5的区域算出来的。接下来我们思考一下图8-6中重复两次3 × 3的卷积运算的情形。此时,每个输出节点将由中间数据的某个3 × 3的区域计算出来。那么,中间数据的3 × 3的区域又是由前一个输入数据的哪个区域计算出来的呢?仔细观察下图,可知它对应一个5 × 5的区域。也就是说,下图的输出数据是“观察”了输入数据的某个5 × 5的区域后计算出来的。
一次5 × 5的卷积运算的区域可以由两次3 × 3的卷积运算抵充。并且,相对于前者的参数数量25(5 × 5),后者一共是18(2 × 3 × 3),通过叠加卷积层,参数数量减少了。而且,这个参数数量之差会随着层的加深而变大。
加深层的另一个好处就是使学习更加高效。与没有加深层的网络相比,通过加深层,可以减少学习数据,从而高效地进行学习。具体地说,在前面的卷积层中,神经元会对边缘等简单的形状有响应,随着层的加深,开始对纹理、物体部件等更加复杂的东西有响应。
不过,通过加深网络,就可以分层次地分解需要学习的问题。因此,各层需要学习的问题就变成了更简单的问题。通过加深层,可以分层次地传递信息,这一点也很重要。比如,因为提取了边缘的层的下一层能够使用边缘的信息,所以应该能够高效地学习更加高级的模式。也就是说,通过加深层,可以将各层要学习的问题分解成容易解决的简单问题,从而可以进行高效的学习。
不过,这里需要注意的是,近几年的深层化是由大数据、计算能力等即便加深层也能正确地进行学习的新技术和环境支撑的。
二、深度学习的小历史
本节我们以ILSVRC这个大规模图像识别比赛为轴,看一下深度学习最近的发展趋势。
1.ImageNet
ImageNet是拥有超过100万张图像的数据集。如下图所示,它包含了各种各样的图像,并且每张图像都被关联了标签(类别名)。每年都会举办使用这个巨大数据集的ILSVRC图像识别大赛。
ILSVRC大赛有多个测试项目,其中之一是“类别分类”(classification),在该项目中,会进行1000个类别的分类,比试识别精度。。下图中展示了从2010年到2015年的优胜队伍的成绩。这里,将前5类中出现正确解的情况视为“正确”,此时的错误识别率用柱形图来表示。
上图中需要注意的是,以2012年为界,之后基于深度学习的方法一直居于首位。实际上,我们发现2012年的AlexNet大幅降低了错误识别率。并且,此后基于深度学习的方法不断在提升识别精度。这些年深度学习取得了不斐的成绩,其中VGG、GoogLeNet、ResNet已广为人知,在与深度学习有关的各种场合都会遇到这些网络。下面我们就来简单地介绍一下这3个有名的网络。
2.VGG
VGG是由卷积层和池化层构成的基础的CNN。不过,如下图所示,它的特点在于将有权重的层(卷积层或者全连接层)叠加至16层(或者19层),具备了深度(根据层的深度,有时也称为“VGG16”或“VGG19”)。
VGG中需要注意的地方是,基于3×3的小型滤波器的卷积层的运算是连续进行的。如上图所示,重复进行“卷积层重叠2次到4次,再通过池化层将大小减半”的处理,最后经由全连接层输出结果。
3.GoogLeNet
GoogLeNet的网络结构如下图所示。图中的矩形表示卷积层、池化层等。
只看图的话,这似乎是一个看上去非常复杂的网络结构,但实际上它基本上和之前介绍的CNN结构相同。不过,GoogLeNet的特征是,网络不仅在纵向上有深度,在横向上也有深度(广度)。
GoogLeNet在横向上有“宽度”,这称为“Inception结构”,以下图所示的结构为基础。
如上图所示,Inception结构使用了多个大小不同的滤波器(和池化),最后再合并它们的结果。GoogLeNet的特征就是将这个Inception结构用作一个构件(构成元素)。此外,在GoogLeNet中,很多地方都使用了大小为1 × 1的滤波器的卷积层。这个1 × 1的卷积运算通过在通道方向上减小大小,有助于减少参数和实现高速化处理。
4.ResNet
ResNet是微软团队开发的网络。它的特征在于具有比以前的网络更深的结构。我们已经知道加深层对于提升性能很重要。但是,在深度学习中,过度加深层的话,很多情况下学习将不能顺利进行,导致最终性能不佳。ResNet中,为了解决这类问题,导入了“快捷结构”(也称为“捷径”或“小路”)。导入这个快捷结构后,就可以随着层的加深而不断提高性能了(当然,层的加深也是有限度的)。
如上图所示,快捷结构横跨(跳过)了输入数据的卷积层,将输入x合计到输出。上图中,在连续2层的卷积层中,将输入x跳着连接至2层后的输出。这里的重点是,通过快捷结构,原来的2层卷积层的输出F(x)变成了F(x) + x。通过引入这种快捷结构,即使加深层,也能高效地学习。这是因为,通过快捷结构,反向传播时信号可以无衰减地传递。
ResNet以前面介绍过的VGG网络为基础,引入快捷结构以加深层,其结果如下图所示。
如上图所示,ResNet通过以2个卷积层为间隔跳跃式地连接来加深层。另外,根据实验的结果,即便加深到150层以上,识别精度也会持续提高。并且,在ILSVRC大赛中,ResNet的错误识别率为3.5%,令人称奇。
四、深度学习的高速化
随着大数据和网络的大规模化,深度学习需要进行大量的运算。实际上,环视一下周围,大多数深度学习的框架都支持GPU(Graphics Processing Unit),可以高速地处理大量的运算。另外,最近的框架也开始支持多个GPU或多台机器上的分布式学习。
1.需要努力解决的问题
从下图中可知,AlexNex中,大多数时间都被耗费在卷积层上。实际上,卷积层的处理时间加起来占GPU整体的95%,占CPU整体的89%!因此,如何高速、高效地进行卷积层中的运算是深度学习的一大课题。虽然下图是推理时的结果,不过学习时也一样,卷积层中会耗费大量时间。
2.基于GPU的高速化
由于GPU可以高速地进行并行数值计算,因此GPU计算的目标就是将这种压倒性的计算能力用于各种用途。所谓GPU计算,是指基于GPU进行通用的数值计算的操作。
深度学习中需要进行大量的乘积累加运算(或者大型矩阵的乘积运算)。这种大量的并行运算正是GPU所擅长的(反过来说,CPU比较擅长连续的、复杂的计算)。因此,与使用单个CPU相比,使用GPU进行深度学习的运算可以达到惊人的高速化。下面我们就来看一下基于GPU可以实现多大程度的高速化。下图是基于CPU和GPU进行AlexNet的学习时分别所需的时间。
3.分布式学习
为了进一步提高深度学习所需的计算的速度,可以考虑在多个GPU或者多台机器上进行分布式计算。现在的深度学习框架中,出现了好几个支持多GPU或者多机器的分布式学习的框架。其中,Google的TensorFlow、微软的CNTK(Computational Network Toolki)在开发过程中高度重视分布式学习。以大型数据中心的低延迟·高吞吐网络作为支撑,基于这些框架的分布式学习呈现出惊人的效果。基于分布式学习,可以达到何种程度的高速化呢?下图中显示了基于TensorFlow的分布式学习的效果。
如上图所示,随着GPU个数的增加,学习速度也在提高。实际上,与使用1个GPU时相比,使用100个GPU(设置在多台机器上,共100个)似乎可以实现56倍的高速化!这意味着之前花费7天的学习只要3个小时就能完成,充分说明了分布式学习惊人的效果。
4.运算精度的位数缩减
计算机中为了表示实数,主要使用64位或者32位的浮点数。通过使用较多的位来表示数字,虽然数值计算时的误差造成的影响变小了,但计算的处理成本、内存使用量却相应地增加了,还给总线带宽带来了负荷。
关于数值精度(用几位数据表示数值),我们已经知道深度学习并不那么需要数值精度的位数。这是神经网络的一个重要性质。这个性质是基于神经网络的健壮性而产生的。这里所说的健壮性是指,比如,即便输入图像附有一些小的噪声,输出结果也仍然保持不变。可以认为,正是因为有了这个健壮性,流经网络的数据即便有所“劣化”,对输出结果的影响也较小。
计算机中表示小数时,有32位的单精度浮点数和64位的双精度浮点数等格式。根据以往的实验结果,在深度学习中,即便是16位的半精度浮点数(half float),也可以顺利地进行学习。
关于深度学习的位数缩减,到目前为止已有若干研究。最近有人提出了用1位来表示权重和中间数据的Binarized Neural Networks方法。
四、深度学习的应用案例
本节将以计算机视觉这个领域为中心,介绍几个深度学习能做的事情(应用)。
1.物体检测
物体检测是从图像中确定物体的位置,并进行分类的问题。如下图所示,要从图像中确定物体的种类和物体的位置。
对于这样的物体检测问题,人们提出了多个基于CNN的方法。这些方法展示了非常优异的性能,并且证明了在物体检测的问题上,深度学习是非常有效的。
在使用CNN进行物体检测的方法中,有一个叫作R-CNN的有名的方法。下图显示了R-CNN的处理流。
2.图像分割
图像分割是指在像素水平上对图像进行分类。如下图所示,使用以像素为单位对各个对象分别着色的监督数据进行学习。然后,在推理时,对输入图像的所有像素进行分类。
为了解决这个计算问题,有人提出了一个名为FCN(Fully Convolutional Network)的方法。该方法通过一次forward处理,对所有像素进行分类,如下图所示。
3.图像标题的生成
有一项融合了计算机视觉和自然语言的有趣的研究,该研究如下图所示,给出一个图像后,会自动生成介绍这个图像的文字(图像的标题)。
一个基于深度学习生成图像标题的代表性方法是被称为NIC(Neural Image Caption)的模型。如下图所示,NIC由深层的CNN和处理自然语言的RNN(Recurrent Neural Network)构成。RNN是呈递归式连接的网络,经常被用于自然语言、时间序列数据等连续性的数据上。
我们将组合图像和自然语言等多种信息进行的处理称为多模态处理。多模态处理是近年来备受关注的一个领域。
五、深度学习的未来
1.图像风格变换
如下图所示,如果指定将梵高的绘画风格应用于内容图像,深度学习就会按照指示绘制出新的画作。
2.图像的生成
下图的图像可能看上去像是真的照片,但其实这些图像都是基于DCGAN新生成的图像。也就是说,DCGAN生成的图像是谁都没有见过的图像(学习数据中没有的图像),是从零生成的新图像。能画出以假乱真的图像的DCGAN会将图像的生成过程模型化。使用大量图像(比如,印有卧室的大量图像)训练这个模型,学习结束后,使用这个模型,就可以生成新的图像。
DCGAN中使用了深度学习,其技术要点是使用了Generator(生成者)和Discriminator(识别者)这两个神经网络。Generator生成近似真品的图像,Discriminator判别它是不是真图像(是Generator生成的图像还是实际拍摄的图像)。像这样,通过让两者以竞争的方式学习,Generator会学习到更加精妙的图像作假技术,Discriminator则会成长为能以更高精度辨别真假的鉴定师。两者互相切磋、共同成长,这是GAN(Generative Adversarial Network)这个技术的有趣之处。在这样的切磋中成长起来的Generator最终会掌握画出足以以假乱真的图像的能力。
3.自动驾驶
下图中对输入图像进行了分割(像素水平的判别)。观察结果可知,在某种程度上正确地识别了道路、建筑物、人行道、树木、车辆等。今后若能基于深度学习使这种技术进一步实现高精度化、高速化的话,自动驾驶的实用化可能也就没那么遥远了。
4.Deep Q-Network(强化学习)
就像人类通过摸索试验来学习一样(比如骑自行车),让计算机也在摸索试验的过程中自主学习,这称为强化学习(reinforcement learning)。强化学习和有“教师”在身边教的“监督学习”有所不同。
强化学习的基本框架是,代理(Agent)根据环境选择行动,然后通过这个行动改变环境。根据环境的变化,代理获得某种报酬。强化学习的目的是决定代理的行动方针,以获得更好的报酬,如下图所示。
在使用了深度学习的强化学习方法中,有一个叫作Deep Q-Network(通称DQN)的方法。该方法基于被称为Q学习的强化学习算法。在Q学习中,为了确定最合适的行动,需要确定一个被称为最优行动价值函数的函数。为了近似这个函数,DQN使用了深度学习(CNN)。
在DQN的研究中,有让电子游戏自动学习,并实现了超过人类水平的操作的例子。如下图所示,DQN中使用的CNN把游戏图像的帧(连续4帧)作为输入,最终输出游戏手柄的各个动作(控制杆的移动量、按钮操作的有无等)的“价值”。
深度学习领域还有很多尚未揭晓的东西,新的研究正一个接一个地出现。今后,全世界的研究者和技术专家也将继续积极从事这方面的研究,一定能实现目前无法想象的技术。
感谢读者一直读到本书的最后一章。如果读者能通过本书加深对深度学习的理解,体会到深度学习的有趣之处,笔者将深感荣幸。
原书正文内容完。