加深网络关于神经网络我们已经学了很多东西比如构成神经网络的各种层、学习时的有效技巧、对图像特别有效的CNN、参数的最优化方法等这些都是深度学习中的重要技术。本节我们将这些已经学过的技术汇总起来创建一个深度网络挑战MNIST数据集的手写数字识别。向更深的网络出发话不多说这里我们来创建一个如图8-1 所示的网络结构的CNN一个比之前的网络都深的网络。这个网络参考了下一节要介绍的VGG。如图8-1 所示这个网络的层比之前实现的网络都更深。这里使用的卷积层全都是3 × 3 的小型滤波器特点是随着层的加深通道数变大卷积层的通道数从前面的层开始按顺序以16、16、32、32、64、64的方式增加。此外如图8-1 所示插入了池化层以逐渐减小中间数据的空间大小并且后面的全连接层中使用了Dropout层。这个网络使用He初始值作为权重的初始值使用Adam更新权重参数。把上述内容总结起来这个网络有如下特点。基于3×3 的小型滤波器的卷积层。激活函数是ReLU。全连接层的后面使用Dropout层。基于Adam的最优化。使用He初始值作为权重初始值。从这些特征中可以看出图8-1 的网络中使用了多个之前介绍的神经网络技术。现在我们使用这个网络进行学习。先说一下结论这个网络的识别精度为99.38% A可以说是非常优秀的性能了图8-1 的网络的错误识别率只有0.62%。这里我们实际看一下在什么样的图像上发生了识别错误。图8-2 中显示了识别错误的例子。)观察图8-2可知这些图像对于我们人类而言也很难判断。实际上这里面有几个图像很难判断是哪个数字即使是我们人类也同样会犯“识别错误”。比如左上角的图像正确解是“6”看上去像“0”它旁边的图像正确解是“3”看上去像“5”。整体上“1”和“7”、“0”和“6”、“3”和“5”的组合比较容易混淆。通过这些例子相信大家可以理解为何会发生识别错误了吧。这次的深度CNN尽管识别精度很高但是对于某些图像也犯了和人类同样的“识别错误”。从这一点上我们也可以感受到深度CNN中蕴藏着巨大的可能性。进一步提高识别精度在一个标题为“What is the class of this image ?”的网站[32] 上以排行榜的形式刊登了目前为止通过论文等渠道发表的针对各种数据集的方法的识别精度图8-3。观察图8-3 的排行结果可以发现“Neural Networks” “Deep”“Convolutional”等关键词特别显眼。实际上排行榜上的前几名大都是基于CNN的方法。顺便说一下截止到2016 年6 月对MNIST数据集的最高识别精度是99.79%错误识别率为0.21%该方法也是以CNN为基础的[33]。不过它用的CNN并不是特别深层的网络卷积层为2 层、全连接层为2 层的网络。对于MNIST 数据集层不用特别深就获得了目前最高的识别精度。一般认为这是因为对于手写数字识别这样一个比较简单的任务没有必要将网络的表现力提高到那么高的程度。因此可以说加深层的好处并不大。而之后要介绍的大规模的一般物体识别的情况因为问题复杂所以加深层对提高识别精度大有裨益。参考刚才排行榜中前几名的方法可以发现进一步提高识别精度的技术和线索。比如集成学习、学习率衰减、Data Augmentation数据扩充等都有助于提高识别精度。尤其是Data Augmentation虽然方法很简单但在提高识别精度上效果显著。Data Augmentation 基于算法“人为地”扩充输入图像训练图像。具体地说如图8-4 所示对于输入图像通过施加旋转、垂直或水平方向上的移动等微小变化增加图像的数量。这在数据集的图像数量有限时尤其有效。除了如图8-4 所示的变形之外Data Augmentation 还可以通过其他各种方法扩充图像比如裁剪图像的 “crop 处理”、将图像左右翻转的“fl ip 处理”A 等。对于一般的图像施加亮度等外观上的变化、放大缩小等尺度上的变化也是有效的。不管怎样通过Data Augmentation巧妙地增加训练图像就可以提高深度学习的识别精度。虽然这个看上去只是一个简单的技巧不过经常会有很好的效果。这里我们不进行Data Augmentation的实现不过这个技巧的实现比较简单有兴趣的读者请自己试一下。加深层的动机关于加深层的重要性现状是理论研究还不够透彻。尽管目前相关理论还比较贫乏但是有几点可以从过往的研究和实验中得以解释虽然有一些直观。本节就加深层的重要性给出一些增补性的数据和说明。首先从以ILSVRC为代表的大规模图像识别的比赛结果中可以看出加深层的重要性详细内容请参考下一节。这种比赛的结果显示最近前几名的方法多是基于深度学习的并且有逐渐加深网络的层的趋势。也就是说可以看到层越深识别性能也越高。下面我们说一下加深层的好处。其中一个好处就是可以减少网络的参数数量。说得详细一点就是与没有加深层的网络相比加深了层的网络可以用更少的参数达到同等水平或者更强的表现力。这一点结合卷积运算中的滤波器大小来思考就好理解了。比如图8-5展示了由5 × 5的滤波器构成的卷积层。这里希望大家考虑一下输出数据的各个节点是从输入数据的哪个区域计算出来的。显然在图8-5 的例子中每个输出节点都是从输入数据的某个5 × 5 的区域算出来的。接下来我们思考一下图8-6 中重复两次3 × 3 的卷积运算的情形。此时每个输出节点将由中间数据的某个3 × 3 的区域计算出来。那么中间数据的3 × 3 的区域又是由前一个输入数据的哪个区域计算出来的呢仔细观察图8-6可知它对应一个5 × 5 的区域。也就是说图8-6 的输出数据是“观察”了输入数据的某个5 × 5 的区域后计算出来的。一次5 × 5 的卷积运算的区域可以由两次3 × 3 的卷积运算抵充。并且相对于前者的参数数量255 × 5后者一共是182 × 3 × 3通过叠加卷积层参数数量减少了。而且这个参数数量之差会随着层的加深而变大。比如重复三次3 × 3 的卷积运算时参数的数量总共是27。而为了用一次卷积运算“观察”与之相同的区域需要一个7 × 7 的滤波器此时的参数数量是49。叠加小型滤波器来加深网络的好处是可以减少参数的数量扩大感受野receptive field给神经元施加变化的某个局部空间区域。并且通过叠加层将ReLU 等激活函数夹在卷积层的中间进一步提高了网络的表现力。这是因为向网络添加了基于激活函数的“非线性”表现力通过非线性函数的叠加可以表现更加复杂的东西。加深层的另一个好处就是使学习更加高效。与没有加深层的网络相比通过加深层可以减少学习数据从而高效地进行学习。为了直观地理解这一点大家可以回忆一下7.6 节的内容。7.6 节中介绍了CNN的卷积层会分层次地提取信息。具体地说在前面的卷积层中神经元会对边缘等简单的形状有响应随着层的加深开始对纹理、物体部件等更加复杂的东西有响应。我们先牢记这个网络的分层结构然后考虑一下 “狗”的识别问题。要用浅层网络解决这个问题的话卷积层需要一下子理解很多“狗”的特征。“狗”有各种各样的种类根据拍摄环境的不同外观变化也很大。因此要理解“狗”的特征需要大量富有差异性的学习数据而这会导致学习需要花费很多时间。不过通过加深网络就可以分层次地分解需要学习的问题。因此各层需要学习的问题就变成了更简单的问题。比如最开始的层只要专注于学习边缘就好这样一来只需用较少的学习数据就可以高效地进行学习。这是为什么呢因为和印有“狗”的照片相比包含边缘的图像数量众多并且边缘的模式比“狗”的模式结构更简单。通过加深层可以分层次地传递信息这一点也很重要。比如因为提取了边缘的层的下一层能够使用边缘的信息所以应该能够高效地学习更加高级的模式。也就是说通过加深层可以将各层要学习的问题分解成容易解决的简单问题从而可以进行高效的学习。以上就是对加深层的重要性的増补性说明。不过这里需要注意的是近几年的深层化是由大数据、计算能力等即便加深层也能正确地进行学习的新技术和环境支撑的。