1. 摘要
作者提出了一个代号为 Inception 的卷积神经网络架构,这也是作者在 2014 年 ImageNet 大规模视觉识别挑战赛中用于分类和检测的新技术。
通过精心的设计,该架构提高了网络内计算资源的利用率,因而允许在增加网络的深度和宽度的同时保持计算预算不变。
在作者提交的 ILSVRC14 中使用的一个特定的模型称为 GoogLeNet ,一个 22 层深的网络,在分类和检测的背景下对其性能进行了评估。
2. 介绍
在过去三年中,卷积神经网络在图像识别和物体检测领域取得了巨大的进步。可喜的是,这不仅仅是得益于更强大的硬件、更多的数据和更复杂的模型,更是许多新的想法、算法和改进的网络结构所带来的结果。比如,我们的 GoogLeNet 相比两年前的 AlexNet 参数量少了 12 倍(500 万 VS 6000 万),但是却更加准确。
另一个值得注意的因素是,随着移动和嵌入式计算的不断发展,我们的算法效率,特别是它们的功率和内存使用,变得越来越重要。作者在设计深层的网络结构时就考虑了这一因素,而不仅仅是一味追求准确率的提高。对于文中的大部分实验,这些模型在设计时都要保证测试阶段保持 15 亿次的乘-加操作时间预算。这样,它们就不单单只是为了满足学术界的好奇心,还能够以合理的成本应用到实际中去,即使是在大型数据集上。
作者提出了代号为 Inception 的网络架构,其得名于网络中的网络 (Network in network) 这篇论文,以及与电影 《盗梦空间》有关的一幅图片。
这里的 “深” 有两层意思,其一是引入了我们新的 Inception Module,其二就是直观的网络的深度。
将 Network-in-network 引入卷积神经网络后,其可以看作是一个卷积核为 1×1 的卷积层后面跟着激活函数。 作者在网络中大量使用了这种结构,主要有两个目的:一是降低维度来解决计算瓶颈,因此也限制了网络的大小。这让我们不仅仅能够增加深度,同时也能在对性能没有显著损坏的情况下增加网络的宽度。
3. 动机和考虑
提高网络的性能的最直观的方法就是增加网络的大小,包括增加深度——网络的层数和增加宽度——每层的单元数。这是最简单最好用的方法,特别是给定大量的有标签数据,但是它也有两个主要的缺点。
大的模型通常意味着大量的参数,这在训练数据有限的情况下更容易过拟合。这也是一个主要的瓶颈,因为高质量训练集的建立是非常困难和高昂的,特别是在需要专业的人类评估者来区分像 ImageNe 那样的细粒度视觉类别这种情况下,如下图。
另一方面,统一增加网络的大小会显著增加计算资源的使用。比如,两个连在一起的卷积层,增加卷积核的个数后会导致计算呈平方级增加。而如果增加的参数最后大部分都接近于零的话,许多计算就是被浪费掉了。在计算资源总是有限的情况下,尽管主要目的是增加模型的性能,我们也不能随意增加网络的大小而不注重计算资源的分配。
解决这两个问题的根本方法就是将全连接变为稀疏连接,甚至是在卷积内部。然而,当涉及到非均匀稀疏数据的数值计算时,现在的计算设备效率还非常低。因此,问题就变成了两者的折中,是否能设计一种结构,既能利用稀疏性又能利用当前硬件计算密集矩阵的优势。
4. 网络架构
Inception 架构的主要思想是说,要找出卷积视觉网络中的最佳局部稀疏结构是如何通过容易获得的密集组件来近似和覆盖的。在设计网络的时候,我们应该分析上一层的相关统计特性,将它们聚集成具有高相关性的单元组。我们假设来自前面层的每个单元对应于输入图像的某个区域,并且这些单元被划分为滤波器组。
在离输入较近的层,相关的单元可能更集中于局部区域。这就意味着大量的聚类集中在一个区域,这种情况可以用一个 1×1 卷积核来实现。同理,一些其它聚类可能有更大的空间区域,也就需要我们用更大的卷积核来实现。为了避免对齐问题,作者只采用了 1×1、3×3 和 5×5 三种卷积核大小,但这不是必须的。此外,由于池化在一些卷积网络中必不可少,作者也引入了一个池化通道。
随着这些模块的叠加,特征一级一级逐渐被深层的网络所捕获,它们的空间集中度应该会逐渐减小,也就是说在更深的网络层更大尺寸 3×3 和 5×5 的卷积核应该会增加。
但是上面的结构有一个很大的问题,在通道数量非常多的卷积网络上,即使采用适量的 5×5 卷积核,计算也会非常昂贵。引入池化后,上面的现象变得更加明显,因为池化后的通道数与前一层相同。这样,经过几层之后,计算量就会逐渐爆炸。
因此,作者在计算比较昂贵的 3×3 和 5×5 卷积前先引入 1×1 的卷积,对通道的维度进行降低,同时也包含一个非线性激活函数。
我们的网络通常由一系列上面的模块级联而成,同时增加步长为 2 的最大池化层来将分辨率减半,而且,在更深的网络层中引入 Inception 模块而前面的层采用传统的卷积网络效果似乎更好。
该架构的主要好处之一是它允许在每个阶段显著增加单元的数量而不会导致计算复杂性不受控制地爆炸。另一个实用的方面是它与直觉相符,也即视觉信息应该以各种比例处理然后聚合,以便下一阶段可以同时抽象来自不同尺度的特征。
5. GoogLeNet
GoogLeNet 得名于作者的队伍名称,同时也是为了致敬经典的 LeNet 结构。其模型构架如下所示:
注:个人认为上表中的参数一栏有些不准确,比如第一个卷积层,卷积核的权重参数应该为 6477*3=9408,表中为 2.7K 。
网络的输入是 224×224 的 RGB 图像减去各通道像素的均值,所有的激活函数都是 ReLU。‘#3×3 reduce’ 代表在 3×3 卷积之前先利用 1×1 的卷积对通道数进行降低,‘#5×5 reduce’ 同理。‘pool proj’ 代表在最大池化后再经过一个 1×1 的卷积。
将每个 Inception 模块看做两层的话,带参数的层总共有 22 层,所有层独立计算的话网络总共大约 100 层。给定这个较深的网络,将梯度有效地反向传播是一个难点。
通过较浅的网络在分类任务上的强大表现得出了一个有趣的见解,网络中间层的特征非常具有判别性。因此,作者添加了一些连接到这些中间层的辅助分类器,期望能够鼓励较低阶段特征的判别性,来增加反向传播的梯度信号并且提供额外的正则化。详细网络结构如下图所示:
在训练阶段,这些辅助分类器的损失乘以权重 0.3 后和网络的总损失加到一起。在测试阶段,它们则被抛弃。辅助分类器的结构是这样的:
- 一个平均池化层,卷积核大小 5×5,步长为 3
- 一个 1×1 的卷积层,卷积核数量 128
- 一个 1024 个单元的全连接
- 一个 Dropout 层丢弃率为 70%
- 一个 Softmax 层用于 1000 分类,测试时被抛弃
6. 实验结果
训练多个模型,它们的参数初始化和学习率策略都是一样的,但获取训练图片的采样方法不同以及看到训练集的顺序是随机的。然后,对一个测试图片,通过不同的方法裁剪出多张图片。最后,将这些不同图片不同模型的输出结果做一个平均作为最终的预测结果。
获取更多精彩,请关注「seniusen」!