[重读经典论文]GoogLeNet——Inception模块的诞生
1. 前言
GoogLeNet,也被称为Inception V1网络,由Google公司的研究员在2014年的论文《Going deeper with convolutions》提出。
本论文提出了Inception模块,引入并行结构和不同尺寸的卷积核,提取不同尺度的特征,将稀疏矩阵聚合为较为密集的子矩阵,大大提高计算效率,降低参数数量。加入辅助分类器,实现了模型整合、反向传播信号放大。
此外,GoogLeNet还使用了一种称为“全局平均池化”的技术来替代全连接层,从而进一步减少了网络的参数数量。这种池化技术将特征图转换为单个数值,以便作为分类器的输入。
GoogLeNet在ILSVRC-2014图像分类竞赛中获得了top-5误差6.7%的冠军成绩,成功证明了深度学习中Inception模块的有效性,并为后续深度学习研究提供了启示。
Inception技术演进:
V1(GoogLeNet)-> BN-Inception –> V2 –> V3 –> V4 –> Inception-ResNet –> Xception
2. Inception的思想
如果对Google的深度学习研究有了解的,都会知道google有个“优良传统”:即使深度学习是个黑盒,但是他们总能够为他们的模型,找到理论支持,如MobileNet系统,他们非常讲究“intuition”,而这篇论文的直觉则来赫布理论(Hebbian principle)和多尺度信息处理。
赫布理论是一个神经科学理论,解释了在学习的过程中脑中的神经元所发生的变化,它描述了突触可塑性的基本原理,即突触前神经元向突触后神经元的持续重复的刺激,可以导致突触传递效能的增加。赫布理论阐明了细胞集群(Cell Assemblies)的形态和功能:“两个神经元或者神经元系统,如果总是同时被激发,就会形成一种‘组合’,其中一个神经元的激发会促进另一个的激发。
精确表达就是,如果两个神经元常常同时产生动作电位,或者说同时激动(fire),这两个神经元之间的连接就会变强,反之则变弱(neurons that fire together, wire together)
回到深度学习,要提高模型性能,一般有两种方法:
- 增加网络深度(层数)。
- 增加宽度(卷积核个数)。
一般这两种方法在大数据集上面,可以比较容易且安全的训练出一个有效的模型,但是同时会带来两个问题:
- 一是参数越多,越容易过拟合,而且对小数据集和获取标注成本大的数据集不适用;
- 二是计算效率问题,一般两个相连的卷积层,两层同步增加卷积核个数,计算量将平方增加,而且参数多了之后,很多权重训练后可能接近0(意思是概率增加),那么这部分计算也是给浪费了。
但是在现实中,我们用到的设备都是有限制的,不可能不考虑计算效率,不计成本追求精度,那解决办法是什么呢?
——使用稀疏连接取代密集连接。
但是,问题又来了,当前的计算单元,无论是CPU还是GPU,都不擅长稀疏运算,能否在仍旧利用现有硬件进行密集矩阵运算的条件下,改进模型结构,哪怕只在卷积层水平改进,从而能够利用额外的稀疏性呢?
答案就是Inception——多路卷积,然后堆叠,用密集模块去近似出局部最优稀疏结构。
(恭喜google研究员终于为他们的黑盒找到理论支撑)
3. Inception模块
如上图所示,Inception模块,实际上就是对输入,分别使用不同的卷积核进行卷积,将得到的特征图在通道的方向上堆叠起来。
对于上图做出几点解释:
- 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
- 之所以卷积核大小采用1、3和5,主要是为了方便对齐;
- 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了;
- 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。
但是,这个结构也是有问题的,计算量太多了,于是借鉴了NIN,使用1*1卷积进行了降维,大大降低了计算量,如下图所示:
原生的Inception模块,在第一层的计算量是854M Ops。
改进版的Inception模块,则只需要358M Ops的计算量,是原来的一半不够,但是效果是相似的。
1*1卷积在这里主要有几个作用:
- 降维
- 减少参数量和运算量
- 增加模型深度,提高非线性表达能力(因为卷积后要经过ReLU激活函数)
4. 网络
如上图所示,实际上整个网络基本上就是inception模块的堆叠,值得提的有几点:
- 先用普通卷积层,后面再用Inception模块堆叠;
- 网络最后采用了全局平均池化(global average pooling)来代替全连接层,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune;
- 使用了dropout,失活概率是70%(估计是作用在最后的全连接层)
- 在4a和4d模块后面增加辅助分类层,训练时都乘以0.3的系数加到最后的损失函数中,推断的时候去掉这两个辅助层(这两个辅助分类器后面被证实没什么用,V2V3都不用了)
关于全局平均池化,在NIN中,其实原始目的是为每个类别分配一个特征图,将特征图所有像素值相加求平均,得到一个数值,即用该数值表示对应特征图,作为后续softmax层的输入,达到减少参数量的目的。
然而这样其实也为后面的人迁移学习制造了不便,因为每个类别对应一个feature map,如果个人需要训练的类别数变了,最后一个卷积层的输出也需要相应改变,也就是无法像传统那样,只改变全连接层然后微调一下就可以迁移学习,因此这里作者只是在最后一个Inception模块的输出使用GAP,然后在接一个全连接层,方便后面的人进行迁移学习。
5. 其他
最后google的团队训练了7个模型,每张图片通过各种图片增强的奇技淫巧增加到144张,然后让每个模型都检测这144张图片后,得出的结果再集成,最后获得了ILSVRC-2014冠军。不过更值得关注的是,Inception系列的参数少,精度高,计算效率高,使得在边缘设备上也可以使用。以下是2017年做的统计,左边的是各个网络的top1准确率,右边的是计算量及准确率的模型,可以看到inception系列真的是计算量少准确率又高。
6. 参考
[2] Inception网络模型
[3] Global Average Pooling全局平均池化的一点理解
[4] 【精读AI论文】GoogLeNet(Inception V1)深度学习图像分类算法
(完)