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

最近简单看一些深度学习经典论文,面对随时可能遇到的关于机器学习方面的问题。

这周从图像分类常见的模型结构开始总结一下。

模块化

深度学习流行起来之后,人们最开始关注的主要是硬件性能,数据及大小,以及模型深度。后来开始转为新的网络结构,新的算法,以及不同的网络模块。

GoogLeNet

GoogLeNet设计了一种比较特别的模块,他并不是直接增加网络深度或者宽度,也不是增加不同功能的layer。而是提出一种尽量模拟生物神经网络连接的稀疏性,而又利用密集矩阵进行高性能计算的模块,论文起名叫Inception Module。

Inception Module如下图:

上图中有3种不同大小的卷积核,可以感受不同大小的视野。这些卷积核通过设定不同的pad得到相同大小的输出,这样输出特征就可以直接拼接到一起。随着网络越深,得到的特征越抽象,输出的特征层数就会增加,3x3和5x5的卷积层比例也要增加。

由于5x5的卷积计算机量比较大,文章中借用了bottleneck layer对层数进行降维,减少计算量。这一技术在后面的几篇论文中都有出现。

GoogLeNet除了采用Inception Module之外,在不同的输出层引入了softmax来帮助梯度向前传导。模型的loss是最后层分类loss加上额外的softmax分类loss乘以一个衰减系数,模型结构如下图所示:

再体会到模块化带来的效果提升后,Google还推出了GoogLeNet v2/v3,试图最大化inception module带来的准确率提升以及速度提升。

在速度方面,我们可以通过两层3x3的卷积替代一层5x5的卷积,另外用1x3的卷积和3x1的卷积替代3x3的卷积。虽然会担心参数减少,预测准确率降低,但是多次试验效果证明这样的优化对准确度没有太大影响。

普通的网络在进行压缩或pooling时,会丢失很多特征。我们可以采用1x1的卷积将特征数加倍,然后在进行一次pooling,但这样计算效率比较地下。于是作者提出了并行计算1x1卷积和pooling,最后合并结果减少特征损失。

最后作者还对原文提出的不同层的softmax分类器进行了反思,通过引入BatchNorm来减少额外的softmax分类器。

深度化

在图像识别领域,神经网络的第一个设计趋势是越来越深。多层的神经网络可以帮助学习不同层次的抽象知识。比如用一个深度的CNN进行图像分类,你会发现第一层常常学出非常基本的内容,比如边缘;下一层学出边缘的集合,比如形状;在下一层学出更高阶的特征。

Residual Network

在深度网络变得越来越深的情况下,研究员发现的第一个问题就是退化现象,网络越深,对计算资源的要求就越高,并且当深度达到一定程度后,增加网络层数不但没有准确性上的提升,反而出现了退化。

解决或降低退化现象的第一款神器就是ResNet。ResNet引入了残差网络结构(Residual Network),其基本结构如下图所示:

与普通的深度神经网络相比,残差网络在输入和输出之间引入了一个shortcut connection,这个shortcut通常是一个很简单的设计,比方说identity mapping,他不但没有增加网络参数,还解决了网络梯度消失问题。

再具体实现过程中,作者基本没有采用pooling layer,而是调整convolution layer的stride size来缩减输入大小,提高传播效率;另外作者并没有使用dropout layer,而是采用batch norm和最后一层的average pooling来进行正则化,加快训练速度。

ResNet的论文很良心的对比了不同的实现细节,给工业界的朋友优化模型提供了很多点子。

ResNet提供了三种添加shortcut的方法,直接做identity mapping,将前一层的特征和新的特征合并起来;既做identity mapping,又采用projection增加维度;直接采用projection链接不同层的网络。这里的projection指对输入向量通过一组权重进行线性变化。作者经过实验发现直接采用identity mapping是在时间复杂度和结果的tradeoff中最为优化的一种选择。

另外作者对比了普通的残差网络与引入bottleneck的残差网络的差别:

通过引入1x1的卷积进行降维,然后采用3x3的卷积提取特征,最后再使用1x1的卷积回复维度,使得模型参数大幅度降低,并且提升了训练速度。

Dense Network

Residual Network提出了采用shortcut方法来提升深度网络的训练效率,DenseNet则把Residual Network进一步扩展。

DenseNet有多个Dense Block组成,每一个Dense Block的结构图如下。在传统的深度卷积网络中,一个L层的网络会有L-1个连接连接两个不同的卷积层。DenseBlock则建立L(L+1)/2个连接,将每一层的输出和同一个DenseBlock内之前所有层的输出合并起来,如下图所示:

作者为ImageNet数据设计的DenseNet包含4个Dense Block,采用2x2 average pooling降低Block的维度并且更好地传递梯度。将growth rate设置成32,这样网络会比较窄并且高效。但是由于每一层的输入向量很多,在每一个3x3的卷积层前都加入了一个1x1的卷积层作为bottleneck layer,进行特征融合和降维。

重温数学表达,ResNet的第L层输出是L-1层的输出加上对L-1层输出的非线性变换,DenseNet的第L层则是之前所有输出的feature map做concatenation得出的结果:

这样的做法增加了特征的直接传递,有效地利用了特征,并且有效地减轻了梯度消失现象。因为通常Dense Block的网络growth rate都比较小,所以参数量并没有增加,这样的训练出的结果也比较不容易过拟合。

不过另一方面,网上和论文中都讨论了DenseNet的显卡内存消耗问题,在这里就不加赘述了。

轻量化

上面介绍的深度学习算法在图像分类,目标检测等领域表现出了非常优异的成绩,但是随着模型深度的增加,计算量,存储空间,以及能耗问题都越来越严重。

为了更好的在移动端,以及车载系统上运行神经网络,研究人员开始提出一系列轻量化深度神经网络模型,用bottleneck,1xN和Nx1的卷积核来优化神经网络的运行时间和复杂度,而不降低准确性。

Squeeze Network

SqueezeNet想从结构上优化神经网络,他们主要采取三个策略:用1x1的卷积替代3x3的卷积,减少3x3卷积的输入维度,并且尽可能的把downsample放到网络尾端。

为了达成这一目标,作者设计了一个Fire module,由三个子模块分为squeeze和expand两部分组成。Squeeze部分由1x1卷积组成,目的是压缩输入通道,expand由1x1卷积层和3x3卷积层组成,最后每个模块输入和输出通道数相同。

SqueezeNet的网络分为10层,第一层为卷积层,缩小图像并提取96维特征。第2层到第9层为fire模块,每个模块都先进行压缩,减少通道数。在每两个模块后,增加通道数。

为了提高准确率,作者将max pooling下沉到第1,4,8层,尽量减少前期的特征信息损失。在最后一层采用average pooling并且在维数相同的层之间加入快捷连接。

SqueezeNet论文目的比较明确,就是要在空间上优化网络。最后的实验分析也集中在选择不同的网络参数对网络存储空间和识别准确度的影响,在这里就不再赘述了。

Mobile Net

最后,让我再一次回到Google的网络优化方案MobileNet,这是Google团队在CVPR 2017发表的文章,顾名思义,网络名称明示他们是从移动应用场景去考虑而设计的。

该模型的主要创新来自采用depthwise separable convolution代替传统的卷积方式。传统的卷积方式将KxKxM的网络通过FxFxN的卷积进行处理时,需要进行KxKxMxDxFxF次计算。但实际上这一部分卷积可以通过depthwise convoltuion和pointwise convolution进行优化并且得到可比较的预测结果,这样就把计算次数优化为KxKxMxFxF+MxNxFxF。具体的网络结构可以见下图:

这样做计算量减少了多少呢?

在这里一般N都比较大,所以最后计算量减小相对于3x3的卷积约是8~9倍。

在文章中作者还提出了一些网络结构的优化以及采用宽度因子和分辨率因子来控制模型的空间消耗,时间复杂度等特性,在这里就业不赘述了。

欢迎关注硅谷程序汪

原创文章,版权所有。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180806G1UYOQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券