03 Going Deeper With Convolutions
深度学习的发展,不仅仅在于算力的提升和数据集的扩大,更在于新的结构的设计和提出
现在的一个问题是,仅仅在现有的架构上增加层数的话,其实对于硬件的要求很高,要求高内存高算力,其实是不利于落地应用的。所以这篇文章不仅仅是关注性能的提升,还会同时兼顾模型的运算量,这样才能更好地让模型被实际应用
怎么获得更好的训练效果?一种是增加层数,但是增加层数带来的副作用很多(overfit,梯度消失)。inception的提升思路是,高效利用计算资源,在相同的计算量下提取到更多特征,从而提升训练效果
Related Works
LeNet5 and its variants
for large dataset: increase number of layers and size of layers, adopt dropout
a series of fifixed Gabor fifilters of different sizesin order to handle multiple scales, similarly to the Inception model
network in network
Motivations
仅扩大网络规模(depth&size):参数增多容易过拟合,计算量巨大
怎么解决?从dense连接转换成稀疏连接
CNN其实在空间上就已经是稀疏连接了,但问题是现有的硬件大多针对于密集矩阵的运算进行优化,也就是说,即使使用了稀疏连接,稀疏矩阵的计算时间也并不比密集矩阵小多少。
有没有办法改善?:将稀疏矩阵聚类为相对密集的矩阵
Arora:对于大规模稀疏的神经网络,可以通过分析激活值的统计特性和对高度相关的输出进行聚类来逐层构建出一个最优网络。这点表明臃肿的稀疏网络可能被不失性能地简化。
Hebbian Principle
Hebbian principle 的精确表达就是,如果两个神经元常常同时产生动作电位,或者说同时激活(fire),这两个神经元之间的连接就会变强,反之则变弱(neurons that fire together, wire together)。
对应到神经网络的 filter bank,就是将强化具有相似特征的 filter之间的关联。具体做法就是,用更少的 filter 来提取相关的特征,但是通过多个尺度的 filter bank 进行不相关的特征组。实际上就是预先把相关性强的特征汇聚,就能起到加速收敛的作用。
用在inception结构中就是要把相关性强的特征汇聚到一起。把1x1,3x3,5x5的特征分开。因为训练收敛的最终目的就是要提取出独立的特征,所以预先把相关性强的特征汇聚,就能起到加速收敛的作用。
Inception
采用不同大小的卷积核意味着不同大小的感受野,最后拼接就是不同尺度特征的融合。在多个尺度上同时进行卷积,能提取到不同尺度的特征,然后特征更丰富的话也意味着最后分类判断时更加准确
naive version就是1*1,3*3,5*5和maxpooling,但是卷积核变大之后,运算量就会显著增加,所以说在3*3,5*5之后加上了1*1来进行降维
一般来说,越到网络的深处,特征就会越抽象,感受野也会越大,所以3*3,5*5卷积核的占比应该会大一些
这怎么就将稀疏矩阵聚类为较为密集的子矩阵了呢?(看后面)
通过构建密集的块结构来近似最优的稀疏结构,从而达到提高性能而又不大量增加计算量的目的
GoogLeNet
网络最后采用了average pooling来代替全连接层,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后finetune
网络这么深,怎么避免梯度的消失?增加两个softmax层。 During training, their loss gets added to the total loss of the network with a discount weight (the losses of the auxiliary classififiers were weighted by 0.3). At inference time, these auxiliary networks are discarded.(2个辅助分类器,但之后的一些实验证明一个也就够了)
训练策略:对图片进行8%-100%均匀分布大小采样,长宽比也限制在区间,使用这些crop进行训练
2014 classification
用了7个一样的googlenet(初始化、学习率衰减什么的都一样),只是在采样方式和图片的随机顺序上不一样。把他们的结果集成起来
对图片的采样:4*3*6*2
在multi-crop和分类器上的softmax的预测结果直接进行平均
几个问题:
1,为什么Inception块就可以达到目的呢?即,为什么Inception块可以使得更稀疏的矩阵聚类为较密集的子矩阵了呢?怎么就相对节省算力了呢?
利用稀疏矩阵分解成密集矩阵计算的原理来加快收敛速度。举个例子稀疏矩阵(很多元素都为0,不均匀分布在矩阵中),和一个2x2的矩阵进行卷积,需要对稀疏矩阵中的每一个元素进行计算;如果把稀疏矩阵分解成2个子密集矩阵,再和2x2矩阵进行卷积,稀疏矩阵中0较多的区域就可以不用计算,计算量就大大降低。
这个原理应用到inception上就是要在特征维度上进行分解!传统的卷积层的输入数据只和一种尺度(比如3x3)的卷积核进行卷积,输出固定维度(比如256个特征)的数据,所有256个输出特征基本上是均匀分布在3x3尺度范围上,这可以理解成输出了一个稀疏分布的特征集;而inception模块在多个尺度上提取特征(比如1x1,3x3,5x5),输出的256个特征就不再是均匀分布,而是相关性强的特征聚集在一起(比如1x1的的96个特征聚集在一起,3x3的96个特征聚集在一起,5x5的64个特征聚集在一起),这可以理解成多个密集分布的子特征集。这样的特征集中因为相关性较强的特征聚集在了一起,不相关的非关键特征就被弱化,同样是输出256个特征,inception方法输出的特征“冗余”的信息较少。用这样的“纯”的特征集层层传递最后作为反向计算的输入,自然收敛的速度更快。
2,它的深度是比较深的,是怎么防止梯度消失的?