CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)

本文翻译总结自CS231n Lecture 9

本篇将深入介绍当前的应用和研究工作中最火的几个CNN网络架构——AlexNet、VGGNet、GoogleNet和ResNet,它们都在ImageNet分类任务中有很好的表现。另外,本篇也会粗略介绍一些其他的架构。

LeNet-5回顾

我们先来回顾一下最基本的LeNet,它可以说是首个效果比较好的CNN。它使用了5x5的卷积核,stride为1。池化层卷积核是2x2的,stride为2。最后还有几个全连接层。网络结构很简单也很容易理解。
CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)

AlexNet

接下来讲的是AlexNet,它是第一个在ImageNet分类上表现不错的大规模的CNN,在2012年一举碾压其他方法获得冠军,于是开启了一个新的时代。

它的基本架构组成如下图,它是由若干卷积层、池化层、归一化层和全连接层组成的。左边方括号里的内容为数据的形状,右边有卷积核的详细参数。总体来说AlexNet和LeNet很像,只不过网络层数大大增加。
CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)
整个网络架构可视化出来是这样的(输入层的224x224应为227x227):
CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)

下面总结一下这个网络的一些特点和小细节:

  1. 它是第一个使用ReLU的网络;
  2. 它使用了局部响应归一化层(Local Response Normalization Layers, LRN),了解LRN可以看这里这里。不过要注意,这种层现在已经不常用了,因为研究发现它的作用不是很大;
  3. 它使用了很多数据增广(data augmentation)技术,比如翻转(flipping)、PCA Jittering、随机裁切(cropping)、颜色归一化(color normalization)等等;
  4. 使用了0.5的dropout;
  5. batch size为128;
  6. SGD Momentum为0.9;
  7. 学习率为0.01,每次loss不降的时候手动除以10,直到最后收敛;
  8. L2 weight decay为5e-4;
  9. 使用7个CNN ensemble(多次训练模型取均值),效果提升为18.2% \rightarrow 15.4%。

另外提一句,从上面的架构图中,CONV1层的的96个kernel分成了两组,每组48个,这主要是历史原因,当时用的GPU显存不够用,用了两块GPU。CONV1、CONV2、CONV4和CONV5在每块GPU上只利用了所在层一半的feature map,而CONV3、FC6、FC7和FC8则使用了所在层全部的feature map。

AlexNet是第一个使用CNN架构在ImageNet Large Scale Visual Recognition Challenge(ILSVRC)上取得冠军的网络,它能力挺不错,不过后面讲到的一些网络架构更加优秀,也是在我们实际应用中可以优先考虑使用的。

ZFNet赢得了2013年ILSVRC的冠军,它所做的是对AlexNet的超参数进行了一些改进,网络架构没什么太大变化。但在2014年,有两个新的很厉害的网络架构被提出来——VGGNet和GoogleNet。它们与之前网络的主要差异在于网络深度大大增加,相比于AlexNet的8层,它们分别有19层和22层。下面我们分别具体讲一下两个网络。

VGG

VGG主要有两点改进:

  1. 显著增加了网络层数(16层到19层)
  2. 大大减小了kernel size,使用的是3x3 CONV stride 1 padding 1和2x2 MAX POOL stride 2这样的filter。

VGG和AlexNet的对比如下:
CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)

加深网络很好理解,但为什么要缩小filter到3x3呢?我们来小小地计算一下:
当使用一个7x7的filter时,它的感受野是7x7的。但如果我们使用三个3x3的filter来替换这一个7x7的filter呢?
从输入经过第一个3x3 filter,感受野为3x3,第一个filter的输出再经过第二个3x3 filter,感受野为5x5(三个3x3的相邻的区域综合起来是5x5),经过第三个filter之后,感受野为7x7。这样,经过替代后,在感受野不变的情况下:

  • 网络更深了,大大增加了网络的非线性能力;
  • 网络参数变少了:3×(32CinCout)<72CinCout3 \times (3^2 C_{in}C_{out}) < 7^2 C_{in}C_{out},其中CinC_{in}CoutC_{out}为分别为输入、输出的feature map数。

VGG16的具体参数如下:
CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)
可以看到,每张图片forward的过程中需要占用约100M的内存,这确实是个很大的数字。另外138M的参数量,也比AlexNet的60M多出不少。其中占用内存大的主要是最前面的卷积层(因为网络前面部分数据量还比较大)和全连接层(之后我们可以看到一些架构通过去掉全连接层来节省内存)。

下面总结一下这个网络的一些特点和小细节:

  1. 它赢得了ILSVRC’14的冠军;
  2. 它使用了和AlexNet类似的训练方法;
  3. 它没有使用AlexNet中用的LRN层(因为实验发现LRN用处不大);
  4. 它分为VGG16和VGG19(其中VGG19只是多了三层,效果稍好一些,占用内存也更多)。实际使用中VGG16用的更多;
  5. 为了提升效果使用了ensemble(多次训练模型,最后取均值);
  6. FC7中得到的feature map(也就是一个1x4096的向量)提取出了很好的feature,可以用来做其他任务。

接下来讲一下同样在2014年提出的网络GoogleNet。

GoogleNet

GoogleNet是ILSVRC’14中的分类冠军,它除了使用更深的网络(22层),还有一个更大的亮点——注重计算效率(Computational Efficiency)。GoogleNet中没有使用全连接层,这大大减少了参数量。此外,它还使用了“Inception模块”(后面详细讲)。这样一来,整个网络只需要5M的参数量,仅仅是AlexNet的十二分之一!

现在讲一下这个神奇的“Inception模块”。它的主要思想是设计一种效果好的局部网络拓扑结构(local network topology),也就是在网络中嵌套网络,最后把这些网络堆叠成一个网络,示意图大概是这样的:
CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)

举个Inception模块的最naive的栗子(见下图),输入被分别送到不同kernel size的卷积核中(1x1,3x3,5x5),另外还加了一个池化。各部分分别产生输出之后,再把它们连成一个整体作为输出。
CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)

但是直接这样做会有问题,把各部分输出联系来之后,feature map的数量成数倍的增长。我们的解决方案是引入“bottleneck”层,这种层使用1x1的卷积层,不过使用的filter数目更少,也就是说减少了feature map的数量,新的架构举例如下图:
CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)
注意图中的红色部分,它们将256个feature map减少到了64个,也就大大降低了参数量。改进后的Inception模块只需要358M次操作(之前需要854M次)。

在GoogleNet中,网络的开头部分是一个主干形的stem network,这个部分和之前AlexNet和VGG中的差不多,是卷积池化之类的层的叠加(见下图蓝框)。之后把上面说的Inception模块串到了一起,最后加上用于分类的层形(注意没有全连接层)成了整个网络。
CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)

其中需要注意下图中框出来的部分,它们和网络的最后做了类似的工作,也输出了分类标签。最终使用三处输出一起计算loss。这样做的原因是网络层数很多,中间的结果也很有用。此外中间的这两处输出也会计算梯度,这有助于缓解这种层数很多的网络中的梯度消失的问题。
CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)

到这里,整个网络我们就介绍完啦,总体来说,网络之所以这样设计、之所以效果这么好有两方面原因。一是前面提到的Inception Model很有用。此外还有一个重要原因,就是Google财大气粗有钱任性,可以用大量的机器验证各种各样奇奇怪怪的网络架构,最后挑选出效果好的就行了(有钱真好.jpg)。

接下来我们的目光转向2015年的冠军——ResNet,具体请看下一篇文章~