1 前言
本章就是《深度学习入门-基于python的理论与实现》这本书的最后一章节了。
深度学习是加深了层的深度神经网络,基于之前介绍的网络,只需要通过叠加层就可以创建深度深度网络,本章学习深度网络的性质、课题、可能性,对当前的深度学习概括。
1.1 加深网络
在之前的章节中,我们学习了构成神经网络的各种层、学习时的有效技巧、对图像特别有效的CNN、参数的最优化方法等,这章将会利用前面学到的技术创建一个深度网络,挑战MNIST数据集的手写数字识别。
1.1.1 向更深的网络出发
这个网络有以下特点
1)基于3*3的小型滤波器的卷积层
2)**函数是ReLU
3) 全连接层的后面使用Dropout层
4)基于Adam 的最优化
5)使用He初始值作为权重初始值
这个网络的识别精度是99.38%,使用了之前介绍的神经网络技术。
上图我们人类也有可能识别错误。
1.1.2 进一步提高识别精度
在“what is the class of this image?”为标题的网站上,以排行榜的形式刊登了目前通过论文等渠道发表的针对各种数据集的方法的识别精度。
排名靠前的都是基于CNN,到2016年6月,对MNIST 数据集识别精度为99.79%,是使用了CNN,其中卷积层为两层,全连接层为两层的网络。对于手写数字识别不需要用到太多层。
集成学习、学习率衰减、数据扩充都可以提高识别精度,数据扩充在提高识别精度上效果显著。
数据扩充可以通过图像的旋转、平移等变形,或者施加亮度,放大、缩小等。
1.1.3 加深层的动机
对于加深层的重要性理论上的研究不够透彻,从过往的研究和实验中可以解释。
以ILSVRC为代表的大规模图像识别的比赛结果中可以看到加深层的重要性,前几名都是基于深度学习的,并且有加深层的趋势。
1)加深层可以减少网络的参数数量
以卷积运算中的滤波器大小就很好理解
叠加小型滤波器可以减少参数的数量(一次55的卷积运算可以由两次33来抵充),相对前者的参数个数25,后者的参数个数18(233)更少。可以扩大受野(给神经元施加某个局域空间域)、将RELU函数夹在卷积层的中间,将网络中添加了基于**函数的“非线性”表现力,通过非线性函数的叠加,进一步提高了网络的表现力,可以表现更复杂的东西。
2)使学习更高效
与没有加深的神经网络相比,通过加深层,可以减少数据学习,从而更高效的学习。
在之前的卷积层中,神经元会对边缘等简单的形状有响应,随着层的加深,开始对纹理,物体部件等更加复杂的东西有响应。
我们先牢记网络的分层结构,然后考虑狗的识别问题,对于狗的识别,需要大量具有差异性的学习数据,从而导致学习需要花费很多时间,
不过通过加深网络,可以分层次的分解需要学习的问题,通过加深层,可以将复杂的问题分解为较为复杂的问题,从而进行更加高效的学习。
当然对于加深层学习需要由大数据,计算能力的新技术和新环境来支撑。
1.2 深度学习的历史
深度学习受到关注是因为2012年举办的ILSVRC比赛,在比赛中,基于深度学习的AlexNet颠覆了之前的图像识别方法。
1.2.1 ImageNet
ImageNet 是拥有超过100万张图像的数据集,包含各种各样的图片,并且每张图片都做了标识,每年都会举办基于这个数据集的ILSVRC 图像识别大赛。比如将图片进行分类。
近些年深度学习的VGG、GoogLeNet、ResNet已经被很多人熟知。
只比较了2016年之前的算法。
1.2.2 VGG
VGG是由卷积层和池化层构成基础的CNN,因为结构简单、应用性强,所以很多技术人员喜欢使用。
1.2.3 GoogLeNet
网络在横向和纵向上都有深度。
1.2.4 ResNet
是由微软开发,它的特征是具有比之前的网络具有更深的深度,
加深层可以提升性能,但是过度加深导致学习不能进行,导致最终性能不佳。为了解决这个问题,导入了“快捷结构”,导入这个快捷结构后,可以随着层的加深提高性能,但是这也是有限度的。
1.3 深度学习的高速化
深度学习需要进行大量计算,所以使用GPU是非常必要的
1.3.1 需要努力解决的问题
在AlexNet中,大多数时间都会耗费在卷积层上,实际上,卷积层的处理时间加起来占GPU整体的95%,占CPU的89%,因此如何高速、高效的进行卷积层的运算是深度学习的一大课题。
1.3.2 基于GPU的高速化
GPU原本是作为图像专用的显卡使用的,最近不仅用于图像处理,也用于通用的数值计算,深度学习中需要大量的乘积累加计算,GPU由NVIDIA和AMD提供,但是NVIDIA更加贴合深度学习,因为深度学习使用了NVIDIA提供的CUDA面向GPU计算的综合开发环境。
通过im2col可以将卷积层进行的运算转换为大型矩阵的乘积,GPU更加擅长计算大规模的汇总好的数据。
1.3.3 分布式学习
GPU可以提高深度学习的速度,但是网络较深的时候还是要花费几天的时间,分布式可以进一步提高深度学习的速度,支持分布式学习的深度学习框架有Goole的TensorFlow、微软的CNTK,同时增加GPU的个数也可以提高学习速度。
那如何进行分布式学习呢?可以由深度学习的框架来解决。
1.3.4 运算精度的位数缩减
影响深度学习的高速化,除了计算量外,还有内存和总线宽度,需要将大量的权重参数和中间数据放在内存中,当流经GPU总线的数据超过某个限制的时候,就会成为瓶颈,因为神经网络的健壮性,位数缩减对输出结果不会产生较大的影响,所以位数缩减非常重要。
1.4 深度学习中的应用案例
深度学习可以应用在物体识别、图像、语音、自然语言等
在计算机视觉中应用的例子有
1.4.1 物体检测
从图像中确定物体的位置,并进行分类。
物体检测是比物体识别更加困难,需要在图像中确定类别的位置,
在CNN进行物体检测的方法中,R-CNN是很有效的。
Faster R-CNN 是用一个CNN来完成所有处理,使得高速处理成为可能。
1.4.2 图像分割
对输入图像的像素进行分类。
这样的话就要对像素进行推理处理,这需要按照像素数量来进行forward处理,所以需要耗费很多时间在无意义的处理上,FCN解决了这个问题,一次forward处理就可以对所有像素进行分类。
FCN是将CNN中包含的全连接层替换成卷积层,这样空间容量可以保持原样直到最后的输出。
1.4.3 图像标题的生成
融合了计算机视觉和自然语言处理的研究,代表性方法有NIC的模型,NIC由CNN和处理自然语言的RNN构成,RNN是具有循环连接的网络,经常被用于自然语言、时间序列数据等连续性的数据上。
NIC先用CNN 提取特征,然后讲这些特征提供给RNN,RNN输出文本。这种处理称为多模态处理。
1.5 深度学习的未来
1.5.1 图像风格变换
通过输出几张不同的图像来输出具有不同风格的图画。
1.5.2 图像的生成
与图像风格变换不同,这个不需要输入图像,但是要对大量图像进行学习,DCGAN生成的图像类似真实的照片,但是这个图像之前是谁都没有见过的图像,技术要点是使用了Generator 和Discriminator这两个神经网络。
1.5.3 自动驾驶
识别外部环境非常重要
1.5.4 Deep Q-Network(强化学习)
计算机在摸索实验中自主学习称为强化学习。
强化学习的基本框架,代理根据环境选择行动,行动改变环境,根据环境的变化,代理获得报酬。
报酬是预期化的,在深度学习的强化学习中DQN使用了深度学习CNN,例如AlphaGo就是使用深度学习和强化学习在围棋比赛中战胜人类。
到现在为止,已经学习了《深度学习-基于python的理论与实现》这本书,接下来就是学习《深度学习入门之PyTorch》这本书。
谢谢大家阅读,这也是我用****记录学习笔记的动力。