2014年,谷歌的Szegedy等人在《Going deeper with convolutions》提出GoogLeNet(据说是为了致敬“LeNet)。
1. Inception
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
参数太多,如果训练数据集有限,很容易产生过拟合;
参数越多,计算复杂度高;
网络越深,容易出现梯度消失,难以优化模型。
解决这些问题的方法就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但全连接变成稀疏连接后实际计算效率并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。
可将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,如人类的大脑可看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,构造一种“基础神经元”结构,既保持网络结构的稀疏性,又不降低模型的计算性能。Inception结构对前一层网络的综合采用不同大小的卷积核提取特征,并结合最大化池化进行特征融合。
原始Inception结构
该结构将CNN中常用的卷积(1 × 1,3 × 3 ,5 × 5 )、池化操作(3 × 3 )堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。
网络卷积层中的网络能够提取输入的每一个细节信息,同时5 × 5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个ReLU操作,以增加网络的非线性特征。
Inception v1的网络结构
假设网络输入28 × 28 × 192 28 \times 28 \times 19228×28×192
使用32个5 × 5 × 192 5 \times 5 \times 1925×5×192的卷积核,输出为28 × 28 × 32 28 \times 28 \times 3228×28×32,计算量为5 × 5 × 192 × 28 × 28 × 32 = 120 , 422 , 400 5 \times 5 \times 192 \times 28 \times 28 \times 32 = 120,422,4005×5×192×28×28×32=120,422,400。
使用1 × 1 卷积:先用16个 1 × 1 × 192 的卷积核,输出为28 × 28 × 16,再用32个 5 × 5 × 16 6卷积核,输出为28 × 28 × 32
第一次计算量为1 × 1 × 192 × 28 × 28 × 16 = 2 , 408 , 448
第二次计算量为5 × 5 × 16 × 28 × 28 × 32 = 10 , 035 , 200
总计算量为12 , 443 , 648 ,计算量大大减低。
2. 网络结构
GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改。网络最后采用了average pooling(平均池化)来代替全连接层(虽然移除了全连接,但是网络中依然使用了Dropout ),该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。实际在后还是加了一个全连接层,主要是为了方便对输出进行灵活调整。
为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。
各层输入输出及参数数量如下(表中“#3x3 reduce”,“#5x5 reduce”表示在3 × 3 ,5 × 5卷积操作之前使用了1 × 1卷积的数量。):
2014至2016年,GoogLeNet团队发表了多篇关于GoogLeNet的经典论文《Going deeper with convolutions》、《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》、《Rethinking the Inception Architecture for Computer Vision》、《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》。
Inception V2修改Inception的内部计算逻辑,提出了比较特殊的“卷积”计算结构。
Inception V3一个最重要的改进是分解(Factorization),将7 × 7 分解成两个一维的卷积(1 × 7 , 7 × 1 ),3 × 3 也是一样(1 × 3 , 3 × 1 ),这样的好处,既可以加速计算,又可以将1个卷积拆成2个卷积,使得网络深度进一步增加,增加了网络的非线性(每增加一层都要进行ReLU)。另外,网络输入从224 × 224变为了299 × 299
Inception V4主要利用残差连接(Residual Connection)来改进V3结构