专栏首页机器学习、深度学习GoogleNet - Going deeper with convolutions

GoogleNet - Going deeper with convolutions

CVPR 2015

本文针对 ILSVRC14 提出了一个名叫 Inception 的深度卷积网络架构,主要是通过充分利用网络内的计算资源来提升网络性能,具体是通过在增加网络的宽度和深度同时控制住计算量来实现的。小尺寸滤波器组合 + 1*1滤波器降维

1 Introduction 最近三年,由于深度学习的发展,更多CNN网络的提出,导致图像识别和目标检测取得很大进展。这其中既有更好的硬件、更大的数据库,更大的模型等因素,但是更有更好的算法层面因素。例如我们用于 ILSVRC 2014 的 GoogleNet 比 AlexNet 参数减少了 12倍,但是性能 比AlexNet 更好。 在检测领域最大的进步不是来自对网络结构的优化或更大的模型,而是来自 将 传统视觉方法和 深度网络结合起来,例如文献【6】中的 R-CNN算法。

另一个重要的因素是随着移动设备和嵌入式设备计算能力持续增加,我们高效的算法(特别是在功耗和内存使用上)就显得比较重要了。可以将深度学习实际应用起来,获得更广的商业前景,而不仅仅局限于学术研究。

本文主要是结合文献【1】和【12】设计了一个高效的深度卷积网络,冠名为 Inception。这里的“deep”有两个不同的含义:1)我们通过 “Inception module”的形式引入了一个新的网络组织形式,2)网络深度的增加。总之,我们可以将 Inception 模型看做是对 文献【12】极致的逻辑发展,同时使用文献【2】作为理论基础来引导我们的工作。最后通过 ILSVRC 2014 竞赛来验证模型的有效性。

2 Related Work 从文献【10】LeNet-5 开始,卷积网络的标准结构是一组卷积网络的叠加(有时引入了归一化和最大池化),随后是一层或多层的全链接层。后续的各种网络都是在此基础上进行的改进,更多的训练数据,更多的网络层数,更宽的网络,防止过拟合技术如 dropout。

文献【12】提出的 Network-in-Network 主要是用来增加网络的表达能力。当用于卷积层时,这个方法可以被看作是一个 1*1 卷积层紧随其后是 ReLU 激活函数。 这很容易被嵌入到当前的CNN网络架构中。在这里我们大量使用了该方法。但是这里的 1*1 卷积有两个目的:1)主要作为降维模块来移除计算瓶颈,这些计算瓶颈会约束我们网络的尺寸。2)不仅增加了网络的深度,也增加了网络的宽度,并且没有牺牲网络的性能。

当前最好的目标检测算法是文献【6】的 R-CNN, 它将检测问题分为两个子问题:首先利用传统方法提取目标候选区域,然后使用 CNN 网络对候选区域进行分类。 我们的检测系统也采取了类似的思路,深入到两个子问题里面提升性能。

3 Motivation and High Level Considerations 提升CNN网络性能最直接的方法就是 增加网络的规模,包括 整个网络的深度和每层网络的宽度。这是一个简单而安全方法,可以训练得到好模型。特别是有大量标定的训练数据。但是这个方法有两个问题。

1)大的模型通常意味着大量的参数,这使得模型很容易过拟合,特别是当训练数据有限时。这将变为主要瓶颈,因为标定大量高质量的训练数据需要的投入很大。

2) 连续的增加网络规模会导致计算量的快速增加。例如,一个深度视觉网络,如果有两个卷积层级联,对它们的滤波器数量均匀的增加会导致计算量二次方的增加。如果增加的网络参数没有被很好的利用(例如大多数参数接近0),那么这些计算资源都被浪费了。因为在实际中,计算资源总是有限的,所以计算资源的有效分配比盲目增加网络规模对于提升网络性能更有效。

解决上述两个问题最根本的方法就是将全连接变为稀疏连接,甚至在卷积内部也是如此。文献【2】的主要结果:如果一个数据集的概率分布可以由一个很大,很稀疏的深度网络来表示,那么最优的网络结构可以通过如下方式一层一层的构建:通过分析前一层激活响应的相关性,将高度相关的输出神经元聚类,以此来构建下一层。尽管数学证明这个结果需要很强的条件约束,但是这个结果和广为人知的 Hebbian principle( neurons that fire together, wire together,一起激活的细胞连在一起)是一致的。

从底层来看,今天的计算结构对于非均匀稀疏数据结构的数值计算很不高效。尤其是我们在CPU 或 GPU 针对密集矩阵计算做了大量优化工作。这导致本来是采用 稀疏结构的 CNN网络例如文献【11】又重新回到了全链接,这样做是为了更方便 GPU做并行计算。 这个均匀的结构,大尺寸的滤波器,大批量都考虑了更好利用高效的密集计算。

那么针对这个情况,有没有一个中间步骤:一个网络架构即可以利用额外的稀疏结构,甚至在滤波器层面上,又充分利用了我们目前具有高效的密集计算硬件。关于稀疏矩阵计算方面的大量文献(例如文献【3】)表明将稀疏矩阵聚类为相对密集的子矩阵可以提升稀疏矩阵乘法的性能。这种方法应该可以被用于深度卷积稀疏网络。

Inception 网络架构是以文献【2】的工作为基础,通过实验我们发现其在计算机视觉上的有效性。当然这种有效性具有一些试验性质,它没有从理论上证明其正确性。为后面研究做的一个尝试。

4 Architectural Details Inception 架构的主要思想基于 怎么用现成的密集连接模块来近似和覆盖卷积视觉网络中的局部稀疏结构。这里我们假定平移不变性是指我们的网络使用卷积模块来构建。我们所要做的就是怎么最优局部构建,并在空间上重复这个构建。文献【2】建议的一层一层构建方式是:分析前一层的相关性,然后将高相关的神经元聚类。这些类作为下一层的神经元,并且和前一层的神经元相连接。我们假定前面层的每个神经元对应输入图像的某个区域,这些神经元被聚类为一组滤波器(用这组滤波器来学习对应的图像区域,学习其内在信息)。在靠近输入图像的卷积层中相关的神经元对应图像中的局部区域。这意味着一个区域会集中很多个聚类,他们可以通过一个 1*1的卷积层来覆盖(学习),就像文献【12】所建议一样。但是,很明显会有另外一种情况,大的图像块可以用较少的聚类来覆盖,(大的图像块我们可以用大尺寸的滤波器来学习,这样用到的滤波器就会少一些),那么图像块越大,使用的滤波器也就越少。为了避免滤波器这就的对应问题,当前的 Inception 网络将滤波器的尺寸限制在 1*1,3*3*,5*5,当然这种约束只是为了方便而不是必须如此。这也就是说将这些滤波器的输出组合为一个输出向量,作为下一层网络的输入。此外,鉴于池化操作在当前CNN网络结构中的重要性,我们可以在每一层加入一个交替并行池化通道,以此获得额外性能。结构如下图所示:

经过一系列的 Inception 模块处理,原来的相关性必然会发生变化:随着后面网络层对特征的持续抽象提取,特征的空间聚集性会降低(即通过加入非线性来降低特征的相关性),那么在后面的网络层我们可以使用更多的3*3, 5*5 的线性滤波器。

上面这种思路有一个大问题,当一个卷积层有很多滤波器,在该层上做一些5*5的卷积,其运算量也是难以接受的。如果加入池化模块,问题将变得更加的严重:池化输出滤波器的数目等于前一层滤波器的数目,那么卷积层滤波器的输出再加上池化层的输出,这些输出作为下一层的输入,如此一层层的叠加。那么即使这个架构可以覆盖最优稀疏结构,它的效率也不是很好,导致运算瓶颈。

我们提出本文的第二个亮点来解决该问题:对需要大量计算的地方进行降维处理。这是基于 embeddings 的成功:对于一个相对较大的图像块,即使是低纬的embeddings 也可以用来表示该图像块的大量的信息。但是 embeddings 以一种稠密、压缩的方式表示信息。对一个模型来说,压缩的信息是比较难处理的。所以我们对于网络中大多数地方保持稀疏表示,对于运算量大的地方进行信息压缩。也就是说在昂贵的 3*3 和 5*5 卷积前加入 1*1 卷积来降低运算量。此外1*1 的卷积因为激活函数的缘故增加了网络的非线性表达能力,达到了双重目的(降低运算量,增加非线性)。

Inception 网络大体上有上面介绍的各个模块组合起来,有的地方加入最大池化层。出于技术上原因(训练时的内存效率),在网络较后的层保持原来的卷积结构,当然这不是必须的。

该网络结构的一个优点就是在增加单层网络的神经元数量的同时控制了计算量的增加。独特的降维处理使得前一层的大尺寸滤波器的输出信息可以传递到下层去,在进行大尺寸卷积之前进行降维。也可以从另一个角度来看待这种设计,应该在各种尺度对图像信息进行处理,然后再综合起来输入到下一层,这样可以把不同尺度的抽象特征同时提取出来。

这么设计使得我们可以增加网络的宽度和深度,又摆脱了计算上的困难。如果对原有网络如 AlexNet 引入本文提出的结构,可以提高网络的速度,稍稍降低了些性能,大约快 2-3倍,但是这需要很小心的手工设计网络。

5 GoogLeNet 我们使用 GoogLeNet 参加 ILSVRC14 竞赛,相对于网络的结构,网络具体参数设置是次要的。

网络中所有的卷积,包括Inception 中的卷积, 都使用 ReLU激活函数, 输入图像是 224*224 的 RGB图像,做减均值预处理。#3×3 reduce 和 #5×5 reduce 代表 在 3×3 和5×5卷积之前进行的 1×1的降维处理层,这些降维层也使用 ReLU激活函数。

设计网络之初就考虑了计算的效率和实用性,所以训练好的网络模型可以计算资源有限的设备上运行。网络大的层数是22层,一共有大约 100小的层。当然这个数目依赖于机器学习架构系统。在分类器钱加入均值池化是参考文献【12】的,当然我们的实现不一样,是通过额外的线性层实现的。这么做使得微调我们的网络更加容易,当然不这么做也不会产生太大影响。我们发现将全连接层变为均值池化提高了 top-1 精度 0.6%, 但是即使去掉全连接层, dropout 也是必须的。

因为网络规模比较大,以一种有效的方式将梯度信息回传到网络的所有层是一个需要关注的问题(训练时的后向传播)。我们注意到,相对较少层数的网络的性能也很好,这就意味着 GoogleNet 网络中间层的特征也很 discriminative,通过在这些中间层加入辅助的分类器,通过训练来提升这些中间层的分类器效果,这么做可以增加回传的梯度强度,起到一个镇定作用。这些分类器以小型卷积网络形式加入到中间层去。在训练时,这些分类器的误差加入到系统总体误差,(乘以一个0.3的系数)。在inference 时, 这些辅助网络就被丢弃。

整个网络右边额外的结构(包括辅助分类器)如下: 1)一个 5*5 的均值池化,步长3, 这样网络(4a)的输出就是 4×4×512 ,网络(4d)的输出就是4×4×528 2)128个 1*1 卷积用于降维, 使用 ReLU激活函数 3)一层1024个神经元的全链接层,使用 ReLU激活函数 4)一个 dropout 层, 70% 概率 5)一个 softmax 线性层作为分类器

6 Training Methodology 我们的网络使用 DistBelief【4】分布式系统训练。我们是CPU实现的, 如果用GPU训练的话,估计需要几块高端GPU 一周时间训练,主要受限于内存的使用。我们的训练采用 asynchronous stochastic gradient descent,momentum 0.9,学习率递减(每迭代8次,学习率降低 4%)在最后的 inference 模型中用了文献【13】的Polyak averaging。

关于图像采样策略,我们的方法一直的变化,尝试了各种策略。这里不好给出一个定论。但是下面的做法是可行的:采样各种大小的图像块,从原图的 8% 到 100%,长宽比从 3/4 到 4/3 中间随机取值。 采用 文献【8】中的光照变形是有助于防止过拟合的。此外我们的插值方法是等概率随机的(双线性插值,最近邻域插值,立方插值)。

7 ILSVRC 2014 Classification Challenge Setup and Results

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 网络模型 Inception V2/V3-Rethinking the Inception Architecture for

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    用户1148525
  • 空间映射网络--Spatial Transformer Networks

    Spatial Transformer Networks 主要对目标在特征空间做不变性归一化 解决 角度、尺度等变形引入的影响 Code: http...

    用户1148525
  • 二值人脸对齐--Binarized Convolutional Landmark Localizers for Human Pose Estimation and Face Alignment

    Binarized Convolutional Landmark Localizers for Human Pose Estimation and Face A...

    用户1148525
  • 论文复现:谷歌实时端到端双目系统深度学习网络stereonet

    双目匹配可以得到环境中的三维深度信息,进而为机器人,无人车,VR等现实场景下的应用提供有力信息,在对安全验证比较高的人脸支付领域,三维人脸验证也正在逐渐取代安全...

    SIGAI学习与实践平台
  • ELK学习笔记之配置logstash消费kafka多个topic并分别生成索引

    Jetpropelledsnake21
  • @程序员,请掌握这些核心生存技能

    以上是一个读者流年似水的提问。我把他的问题置顶了,但一直没想好怎么回答,因为问题太过笼统了。后来,他也可能意识到了这一点,就又给我发了一条微信:

    沉默王二
  • 为什么国内程序员很少进行代码重构?

    说到代码的重构对于国外的程序员提到的比较多,特别是大型的开源工程,基本上一个模块或者函数的实现会反复的修改,一个文件能被修改成千上万次,曾经订阅了linux内核...

    程序员互动联盟
  • 【进阶篇】安装与编译C-API预测库

    编写|PaddlePaddle 排版|wangp 1 概述 使用 C-API 进行预测依赖于将 PaddlePaddle 核心代码编译成链接库,只需在编译时...

    用户1386409
  • 一波三折:DBA需要头脑冷清思路清晰解决故障以幸存

    杨廷琨(yangtingkun) 云和恩墨 CTO 高级咨询顾问,Oracle ACE总监,ITPUB Oracle数据库管理版版主 这是一则生产环境的真实维护...

    数据和云
  • springBoot 优雅的创建定时任务

    好几天没写了,工作有点忙,最近工作刚好做一个定时任务统计的,所以就将springboot 如何创建定时任务整理了一下。总的来说,springboot创建定时任务...

    程序员爱酸奶

扫码关注云+社区

领取腾讯云代金券