图像分类网络模块化,深度化,轻量化

最近简单看一些深度学习经典论文,面对随时可能遇到的关于机器学习方面的问题。 这周从图像分类常见的模型结构开始总结一下。 模块化 深度学习流行起来之后,人们最开始关注的主要是硬件性能,数据及大小,以及模型深度。后来开始转为新的网络结构,新的算法,以及不同的网络模块。 GoogLeNet GoogLeNet设计了一种比较特别的模块,他并不是直接增加网络深度或者宽度,也不是增加不同功能的layer。而是提出一种尽量模拟生物神经网络连接的稀疏性,而又利用密集矩阵进行高性能计算的模块,论文起名叫Inception Module。 Inception Module如下图: 上图中有3种不同大小的卷积核,可以感受不同大小的视野。这些卷积核通过设定不同的pad得到相同大小的输出,这样输出特征就可以直接拼接到一起。随着网络越深,得到的特征越抽象,输出的特征层数就会增加,3×3和5×5的卷积层比例也要增加。 由于5×5的卷积计算机量比较大,文章中借用了bottleneck layer对层数进行降维,减少计算量。这一技术在后面的几篇论文中都有出现。 GoogLeNet除了采用Inception Module之外,在不同的输出层引入了softmax来帮助梯度向前传导。模型的loss是最后层分类loss加上额外的softmax分类loss乘以一个衰减系数,模型结构如下图所示: 再体会到模块化带来的效果提升后,Google还推出了GoogLeNet v2/v3,试图最大化inception module带来的准确率提升以及速度提升。 在速度方面,我们可以通过两层3×3的卷积替代一层5×5的卷积,另外用1×3的卷积和3×1的卷积替代3×3的卷积。虽然会担心参数减少,预测准确率降低,但是多次试验效果证明这样的优化对准确度没有太大影响。 普通的网络在进行压缩或pooling时,会丢失很多特征。我们可以采用1×1的卷积将特征数加倍,然后在进行一次pooling,但这样计算效率比较地下。于是作者提出了并行计算1×1卷积和pooling,最后合并结果减少特征损失。 最后作者还对原文提出的不同层的softmax分类器进行了反思,通过引入BatchNorm来减少额外的softmax分类器。 深度化 在图像识别领域,神经网络的第一个设计趋势是越来越深。多层的神经网络可以帮助学习不同层次的抽象知识。比如用一个深度的CNN进行图像分类,你会发现第一层常常学出非常基本的内容,比如边缘;下一层学出边缘的集合,比如形状;在下一层学出更高阶的特征。 Residual Network 在深度网络变得越来越深的情况下,研究员发现的第一个问题就是退化现象,网络越深,对计算资源的要求就越高,并且当深度达到一定程度后,增加网络层数不但没有准确性上的提升,反而出现了退化。

Read more