[深度概念]·华山论剑-卷积神经网络发展史
经典网络
经典网络包括 LeNet、AlexNet 以及 VGG 等。
LeNet:1998,Gradient based learning applied to document recognition
用于手写数字识别,可以看到,卷积神经网络的基本框架已经有了,卷积、激活、池化和全连接,这几个基本组件都完备了。
但是,在 1998 年以后,深度学习并没有太多的突破。一直沉寂到 2012 年,AlexNet 横空出世,将深度学习重新带入大家视线,并开启了深度学习的黄金时代。
为什么是 2012 年?一是数据,之前并没有大规模的数据进行充分的训练,应用于更广泛的任务,现在有 ImageNet;二是计算,之前的硬件条件限制了,无法进行大规模的训练,而现在有了性能强大的 GPU 的加成;三就是 AlexNet 本身很优秀,给后来的网络奠定了一个很好的基础,让大家突然发现,原来还可以这样玩!
AlexNet:2012,ImageNet Classification with Deep Convolutional Neural Networks
ImageNet Top5 错误率:16.4%,而两年前非深度学习的方法的最好错误率是28.2%
AlexNet 总体结构和 LeNet 相似,但是有极大改进:
由五层卷积和三层全连接组成,输入图像为三通道 224x224 大小,网络规模远大于 LeNet使用了 ReLU 激活函数使用了 Dropout,可以作为正则项防止过拟合,提升模型鲁棒性一些很好的训练技巧,包括数据增广、学习率策略、weight decay 等
AlexNet 使用 3GB 显存的 GTX 580 显卡(好古老),一块显卡不够用,所以如上图所示将模型分为两部分放到了两块显卡上并行运算。虽然这仅仅是单块显卡资源有限时的做法,但是后面的许多网络都进一步发扬了这种对卷积进行分组的思想(虽然动机不同)。
VGG:2014,Very deep convolutional networks for large-scale image recognition
在 AlexNet 之后,另一个提升很大的网络是 VGG,ImageNet 上 Top5 错误率减小到 7.3%。
主要改进就是:深,更深!网络层数由 AlexNet 的 8 层增至 16 和 19 层,更深的网络意味着更强大的网络能力,也意味着需要更强大的计算力,还好,硬件发展也很快,显卡运算力也在快速增长,助推深度学习的快速发展。
同时只使用 3x3 的卷积核,因为两个 3x3 的感受野相当于一个 5x5,同时参数量更少,之后的网络都基本遵循这个范式。
GoogLeNet 和 ResNet
一层一层卷积堆叠,VGG 是集大成者,但是之后很难再进一步,继续简单增加网络层数会遇到问题,更深的网络更难训练同时参数量也在不断增长。
Inception v1(GoogLeNet):2015,Going deeper with convolutions
ImageNet Top5 错误率 6.7%
GoogLeNet 则从另一个维度来增加网络能力,每单元有许多层并行计算,让网络更宽了,基本单元如下:
网络总体结构如下所示,包含多个上面的 Inception 模块,并添加了两个辅助分类分支补充梯度更好训练:
通过网络的水平排布,可以用较浅的网络得到很好的模型能力,并进行多特征融合,同时更容易训练,另外,为了减少计算量,使用了 1x1 卷积来先对特征通道进行降维。堆叠 Inception 模块而来就叫 Inception 网络,而 GoogLeNet 就是一个精心设计的性能良好的 Inception 网络(Inception v1)的实例,即GoogLeNet 是 Inception v1 网络的一种。
但是,网络太深无法很好训练的问题还是没有解决,直到 ResNet 提出了 residual connection。
ResNet:2016,Deep residual learning for image recognition
ImageNet Top5 错误率 3.57%
ResNet 通过引入 shortcut 直连来解决这个问题:
通过引入直连,原来需要学习完全的重构映射,从头创建输出,并不容易,而引入直连之后,只需要学习输出和原来输入的差值即可,绝对量变相对量,容易很多,所以叫残差网络。并且,通过引入残差,identity 恒等映射,相当于一个梯度高速通道,可以容易地训练避免梯度消失的问题,所以可以得到很深的网络,网络层数由 GoogLeNet 的 22 层到了ResNet的 152 层。
ResNet-34 的网络结构如下所示:
如果说 LeNet、AlexNet、VGG 奠定了经典神经网络的基础,Inception 和ResNet 则展示了神经网络的新范式,在这两个范式的基础上,发展创新并相互借鉴,有了 Inception 流派的 Inception v2 到 v4、Inception-ResNet v1 和 v2,以及 ResNet 流派的 ResNeXt、DenseNet 和 Xception等。
Inception 流派
Inception 流派,核心就是 Inception 模块,出现了各种变种,包括 Inception v2 到 v4 以及 Inception-ResNet v1 和 v2 等。
Inception v2(BN-Inception):2015,Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
ImageNet Top5 错误率:4.8%
(PS:按照 Inception 系列四篇论文中的第三篇论文的划分,类似于 Inception v3 的一个网络称之为 v2,但是按照第四篇论文的划分,BN-Inception 称之为v2,这里采用第四篇论文的划分,Inception v2 指 BN-Inception)
主要是增加了 Batch Normalization,之前神经网络很依赖于良好的初始化,并且网络太深会梯度弥散,这两个问题都是因为网络中间的激活的分布不理想,那既然我们想要一个理想的分布,就手动把它转换为理想的分布好了。所以在每一层输出后面加上了归一化变换,减去每个训练 batch 的每个特征的均值再除以标准差,得到 0 均值 1 标准差的输出分布,这样,就可以很好地训练了,梯度也不容易弥散。
Inception v3:2015,Rethinking the Inception Architecture for Computer Vision
ImageNet Top5 错误率:3.5%
卷积进一步分解,5x5 用两个 3x3 卷积替换,7x7 用三个 3x3 卷积替换,一个 3x3 卷积核可以进一步用 1x3 的卷积核和 3x1 的卷积核组合来替换,进一步减少计算量:
总体地网络结构如下所示:
Inception v4、Inception-ResNet v1 和 v2:2016,Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
ImageNet Top5 错误率:3.08%
Inception v1 到 v3,可以看到很明显的人工设计的痕迹,不同卷积核的和网络结构的安排,很特殊,并不知道为什么要这样安排,实验确定的。作者称由于以前受硬件软件的限制,有太多的历史包袱,而现在有了 TensorFlow(论文里怒打一波广告),网络可以按照理想的设计来实现了,于是很规范地设计了一个 Inception v4 网络,类似于 Inception v3,但是没有很多特殊的不一致的设计。
同时,ResNet 的成功,也说明了 residual connection 的有效性,所以为Inception 模块引入了 residual connection,得到 Inception-ResNet v1 和Inception-ResNet-v2,前者规模较小,和 Inception v3 相当,后者规模较大,和 Inception v4 规模相当。residual 结构地 Inception 模块如下所示:
ResNet 流派
ResNet 流派是另一个主流分支,包括 WRN、DenseNet、ResNeXt 以及 Xception 等。
DenseNet:2016,Densely Connected Convolutional Networks
DenseNet 将 residual connection 发挥到极致,每一层输出都直连到后面的所有层,可以更好地复用特征,每一层都比较浅,融合了来自前面所有层的所有特征,并且很容易训练。缺点是显存占用更大并且反向传播计算更复杂一点。网络结构如下所示:
ResNeXt:2017,Aggregated Residual Transformations for Deep Neural Networks
ImageNet Top5 错误率:3.03%
Inception 借鉴 ResNet 得到 Inception-ResNet,而 ResNet 借鉴 Inception 得到了 ResNeXt,对于每一个 ResNet 的每一个基本单元,横向扩展,将输入分为几组,使用相同的变换,进行卷积:
上面左边是 ResNet,右边是 ResNeXt,通过在通道上对输入进行拆分,进行分组卷积,每个卷积核不用扩展到所有通道,可以得到更多更轻量的卷积核,并且,卷积核之间减少了耦合,用相同的计算量,可以得到更高的精度。
Xception:2016,Xception: Deep Learning with Depthwise Separable Convolutions
Xception 则把分组卷积的思想发挥到了极致,每一个通道单独分为一组。利用了 depthwise separable convolution,如下图所示,J 个输入通道,每个通道用一个单独的空间卷积核卷积(比如 3x3),J 个卷积核得到 J 个输出通道,然后再用 K 个卷积核对上一步得到的 J 个输出通道进行 1x1 的普通卷积,得到 K 个最终的输出:
Xception 基于一个假设,水平和竖直方向的空间卷积(比如第一步的 3x3 卷积)和深度方向的通道卷积(比如第二步的 1x1 卷积)可以完全独立进行,这样减少了不同操作间的耦合,可以有效利用计算力。实验证明,相同的计算量,精度有明显的提升。(不过现在对于分组卷积的底层支持还不够好,实际速度并没有理论计算的那么好,需要底层库进行更好的支持)
移动端
除了主流的 ResNet 流派和 Inception 流派不断追求更高的准确率,移动端的应用也是一大方向,比如 SqueezeNet、MobileNet v1 和 v2、ShuffleNet 等。
MobileNet v1:2017,MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
和 Xception 类似,通过 depthwise separable convolution 来减少计算量,设计了一个适用于移动端的,取得性能和效率间很好平衡的一个网络。
MobileNet v2:2018,Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation
使用了 ReLU6(即对 ReLU 输出的结果进行 Clip,使得输出的最大值为 6)适配移动设备更好量化,然后提出了一种新的 Inverted Residuals and Linear Bottleneck,即 ResNet 基本结构中间使用了 depthwise 卷积,一个通道一个卷积核,减少计算量,中间的通道数比两头还多(ResNet 像漏斗,MobileNet v2 像柳叶),并且全去掉了最后输出的 ReLU。具体的基本结构如下图右侧所示:
ShuffleNet:2017,ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
Xception 已经做得很好了,但是 1x1 那里太耗时间了成了计算的瓶颈,那就分组啦较少计算量,但是分组了,组和组之间信息隔离了,那就重排 shuffle 一下,强行让信息流动。具体的网络结构如上图左侧所示。channel shuffle 就是对通道进行重排,将每组卷积的输出分配到下一次卷积的不同的组去:
上图的 a 是没有 shuffle,效果很差,b 和 c 则是等价的有 shuffle 的。ShuffleNet 可以达到和 AlexNet 相同的精度,并且实际速度快 13 倍(理论上快 18 倍)。
SENet
除了上面介绍的久经考验的网络以外,还有各种各样的新的网络,比如 NASNet、SENet、MSDNet 等等。其中,SENet 的 Squeeze-Excitation 模块在普通的卷积(单层卷积或复合卷积)由输入 X 得到输出 U 以后,对 U 的每个通道进行全局平均池化得到通道描述子(Squeeze),再利用两层 FC 得到每个通道的权重值,对 U 按通道进行重新加权得到最终输出(Excitation),这个过程称之为 feature recalibration,通过引入 attention 重新加权,可以得到抑制无效特征,提升有效特征的权重,并很容易地和现有网络结合,提升现有网络性能,而计算量不会增加太多。
SE module 是一个很通用的模块,可以很好地和现有网络集成,提升现有效果。
总结
最后,一个 ImageNet 上的 Top5 准确率总结表如下图,可以看到,ImageNet 上的分类错误率逐年降低,并且已经低于人类的错误率(5.1%)。
有这么多网络,具体的使用中到底选哪个呢?个人的使用参考建议是:
普通网络:推荐 ResNet-50 或 Xception 或 Inception v3
大网络高精度:推荐 ResNeXt-101(64x4d)或 Inception-ResNet v2
移动端小网络:推荐 ShuffleNet 或 MobileNet v2
还可以额外添加 SENet 模块到现有网络,基本都能进一步提高精度,计算量略有增加。另外也可以尝试一下 NASNet。