LeNet- 5 模型
在 CNN 的应用中,文字识别系统所用的 LeNet- 5 模型是非常经典的模型。LeNet- 5 模型是 1998 年,Yann LeCun 教授提出的,它是第一个成功大规模应用在手写数字识别问题的卷积神经网络,在 MNIST 数据集中的正确率可以高达 99.2%。
下面详细介绍一下 LeNet- 5 模型工作的原理。
LeNet- 5 模型一共有 7 层,每层包含众多参数,也就是卷积神经网络中的参数。虽然层数只有 7 层,这在如今庞大的神经网络中可是说是非常少的了,但是包含了卷积层,池化层,全连接层,可谓麻雀虽小五脏俱全了。为了方便,我们把卷积层称为 C 层,下采样层叫做下采样层。
首先,输入层输入原始图像,原始图像被处理成 32×32 个像素点的值。然后,后面的隐层计在卷积和子抽样之间交替进行。C1 层是卷积层,包含了六个特征图。每个映射也就是 28×28 个神经元。卷积核可以是 5 ×5 的十字形,这 28×28 个神经元共享卷积核权值参数,通过卷积运算,原始信号特征增强,同时也降低了噪声,当卷积核不同时,提取到图像中的特征不同;C2 层是一个池化层,池化层的功能在上文已经介绍过了,它将局部像素值平均化来实现子抽样。
池化层包含了六个特征映射,每个映射的像素值为 14×14,这样的池化层非常重要,可以在一定程度上保证网络的特征被提取,同时运算量也大大降低,减少了网络结构过拟合的风险。因为卷积层与池化层是交替出现的,所以隐藏层的第三层又是一个卷积层,第二个卷积层由 16 个特征映射构成,每个特征映射用于加权和计算的卷积核为 10×10 的。第四个隐藏层,也就是第二个池化层同样包含 16 个特征映射,每个特征映射中所用的卷积核是 5 ×5 的。第五个隐藏层是用 5 ×5 的卷积核进行运算,包含了 120 个神经元,也是这个网络中卷积运算的最后一层。
之后的第六层便是全连接层,包含了 84 个特征图。全连接层中对输入进行点积之后加入偏置,然后经过一个激活函数传输给输出层的神经元。最后一层,也就是第七层,为了得到输出向量,设置了十个神经元来进行分类,相当于输出一个包含十个元素的一维数组,向量中的十个元素即 0 到 9。
AlexNet 模型
AlexNet 简介
2012 年 Imagenet 图像识别大赛中,Alext 提出的 alexnet 网络模型一鸣惊人,引爆了神经网络的应用热潮,并且赢得了 2012 届图像识别大赛的冠军,这也使得卷积神经网络真正意义上成为图像处理上的核心算法。上文介绍的 LeNet- 5 出现在上个世纪,虽然是经典,但是迫于种种复杂的现实场景限制,只能在一些领域应用。不过,随着 SVM 等手工设计的特征的飞速发展,LeNet- 5 并没有形成很大的应用状况。随着 ReLU 与 dropout 的提出,以及 GPU 带来算力突破和互联网时代大数据的爆发,卷积神经网络带来历史的突破,AlexNet 的提出让深度学习走上人工智能的最前端。
图像预处理
AlexNet 的训练数据采用 ImageNet 的子集中的 ILSVRC2010 数据集,包含了 1000 类,共 1.2 百万的训练图像,50000 张验证集,150000 张测试集。在进行网络训练之前我们要对数据集图片进行预处理。首先我们要将不同分辨率的图片全部变成 256×256 规格的图像,变换方法是将图片的短边缩放到 256 像素值,然后截取长边的中间位置的 256 个像素值,得到 256×256 大小的图像。除了对图片大小进行预处理,还需要对图片减均值,一般图像均是由 RGB 三原色构成,均值按 RGB 三分量分别求得,由此可以更加突出图片的特征,更方便后面的计算。
此外,对了保证训练的效果,我们仍需对训练数据进行更为严苛的处理。在 256×256 大小的图像中,截取 227×227 大小的图像,在此之后对图片取镜像,这样就使得原始数据增加了(256-224)x(256-224)x2= 2048 倍。最后对 RGB 空间做 PCA,然后对主成分做(0,0.1)的高斯扰动,结果使错误率下降 1%。对测试数据而言,抽取以图像 4 个角落的大小为 224224 的图像,中心的 224224 大小的图像以及它们的镜像翻转图像,这样便可以获得 10 张图像,我们便可以利用 softmax 进行预测,对所有预测取平均作为最终的分类结果。
ReLU 激活函数
之前我们提到常用的非线性的激活函数是 sigmoid,它能够把输入的连续实值全部确定在 0 和 1 之间。但是这带来一个问题,当一个负数的绝对值很大时,那么输出就是 0;如果是绝对值非常大的正数,输出就是 1。这就会出现饱和的现象,饱和现象中神经元的梯度会变得特别小,这样必然会使得网络的学习更加困难。此外,sigmoid 的 output 的值并不是 0 为均值,因为这会导致上一层输出的非 0 均值信号会直接输入到后一层的神经元上。所以 AlexNet 模型提出了 ReLU 函数,公式:f(x)=max(0,x)f(x)=max(0,x)。
用 ReLU 代替了 Sigmoid,发现使用 ReLU 得到的 SGD 的收敛速度会比 sigmoid 快很多,这成了 AlexNet 模型的优势之一。
Dropout
AlexNet 模型提出了一个有效的模型组合方式,相比于单模型,只需要多花费一倍的时间,这种方式就做 Dropout。在整个神经网络中,随机选取一半的神经元将它们的输出变成 0。这种方式使得网络关闭了部分神经元,减少了过拟合现象。同时训练的迭代次数也得以增加。当时一个 GTX580 GPU 只有 3GB 内存,这使得大规模的运算成为不可能。但是,随着硬件水平的发展,当时的 GPU 已经可以实现并行计算了,并行计算之后两块 GPU 可以互相通信传输数据,这样的方式充分利用了 GPU 资源,所以模型设计利用两个 GPU 并行运算,大大提高了运算效率。
模型分析
AlexNet 模型共有 8 层结构,其中前 5 层为卷积层,其中前两个卷积层和第五个卷积层有池化层,其他卷积层没有。后面 3 层为全连接层,神经元约有六十五万个,所需要训练的参数约六千万个。
图片预处理过后,进过第一个卷积层 C1 之后,原始的图像也就变成了 55×55 的像素大小,此时一共有 96 个通道。模型分为上下两块是为了方便 GPU 运算,48 作为通道数目更加适合 GPU 的并行运算。上图的模型里把 48 层直接变成了一个面,这使得模型看上去更像一个立方体,大小为 55x55x48。在后面的第二个卷积层 C2 中,卷积核的尺寸为 5x5x48,由此再次进行卷积运算。在 C1,C2 卷积层的卷积运算之后,都会有一个池化层,使得提取特征之后的特征图像素值大大减小,方便了运算,也使得特征更加明显。而第三层的卷积层 C3 又是更加特殊了。第三层卷积层做了通道的合并,将之前两个通道的数据再次合并起来,这是一种串接操作。第三层后,由于串接,通道数变成 256。全卷积的卷积核尺寸也就变成了 13×13×25613×13×256。一个有 4096 个这样尺寸的卷积核分别对输入图像做 4096 次的全卷积操作,最后的结果就是一个列向量,一共有 4096 个数。这也就是最后的输出,但是 AlexNet 最终是要分 1000 个类,所以通过第八层,也就是全连接的第三层,由此得到 1000 个类输出。
Alexnet 网络中各个层发挥了不同的作用,ReLU,多个 CPU 是为了提高训练速度,重叠 pool 池化是为了提高精度,且不容易产生过拟合,局部归一化响应是为了提高精度,而数据增益与 dropout 是为了减少过拟合。
VGG net
在 ILSVRC-2014 中,牛津大学的视觉几何组提出的 VGGNet 模型在定位任务第一名和分类任务第一名 [[[i]](https://zhuanlan.zhihu.com/wr…]。如今在计算机视觉领域,卷积神经网络的良好效果深得广大开发者的喜欢,并且上文提到的 AlexNet 模型拥有更好的效果,所以广大从业者学习者试图将其改进以获得更好地效果。而后来很多人经过验证认为,AlexNet 模型中所谓的局部归一化响应浪费了计算资源,但是对性能却没有很大的提升。VGG 的实质是 AlexNet 结构的增强版,它侧重强调卷积神经网络设计中的深度。将卷积层的深度提升到了 19 层,并且在当年的 ImageNet 大赛中的定位问题中获得了第一名的好成绩。整个网络向人们证明了我们是可以用很小的卷积核取得很好地效果,前提是我们要把网络的层数加深,这也论证了我们要想提高整个神经网络的模型效果,一个较为有效的方法便是将它的深度加深,虽然计算量会大大提高,但是整个复杂度也上升了,更能解决复杂的问题。虽然 VGG 网络已经诞生好几年了,但是很多其他网络上效果并不是很好地情况下,VGG 有时候还能够发挥它的优势,让人有意想不到的收获。
与 AlexNet 网络非常类似,VGG 共有五个卷积层,并且每个卷积层之后都有一个池化层。当时在 ImageNet 大赛中,作者分别尝试了六种网络结构。这六种结构大致相同,只是层数不同,少则 11 层,多达 19 层。网络结构的输入是大小为 224*224 的 RGB 图像,最终将分类结果输出。当然,在输入网络时,图片要进行预处理。
VGG 网络相比 AlexNet 网络,在网络的深度以及宽度上做了一定的拓展,具体的卷积运算还是与 AlexNet 网络类似。我们主要说明一下 VGG 网络所做的改进。第一点,由于很多研究者发现归一化层的效果并不是很好,而且占用了大量的计算资源,所以在 VGG 网络中作者取消了归一化层;第二点,VGG 网络用了更小的 3 ×3 的卷积核,而两个连续的 3 ×3 的卷积核相当于 5 ×5 的感受野,由此类推,三个 3 ×3 的连续的卷积核也就相当于 7 ×7 的感受野。这样的变化使得参数量更小,节省了计算资源,将资源留给后面的更深层次的网络。第三点是 VGG 网络中的池化层特征池化核改为了 2 ×2,而在 AlexNet 网络中池化核为 3 ×3。这三点改进无疑是使得整个参数运算量下降,这样我们在有限的计算平台上能够获得更多的资源留给更深层的网络。由于层数较多,卷积核比较小,这样使得整个网络的特征提取效果很好。其实由于 VGG 的层数较多,所以计算量还是相当大的,卷积层比较多成了它最显著的特点。另外,VGG 网络的拓展性能比较突出,结构比较简洁,所以它的迁移性能比较好,迁移到其他数据集的时候泛化性能好。到现在为止,VGG 网络还经常被用来提出特征。所以当现在很多较新的模型效果不好时,使用 VGG 可能会解决这些问题。
GoogleNet
谷歌于 2014 年 Imagenet 挑战赛(ILSVRC14)凭借 GoogleNet 再次斩获第一名。这个通过增加了神经网络的深度和宽度获得了更好地效果,在此过程中保证了计算资源的不变。这个网络论证了加大深度,宽度以及训练数据的增加是现有深度学习获得更好效果的主要方式。但是增加尺寸可能会带来过拟合的问题,因为深度与宽度的加深必然会带来过量的参数。此外,增加网络尺寸也带来了对计算资源侵占过多的缺点。为了保证计算资源充分利用的前提下去提高整个模型的性能,作者使用了 Inception 模型,这个模型在下图中有展示,可以看出这个有点像金字塔的模型在宽度上使用并联的不同大小的卷积核,增加了卷积核的输出宽度。因为使用了较大尺度的卷积核增加了参数。使用了 1 * 1 的卷积核就是为了使得参数的数量最少。
Inception 模块
上图表格为网络分析图,第一行为卷积层,输入为 224×224×3,卷积核为 7 ×7,步长为 2,padding 为 3,输出的维度为 112×112×64,这里面的 7 ×7 卷积使用了 7×1 然后 1×7 的方式,这样便有 (7+7)×64×3=2,688 个参数。第二行为池化层,卷积核为 3×33×3,滑动步长为 2,padding 为 1,输出维度:56×56×64,计算方式:1/2×(112+2×1−3+1)=56。第三行,第四行与第一行,第二行类似。第 5 行 Inception module 中分为 4 条支线,输入均为上层产生的 28×28×192 结果:第 1 部分,1×1 卷积层,输出大小为 28×28×64;第 2 部分,先 1×1 卷积层,输出大小为 28×28×96,作为输入进行 3×3 卷积层,输出大小为 28×28×128;第 3 部分,先 1×1 卷积层,输出大小为 28×28×32,作为输入进行 3×3 卷积层,输出大小为 28×28×32;而第 3 部分 3×3 的池化层,输出大小为输出大小为 28×28×32。第 5 行的 Inception module 会对上面是个结果的输出结果并联,由此增加网络宽度。
ResNet
2015 年 ImageNet 大赛中,MSRA 何凯明团队的 ResidualNetworks 力压群雄,在 ImageNet 的诸多领域的比赛中上均获得了第一名的好成绩,而且这篇关于 ResNet 的论文 Deep Residual Learning for Image Recognition 也获得了 CVPR2016 的最佳论文,实至而名归。
上文介绍了的 VGG 以及 GoogleNet 都是增加了卷积神经网络的深度来获得更好效果,也让人们明白了网络的深度与广度决定了训练的效果。但是,与此同时,宽度与深度加深的同时,效果实际会慢慢变差。也就是说模型的层次加深,错误率提高了。模型的深度加深,以一定的错误率来换取学习能力的增强。但是深层的神经网络模型牺牲了大量的计算资源,学习能力提高的同时不应当产生比浅层神经网络更高的错误率。这个现象的产生主要是因为随着神经网络的层数增加,梯度消失的现象就越来越明显。所以为了解决这个问题,作者提出了一个深度残差网络的结构 Residual:
上图就是残差网络的基本结构,可以看出其实是增加了一个恒等映射,将原本的变换函数 H(x) 转换成了 F(x)+x。示意图中可以很明显看出来整个网络的变化,这样网络不再是简单的堆叠结构,这样的话便很好地解决了由于网络层数增加而带来的梯度原来越不明显的问题。所以这时候网络可以做得很深,到目前为止,网络的层数都可以上千层,而能够保证很好地效果。并且,这样的简单叠加并没有给网络增加额外的参数跟计算量,同时也提高了网络训练的效果与效率。
在比赛中,为了证明自己观点是正确的,作者控制变量地设计几个实验。首先作者构建了两个 plain 网络,这两个网络分别为 18 层跟 34 层,随后作者又设计了两个残差网络,层数也是分别为 18 层和 34 层。然后对这四个模型进行控制变量的实验观察数据量的变化。下图便是实验结果。实验中,在 plain 网络上观测到明显的退化现象。实验结果也表明,在残差网络上,34 层的效果明显要好于 18 层的效果,足以证明残差网络随着层数增加性能也是增加的。不仅如此,残差网络的在更深层的结构上收敛性能也有明显的提升,整个实验大为成功。
除此之外,作者还做了关于 shortcut 方式的实验,如果残差网络模块的输入输出维度不一致,我们如果要使维度统一,必须要对维数较少的进行増维。而增维的最好效果是用 0 来填充。不过实验数据显示三者差距很小,所以线性投影并不是特别需要。使用 0 来填充维度同时也保证了模型的复杂度控制在比较低的情况下。
随着实验的深入,作者又提出了更深的残差模块。这种模型减少了各个层的参数量,将资源留给更深层数的模型,在保证复杂度很低的情况下,模型也没有出现梯度消失很明显的情况,因此目前模型最高可达 1202 层,错误率仍然控制得很低。但是层数如此之多也带来了过拟合的现象,不过诸多研究者仍在改进之中,毕竟此时的 ResNet 已经相对于其他模型在性能上遥遥领先了。
残差网络的精髓便是 shortcut。从一个角度来看,也可以解读为多种路径组合的一个网络。如下图:
ResNet 可以做到很深,但是从上图中可以体会到,当网络很深,也就是层数很多时,数据传输的路径其实相对比较固定。我们似乎也可以将其理解为一个多人投票系统,大多数梯度都分布在论文中所谓的 effective path 上。
DenseNet
在 Resnet 模型之后,有人试图对 ResNet 模型进行改进,由此便诞生了 ResNeXt 模型。
这是对上面介绍的 ResNet 模型结合了 GoogleNet 中的 inception 模块思想,相比于 Resnet 来说更加有效。随后,诞生了 DenseNet 模型,它直接将所有的模块连接起来,整个模型更加简单粗暴。稠密相连成了它的主要特点。
我们将 DenseNet 与 ResNet 相比较:
从上图中可以看出,相比于 ResNet,DenseNet 参数量明显减少很多,效果也更加优越,只是 DenseNet 需要消耗更多的内存。
总结
上面介绍了卷积神经网络发展史上比较著名的一些模型,这些模型非常经典,也各有优势。在算力不断增强的现在,各种新的网络训练的效率以及效果也在逐渐提高。从收敛速度上看,VGG>Inception>DenseNet>ResNet, 从泛化能力来看,Inception>DenseNet=ResNet>VGG,从运算量看来,Inception<DenseNet< ResNet<VGG,从内存开销来看,Inception<ResNet< DenseNet<VGG。在本次研究中,我们对各个模型均进行了分析,但从效果来看,ResNet 效果是最好的,优于 Inception,优于 VGG,所以我们第四章实验中主要采用谷歌的 Inception 模型,也就是 GoogleNet。