8 经典卷积网络
在前面一讲,我们谈论了关于卷积神经网络的诸多细节。综合来讲,卷积神经网络就是含卷积层的网络。在本讲中,我们将会根据卷积神经网络发展的历史,来看看别人当年使用过哪些经典的卷积神经网络。
8.1 LeNet模型
LeNet是最早出现的卷积神经网络 。这个名字来源于LeNet论文的第一作者Yann LeCun。LeNet展示了通过梯度下降训练卷积神经网络可以达到手写数字识别在当时最先进的结果。这个奠基性的工作第一次将卷积神经网络推上舞台,为世人所知。
8.2 Alexnet
在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机。虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并不尽如人意。一方面,神经网络计算复杂。虽然20世纪90年代也有过一些针对神经网络的加速硬件,但并没有像之后GPU那样大量普及。因此,训练一个多通道、多层和有大量参数的卷积神经网络在当年很难完成。另一方面,当年研究者还没有大量深入研究参数初始化和非凸优化算法等诸多领域,导致复杂的神经网络的训练通常较困难。
2012年,AlexNet横空出世。这个模型的名字来源于论文第一作者的姓名Alex Krizhevsky。AlexNet使用了8层卷积神经网络,并以很大的优势赢得了ImageNet 2012图像识别挑战赛。它首次证明了学习到的特征可以超越手工设计的特征,从而一举打破计算机视觉研究的前状。
虽然经典,但是从其构成来看,在第一个卷积层中,其使用了11×11的卷积核来大刀阔斧提取特征,而且不加填充和步长4。虽然在当时很经典,但是在现阶段中,Alexnet无疑已经淘汰了。
8.3 VGG
VGG模型是2014年ILSVRC竞赛的第二名,第一名是GoogLeNet。但是VGG模型在多个迁移学习任务中的表现要优于googLeNet。而且,从图像中提取CNN特征,VGG模型是首选算法。它的缺点在于,参数量有140M之多,需要更大的存储空间。但是这个模型很有研究价值。
模型的名称——“VGG”代表了牛津大学的Oxford Visual Geometry Group,该小组隶属于1985年成立的Robotics Research Group,该Group研究范围包括了机器学习到移动机器人。下面是一段来自网络对同年GoogLeNet和VGG的描述:
“GoogLeNet和VGG的Classification模型从原理上并没有与传统的CNN模型有太大不同。大家所用的Pipeline也都是:训练时候:各种数据Augmentation(剪裁,不同大小,调亮度,饱和度,对比度,偏色),剪裁送入CNN模型,Softmax,Backprop。测试时候:尽量把测试数据又各种Augmenting(剪裁,不同大小),把测试数据各种Augmenting后在训练的不同模型上的结果再继续Averaging出最后的结果。”
需要注意的是,在VGGNet的6组实验中,后面的4个网络均使用了pre-trained model A的某些层来做参数初始化。虽然提出者没有提该方法带来的性能增益。
VGG从发展之初到现在已经有多个版本了,对于不同的版本其架构都有微妙的不同。
VGG有很多特点,如下所示:
- 小卷积核。作者将卷积核全部替换为3x3(极少用了1x1);
- 小池化核。相比AlexNet的3x3的池化核,VGG全部为2x2的池化核;
- 层数更深特征图更宽。基于前两点外,由于卷积核专注于扩大通道数、池化专注于缩小宽和高,使得模型架构上更深更宽的同时,计算量的增加放缓;
- 全连接转卷积。网络测试阶段将训练阶段的三个全连接替换为三个卷积,测试重用训练时的参数,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为的输入。
对于图像分类来说,在不调参数的时候,VGG的效果比Alexnet的效果要好,但是如果假设Alexnet要跑八个小时,那么VGG很有可能要跑3天。
8.4 ResNet
对于深度学习来说,人们总是认为层数越多,模型效果越好,然而在实践中,添加过多的层后训练误差往往不降反升。即使利用批量归一化带来的数值稳定性使训练深层模型更加容易,该问题仍然存在。针对这一问题,何恺明等人提出了残差网络(ResNet)
。它在2015年的ImageNet图像识别挑战赛夺魁,并深刻影响了后来的深度神经网络的设计。
我们可以用通俗易懂的话解释ResNet。对于高层数的神经网络来说,明显低层数的神经网络准确率要得多,那如果我想通过继续堆叠层数来提高准确率,那我可以对继续堆叠的层进行一个“选拔”。如果这个继续堆叠的层能够对提高准确率有帮助,那么它就留下,如果不仅没有提高准确率反而还降低准确率了,那么我们就把这一层权重参数和偏置设为0,不用这一层即可。
但是这样的想法有一个问题。如果我们将神经网络无用的一层偏置和权重都设为0,那么通过这一层后数据还能成啥样?基本上就毁了。故我们可以用下面的形式来解决这个问题:
如果在传播的过程中发现下一个层是一个无用层,那么传播会跳过这一层,之前使用其他的通路前往下下层,这样的话既避免数据的破坏,也提高的传播的速度。
我们用再细致一点的口吻再讲一次:
当x输入后通过第一个卷积层,然后通过第二个卷积层,通过这两层后却发现,效果不好,即使调整这两层的参数也没救,那么我们就直接设置一条通路前往第三层,我们设第三层的输入是H(x),而通过一二层的输出是F(x),不通过两层卷积层而采用小道过来的x,那么H(x) = F(x)+x,而如果F(x)不尽人意,那么我们只需将F(x)设置为0,H(x) = x即可,相当于抽卡有了个保底,运气再怎么差我也能抽到。
我们可以把左图看做是VGG,而右图看做是ResNet,可以看出,在层数变高的时候,ResNet效果比VGG要好得多。这实际上也把深度学习救活了,因为在ResNet出来前,人们认为深度学习只能到达一定层数,它不能继续堆叠了,而当ResNet出来后,神经网络的层数得到了进一步的提高,尽管层数提高后提升很少的准确率。
8.5 感受野
我们来谈谈感受野的问题。
在卷积神经网络中,感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的区域,如下图所示。
假设我在第三层中只有一个像素点,它是通过第二层中3×3的区域和卷积核做互相关运算得来,而第二层的3×3又是由第一层中5×5的区域和卷积核做互相关运算得来,那么我们称第三层中那一个像素点的感受野为5×5。
那么我们思考这么一件事,如果堆叠3个3×3的卷积核,并且步幅为1,那么感受野就是7×7,这和直接用一个7×7的卷积核貌似没啥区别,那么我们干嘛非要堆叠3个小卷积呢?
我们假设输出的大小是h w c,并且都是用c个卷积核(得到c个特征图),可以来计算一下各自所需参数:
明显地,堆叠小卷积核所需的参数比直接用一个大卷积核所需的参数要少得多,而且如果卷积层堆叠更多,实际上特征提取也会更细致,加入的非线性变换也随着增多,还不会增大 权重参数个数,这就是VGG的初衷。