本课重点:
-
经典CNN架构
-
AlexNet
-
VGG
-
GoogLeNet
-
ResNet
-
-
其他架构
1 经典架构
1.1 AlexNet
首先回顾一下在数字识别领域有巨大成功的LeNet-5,该网络结构为 [CONV-POOL-CONV-POOL-FC-FC]。卷积层使用5x5的卷积核,步长为1;池化层使用2x2的区域,步长为2;后面是全连接层。如下图所示:
而2012年的AlexNet是第一个在ImageNet大赛上夺冠的大型CNN网络,它的结构和LeNet-5很相似,只是层数变多了——[CONV1-MAX POOL1-NORM1-CONV2-MAX POOL2-NORM2-CONV3-CONV4-CONV5-Max POOL3-FC6-FC7-FC8],共有5个卷积层、3个池化层、2个归一化层和三个全连接层。如下图所示:
- 输入:227x227x3的图片;
- CONV1:使用96个11x11大小的卷积核,步长为4,由于(227-11)/4+1=55,所以输出的尺寸为55x55x96,共有96x11x11x3个参数;
- POOL1:使用3x3的池化区域,步长为2,由于(55-3)/2+1=27,所以输出为27x27x96,没有参数;
- NORM1:归一化后仍然是27x27x96;
- CONV2:使用256个5x5的卷积核,stride 1、pad 2 ,(27+2x2-5)+1=27,所以输出为27x27x256;
- POOL2:3x3 filters,stride 2 ,(27-3)/2+1=13,所以输出为13x13x256;
- NORM2:13x13x256;
- CONV3: 384个3x3 filters,stride 1, pad 1,输出 [13x13x384] ;
- CONV4: 384个3x3 filters,stride 1, pad 1,输出[13x13x384] ;
- CONV5: 256个3x3 filters,stride 1, pad 1,输出 [13x13x256];
- POOL3: 3x3 filters,stride 2 输出为[6x6x256];
- FC6: 4096个神经元,输出为[4096];
- FC7: 4096个神经元,输出为[4096];
- FC8: 1000个神经元,(class scores)输出为[1000]。
之所以分成上下两个部分,是因为当时的GPU容量太小,只能用两个来完成。还有一些细节是:
- 第一次使用ReLU函数;
- 使用归一化层(现在不常用了) ;
- 数据增强;
- dropout 0.5 ;
- batch size 128;
- SGD Momentum 0.9 ;
- 学习率1e-2, 当验证准确率平稳时,手动减少10;
- L2权重衰减是5e-4
- 7 CNN ensemble: 18.2% -> 15.4%
AlexNet夺得ImageNet大赛2012的冠军时,将正确率几乎提高了10%,2013年的冠军是ZFNet,和AlexNet使用相同的网络架构,只是对超参数进一步调优:
- CONV1: 将 (11x11 stride 4) 改为 (7x7 stride 2) ;
- CONV3,4,5: 不再使用384, 384, 256个滤波器,而是使用512, 1024, 512个。
这样将错误率从16.4%降低到11.7%
14年的冠亚军GoogLeNet和VGG分别有22层和19层,下面来分别介绍。
1.2 VGG
VGG相对于AlexNet使用更小的卷积核,层数也更深。VGG有16层和19层两种。卷积核只使用3x3,步长为1,pad为1;池化区域2x2,步长为2。
那么为什么使用3x3的小卷积核呢?
- 多个卷积层堆叠时,第一层的感受野是3x3,第二层的感受野是5x5(感受原图像),这样堆叠三层的有效感受野就变成7x7;
- 多个3x3的卷基层比一个大尺寸卷积核的卷积层有更多的非线性(更多层的非线性函数),使得判决函数更加具有判决性;
- 多个3x3的卷积层比一个大尺寸的卷积核有更少的参数,假设卷积层的输入和输出的特征图大小相同为C,那么三个3x3的卷积层参数个数3x(3x3xCxC)=27C2;一个7x7的卷积层参数为 7x7xCxC=49C2;所以可以把三个3x3的filter看成是一个7x7filter的分解(中间层有非线性的分解, 并且起到隐式正则化的作用)。
下面看一下VGG-16的参数和内存使用情况:
- 总内存占用: 24M * 4 bytes,每张图片约96MB,加上反向传播需要乘以2;大多数内存都用在了前面几层卷积层;
- 总参数个数: 138M,大多都在全连接层,全连接层的第一层就有100多M。
VGG网络的一些细节是:
- 14年ImageNet大赛分类第二名,定位第一名;
- 训练过程和AlexNet很接近;
- 不使用局部响应归一化;
- 有16层和19层两种,19层效果稍微好一些,但是占用更多内存,16层应用的更广泛;
- 使用模型集成;
- FC7的特征泛化非常好,可以直接用到其他任务中。
下面来看一下分类的第一名,GoogLeNet。
1.3 GoogLeNet
先说明GoogLeNet的一些细节:
- 网络有22层,比VGG深一些;
- 为了高效的计算,使用 “Inception” 模块;
- 不使用全连接层;
- 只有500万个参数,比AlexNet少了12倍;
- 14年分类的冠军(6.7% top 5 error)
1.3.1 Inception Module
“Inception”模块是一种设计的比较好的局域网拓扑结构,然后将这些模块堆叠在一起。
这种拓扑结构对来自前一层的输入,并行应用多种不同的滤波操作,比如1x1卷积、3x3卷积、5x5卷积和3x3池化。然后将所有滤波器的输出在深度上串联在一起。如下图所示:
但是这种结构的一个问题是计算复杂度大大增加。比如考虑下面的网络设置:
输入为28x28x256,而串联后的输出为28x28x672。(假设每个滤波操作都通过零填充保持输入尺寸)并且运算花费也非常高:
- [1x1 conv, 128] 28x28x128x1x1x256次乘法运算;
- [3x3 conv, 192] 28x28x192x3x3x256次;
- [5x5 conv, 96] 28x28x96x5x5x256次。
总计: 854M次乘法运算。
由于池化操作会保持原输入的深度,所以网络的输出一定会增加深度。解决办法是在进行卷积操作前添加一个“瓶颈层”,该层使用1x1卷积,目的是保留原输入空间尺寸的同时,减小深度,只要卷积核的数量小于原输入的深度即可。
使用这种结构,同样的网络参数设置下,的确会减少计算量:
最终得到的输出为28x28x480。此时总运算量为:
- [1x1 conv, 64] 28x28x64x1x1x256
- [1x1 conv, 64] 28x28x64x1x1x256
- [1x1 conv, 128] 28x28x128x1x1x256
- [3x3 conv, 192] 28x28x192x3x3x64
- [5x5 conv, 96] 28x28x96x5x5x64
- [1x1 conv, 64] 28x28x64x1x1x256
总计:358M。减少了一倍多。
1.3.2 完整结构
Inception module堆叠成垂直结构,这里方便描述,将模型水平放置:
蓝色部分主干网:
Input - Conv 7x7+2(S) - MaxPool 3x3+2(S) - LocalRespNorm - Conv 1x1+1(V) - Conv 3x3+1(S) - LocalRespNorm - MaxPool 3x3+2(S)
含参数的层只有3个卷积层;红色部分Inception module堆叠:
并行层只算一层,所以一个Inception module只有两层,共有9个相同的模块18层。绿色部分的输出:
移除昂贵的全连接层,只留一个分类用的FC。
AveragePool 7x7+1(V) - FC - SoftmaxActivation - Output
所以含参数的层总计3+18+1 = 22层。此外,橙色部分的层不计入总层数,这两块的结构都是:AveragePool 5x5+3(V) - Conv 1x1+1(S) - FC - FC - SoftmaxActivation - Output。“该相对较浅的网络在此分类任务上的强大表现表明,网络中间层产生的特征应该是非常有区别性的。 通过添加连接到这些中间层的辅助分类器,我们期望在分类器的较低阶段中鼓励区分,增加回传的梯度信号,并提供额外的正则化。 这些辅助分类器采用较小的卷积核,置于第三和第六个Inception module的输出之上。 在训练期间,它们的损失会加到折扣权重的网络总损失中(辅助分类的损失加权为0.3)。 在预测时,这些辅助网络被丢弃。”——引自原论文
1.4 ResNet
从2015年开始,网络的层数爆发式的增长,15-17年的冠军都是有152层,开始了“深度革命”!
ResNet是一种非常深的网络,使用了残差连接。细节是:
- 152层;
- ILSVRC’15优胜者(3.57% top 5 error);
- 横扫了所有ILSVRC’15 和COCO’15分类/检测的竞赛!
表现这么好的ResNet仅仅是因为深吗?答案是否定的,研究表明一个56层的卷积层堆叠网络训练误差和测试误差都比一个20层的网络要大,并且不是过拟合的原因,而是更深的网络优化更难。但是一个更深的模型至少能和一个较浅的模型表现一样好,如果想把一个较浅的层变成较深的层,可以用下面的方式来构建:将原来比较浅的层拷贝到较深的层中,然后添加一些等于本身的映射层。现在较深的模型可以更好的学习。
1.4.1 核心思想
ResNet通过使用多个有参层来学习输入与输入输出之间的残差映射( residual mapping ),而非像一般CNN网络(如AlexNet/VGG等)那样使用有参层来直接学习输入输出之间的底层映射( underlying mapping)。
残差学习(Residual Learning)
若将输入设为X,将某一有参网络层映射设为H,那么以X为输入的该层的输出将为H(X)。通常的CNN网络会直接通过训练学习出参数函数H的表达式,从而直接得到 X 到 H(X) 的映射。而残差学习则是致力于使用多个有参网络层来学习输入到输入、输出间的残差(H(X) - X)的映射,即学习 X -> (H(X) - X) ,然后加上X的自身映射(identity mapping)。也就是说网络的输出仍然是 H(X) - X + X = H(X),只是学习的只是 (H(X) - X),X部分直接是本身映射。
自身映射(Identity Mapping)
残差学习单元通过本身映射的引入在输入、输出之间建立了一条直接的关联通道,从而使得强大的有参层集中精力学习输入、输出之间的残差。一般我们用来表示残差映射,那么残差学习单元的输出即为:。当输入、输出通道数相同时,自然可以直接使用 X 进行相加。而当它们之间的通道数目不同时,我们就需要考虑建立一种有效的自身映射函数从而可以使得处理后的输入 X 与输出 Y 的通道数目相同即。
当X与Y通道数目不同时,有两种自身映射方式。一种是简单地将X相对Y缺失的通道直接补零从而使其能够相对齐,另一种则是通过使用1x1的卷积来表示 Ws 映射从而使得最终输入与输出的通道一致。
实验表明使用一般意义上的有参层来直接学习残差比直接学习输入、输出间映射要容易得多(收敛速度更快),也有效得多(可通过使用更多的层来达到更高的分类精度)。比如在极端情况下,如果自身映射是最优的,那么将残差设为零比通过使用一堆非线性层进行自身映射更容易。
1.4.2 完整结构
完整的网络结构如下:
- 残差块堆叠;
- 每个残差块有两个3x3卷积层;
- 周期性的使用两倍的卷积核数量,降采样通过设置步长为2;
- 在网络开始处有7x7的卷积层和最大池化层(步长2);
- 在网络的最后不使用全连接层 (只有一个用于1000个分类的FC);
- 在最后一个卷积层后使用全局的平均池化;
- 总共的深度有34、50、101或152。
对于ResNet-50+的网络,为提高计算效率,使用类似GoogLeNet的“瓶颈层”。像Inception模块那样通过使用1x1卷积来巧妙地缩减或扩张特征图维度从而使得3x3 卷积的卷积核数目不受上一层输入的影响,它的输出也不会影响到下一层。不过它纯是为了节省计算时间进而缩小整个模型训练所需的时间而设计的,对最终的模型精度并无影响。
1.4.3 网络训练
ResNet的实际训练如下:
- 每个CONV层后使用批量归一化;
- 权重使用He初始化;
- 更新方式使用SGD + Momentum (0.9) ;
- 学习率为0.1, 验证错误率不变时除10 ;
- Mini-batch size为256 ;
- 权重衰减是1e-5 ;
- 不使用dropout。
实际的训练效果为可以堆叠很多的层而不使准确率下降:152在ImageNet上, 1202层在CIFAR上。现在和预想中的一致,网络越深,训练准确率越高。横扫了2015年所有的奖项,第一次超过人类的识别率。
1.5 几种网络的对比
下面左图通过Top1准确率来比较各种网络的准确性;右图是不同网络的运算复杂度,横轴为计算量,圆圈大小表示内存占用。其中 Inception-v4是 Resnet + Inception。
图中可以看出:
- Inception-v4具有最高的准确率;
- VGG内存占用最大,计算量最多;
- GoogLeNet最高效,准确率较高,运算复杂度较小;
- AlexNet计算量较小但内存占用较大,准确率也低;
- ResNet准确率较高,效率取决于模型。
还可以比较前向传播时间和功率消耗:
2 其他网络架构
2.1 Network in Network (NiN)
- 在每个卷积层内的Mlpconv层具有“Micronetwork”用于计算局部区域的更抽象的特征;
- Micronetwork使用多层感知器(FC,即1x1卷积层)
- GoogLeNet和ResNet“瓶颈”层的先驱
- GoogLeNet的哲学灵感
2.2 ResNet的改进
-
Identity Mappings in Deep Residual Networks
- 创造者自己改进了ResNet块设计
- 创建更直接的路径,以便在整个网络中传播信息(将激活函数移动到残差的映射路径)
- 提供更好的性能
-
Wide Residual Networks
- 认为残差是重要因素,而不是深度
- 使用更宽的残差块(F x k个滤波器代替每层中的F个滤波器)
- 50层Wide ResNet优于152层原始ResNet
- 增加宽度而不是深度更具计算效率(可并行化)
-
ResNeXt
- 也来自ResNet的创建者
- 通过多个平行路径增加残差块的宽度(“cardinality”)
- 与Inception模块相似的并行路径
- 单个分支“变窄”
-
Deep Networks with Stochastic Depth
- 动机:在训练期间通过缩短网络减少梯度消失和训练时间
- 在每次训练过程中随机丢弃一个层子集
- 具有自身映射功能的旁路,丢弃的层权重为1,恒等映射
- 在测试时使用完整的深度网络
-
Network Ensembling(Fusion)
- 多尺度集成 Inception、Inception-Resnet、Resnet、Wide Resnet模型
- ILSVRC'16分类获胜者
-
Squeeze-and-Excitation Networks (SENet)
- 添加“特征重新校准”模块,该模块学习自适应重新加权特征图
- 全局信息(全局平均池化层)+ 2个FC层,用于确定特征图权重,即“特征重新校准”模块
- ILSVRC'17分类获胜者(使用ResNeXt-152作为基础架构)
2.3 FractalNet
- 认为关键是从浅层到深层有效地过渡,并且不需要残差表示
- 具有浅和深路径输出的分形结构
- 训练时随机抛弃子路径
- 测试时使用完整网络
2.4 Densely Connected Convolutional Networks
- 密集块,其中每个层以前馈方式连接到之后的每个层
- 减轻梯度消失、加强特征传播、鼓励特征重用
2.5 Efficient Networks —— SqueezeNet
- 由1x1卷积核组成“挤压”层,然后构成Fire模块,由1x1和3x3卷积核组成“扩展”层
- ImageNet上的AlexNet级精度,参数减少50倍
- 可以压缩到比AlexNet小510倍(0.5Mb参数)
2.6 Learn network architectures —— Meta-learning
-
Neural Architecture Search with Reinforcement Learning (NAS)
- 一种“控制器”网络,可以学习设计良好网络架构(输出与网络设计相对应的字符串)
- 迭代:
1)从搜索空间中采样架构
2)训练架构以获得相应于准确度的“奖励”R
3)计算样本概率的梯度,并通过R进行缩放以执行控制器参数更新(即增加被采样架构良好的可能性,减少不良架构的可能性)
-
Learning Transferable Architectures for Scalable Image Recognition
- 将神经架构搜索(NAS)应用于像ImageNet这样的大型数据集非常昂贵
- 设计可以灵活堆叠的构建块(“单元”)的搜索空间
- NASNet:使用NAS在较小的CIFAR-10数据集上找到最佳的单元结构,然后将架构转移到ImageNet
总结
- 经典架构
- AlexNet:开启CNN时代。
- VGG:减小卷积核尺寸、增加网络层数获得高准确率。
- GoogLeNet:引入 Inception module 。
- ResNet:引入残差块,证明普通堆叠层数没意义,残差堆叠可以;目前应用最广泛的网络结构。
- 其他架构
- NiN (Network in Network) :1x1卷积先驱
- Wide ResNet:加大ResNet的宽度而不是深度
- ResNeXT:使用多个分支加宽ResNet
- Stochastic Dept:Dropout层
- SENet:自适应特征图重新加权
- DenseNet:每个层连接到之后的每个层
- FractalNet:使用分形结构,不用残差
- SqueezeNet:压缩网络,减少参数
- NASNet:学习网络架构
- 总结
- VGG、GoogLeNet、ResNet均被广泛使用,可在模型族中获取 ;
- ResNet是当前默认最佳的选择,也可考虑SENet ;
- 研究趋向于极深的网络 ;
- 研究重心围绕层/跳过连接的设计和改善梯度流
- 努力研究深度、宽度与残差连接的必要性
- 更近期的趋势是研究meta-learning