GoogLeNet
2014年,谷歌的Szegedy等人在《Going deeper with convolutions》提出GoogLeNet(据说是为了致敬“LeNet)。
1. Inception
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
- 参数太多,如果训练数据集有限,很容易产生过拟合;
- 参数越多,计算复杂度高;
- 网络越深,容易出现梯度消失,难以优化模型。
解决这些问题的方法就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但全连接变成稀疏连接后实际计算效率并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。
可将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,如人类的大脑可看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,构造一种“基础神经元”结构,既保持网络结构的稀疏性,又不降低模型的计算性能。Inception结构对前一层网络的综合采用不同大小的卷积核提取特征,并结合最大化池化进行特征融合。
原始Inception结构
该结构将CNN中常用的卷积(
1
×
1
1 \times 1
1×1,
3
×
3
3 \times 3
3×3,
5
×
5
5 \times 5
5×5)、池化操作(
3
×
3
3 \times 3
3×3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。
网络卷积层中的网络能够提取输入的每一个细节信息,同时 5 × 5 5 \times 5 5×5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个ReLU操作,以增加网络的非线性特征。
Inception v1的网络结构
假设网络输入
28
×
28
×
192
28 \times 28 \times 192
28×28×192
-
使用32个 5 × 5 × 192 5 \times 5 \times 192 5×5×192的卷积核,输出为 28 × 28 × 32 28 \times 28 \times 32 28×28×32,计算量为 5 × 5 × 192 × 28 × 28 × 32 = 120 , 422 , 400 5 \times 5 \times 192 \times 28 \times 28 \times 32 = 120,422,400 5×5×192×28×28×32=120,422,400。
-
使用 1 × 1 1 \times 1 1×1卷积:先用16个 1 × 1 × 192 1 \times 1 \times 192 1×1×192的卷积核,输出为 28 × 28 × 16 28 \times 28 \times 16 28×28×16,再用32个 5 × 5 × 16 5 \times 5 \times 16 5×5×16的卷积核,输出为 28 × 28 × 32 28 \times 28 \times 32 28×28×32。
- 第一次计算量为 1 × 1 × 192 × 28 × 28 × 16 = 2 , 408 , 448 1 \times 1 \times 192 \times 28 \times 28 \times 16 = 2,408,448 1×1×192×28×28×16=2,408,448
- 第二次计算量为 5 × 5 × 16 × 28 × 28 × 32 = 10 , 035 , 200 5 \times 5 \times 16 \times 28 \times 28 \times 32 = 10,035,200 5×5×16×28×28×32=10,035,200
- 总计算量为 12 , 443 , 648 12,443,648 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
3 \times 3
3×3,
5
×
5
5 \times 5
5×5卷积操作之前使用了
1
×
1
1 \times 1
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 7 \times 7 7×7分解成两个一维的卷积( 1 × 7 , 7 × 1 1 \times 7,7 \times 1 1×7,7×1), 3 × 3 3 \times 3 3×3也是一样( 1 × 3 , 3 × 1 1 \times 3,3 \times 1 1×3,3×1),这样的好处,既可以加速计算,又可以将1个卷积拆成2个卷积,使得网络深度进一步增加,增加了网络的非线性(每增加一层都要进行ReLU)。另外,网络输入从 224 × 224 224 \times 224 224×224变为了 299 × 299 299 \times 299 299×299。
- Inception V4主要利用残差连接(Residual Connection)来改进V3结构。