今天迎来了我家两公子周岁生日,在这美好的日子里我用“美”为主题分享一下目前非常火非常火的CNN卷积神经网络。
深度学习是近几年迅速发展起来的学科,其在物体识别、检测、跟踪等任务中获得了突破性进展。卷积神经网络(Convolutional Neural Network,CNN)是深度学习中最为重要的分支之一,被大量用于检测、分割、物体识别以及图像的各个领域。
本文先回顾最近几年各种经典的CNN卷积神经网络架构,来领略一下各路大神高超的智慧,聊一聊这些架构有哪些优缺点,从中提炼出一些想法来设计最强最美的卷积神经网络架构。
在数学中我认为最美的符号是:
在数学中我认为最美的公式是:
这时候我想问自己一个问题,那在深度学习, 计算机视觉中,最美的卷积神经网络是什么?
为了不让本文的遍幅过长,本节
只聊重点, 只聊重点
,各经典架构的详细介绍就烦请读者自行查阅。
上图是ILSVRC历年的Top-5错误率,我们就按照上图中经典架构出现的时间顺序对他们进行简单的总结。
LeNet是卷积神经网络的祖师爷LeCun在1998年提出,用于解决手写数字识别的视觉任务。自从那时起,CNN的最基本的架构就定下来了:卷积层、池化层、全连接层。
AlexNet在2012年ImageNet竞赛中以超过第二名10.9个百分点的绝对优势一举夺冠,从此深度学习和卷积神经网络名声鹊起,深度学习的研究如雨后春笋般出现,AlexNet的出现可谓是卷积神经网络的王者归来。
增强模型的泛化能力,避免过拟合,使用了随机裁剪的思路对原来256×256的图像进行随机裁剪。
ZFNet是2013年ImageNet分类任务的冠军,其网络结构没什么改进,只是调了参数,性能较AlexNet提升了不少。
将AlexNet第一层卷积核由11变成7,滑动步长由4变为2。
VGGNet是2014年ImageNet竞赛定位任务的第一名和分类任务的第二名中的基础网络。
上图为两个3X3的卷积核代替一个5X5大的卷积核,在降低参数的同时并建立了更多的非线性变换,使得网络对特征的学习能力更强。
VGGNet包含多个conv->conv->max pool这样的结构。
GoogLeNet在2014年的ImageNet分类任务上击败了VGGNet夺得冠军,它在加深网络的同时(22层),也在网络结构上做了创新,引入Inception结构代替了单纯的卷积+激活的传统操作。
该Inception结构中卷积核的滑动步长为1,通过3×3池化、以及1×1、3×3和5×5这三种不同尺度的卷积核,一共4种方式对输入做特征提取。
GoogLeNet网络结构中有3个loss单元,这样的网络设计是为了帮助网络的收敛,在中间层加入辅助计算的loss单元,目的是计算损失时让低层的特征也有很好的区分能力,从而让网络更好地被训练。
- 引入BN层,减少Internal Covariate Shift问题
Batch Normalization:批标准化,对每一个 mini-batch 数据进行标准化处理,使输出规范化到 N(0,1) 的正态分布,减少了
Internal Covariate Shift
(内部神经元分布改变)。
- 引用了VGGNet中使用多个小的卷积核代替大的卷积核的特性
- Factorization into small convolutions
将一个较大的二维卷积拆成两个较小的一维卷积,如下图所示:
上图为3X3卷积拆成1X3卷积和3X1卷积,也可以将7X7卷积拆成1X7卷积和7X1卷积。
Inception V4,Inception-ResNet-V1,Inception-ResNet-V2贡献点:
什么?这么多? 这些都是Inception结合了 ResNet 中的Residual Connection,或结合 ResNet 可以极大地加速训练,同时极大提升性能,是不是觉得Residual Connection, ResNet很强大,那我们就继续往下看神奇的ResNet吧。
2015年何恺明推出的ResNet在ISLVRC和COCO上横扫所有选手,获得冠军。
上图可以看出,数据经过了两条路线,一条是常规路线,另一条则是捷径(shortcut),直接实现单位映射的路线。
上图展示了两种形态的残差模块,左图是常规残差模块,有两个3×3卷积核组成,但是随着网络进一步加深,这种残差结构在实践中并不是十分有效。针对这问题,右图的“瓶颈残差模块”(bottleneck residual block)可以有更好的效果,它依次由1×1、3×3、1×1这三个卷积层堆积而成,这里的1×1的卷积能够起降维或升维的作用,3×3的卷积可以在相对较低维度的输入上进行,以降低参数从而达到提高计算效率的目的。
网络深度增加的一个问题在于这些增加的层是参数更新的信号,因为梯度是从后向前传播的,增加网络深度后,比较靠前的层梯度会很小。这意味着这些层基本上学习停滞了,这就是梯度消失问题。
深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,因此简单地去增加网络深度反而出现更高的训练误差,深层网络虽然收敛了,但网络却开始退化了,即增加网络层数却导致更大的误差。
DenseNet是一种具有密集连接的卷积神经网络。在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入。
这种Dense Connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深的网络不是问题。
由于每一层都包含之前所有层的输出信息,因此它不需要再重新学习多余的特征图,仅学习少量的几层特征图就可以了。
在上面回顾部分,对经典架构中的各种优点(贡献点)简单的做了说明,那这些架构是不是也有一些没有解决或没有考虑到的问题,下面我们简单的来聊一聊。
1.AlexNet
、
ZFNet
、
VGGNet
性能比GoogLeNet、ResNet、DenseNet要差一些,所以重点来聊GoogLeNet、ResNet、DenseNet。
我认为当时没有Residual Connection/Dense Connection这样神奇的设计,在网络深度很难增加时,就在网络宽度上做了创新(即引入了Inception结构),并设计各种规格来提高性能,导致网络过于复杂。
实验表明:丢掉某些层对网络没有影响,即存在没有作用的层。
ResNet50中Block数量分别是(3, 4, 6, 3)
ResNet101中Block数量分别是(3, 4, 23, 3)
问题1:手动配置很难是最好的,那是否有更优的方案?
实验表明:存在某些层没有全部利用输入的所有特征图。
问题1:Block与Block之间的特征图没有得到很好复用?
DenseNet121中Block数量分别是(6, 12, 24, 16)
DenseNet169中Block数量分别是(6, 12, 32, 32)
问题1:手动配置很难是最好的,那是否有更优的方案?
问题1:很明显,简单的任务几层的网络就可以做到,那是否有更优的方案?
问题2:某个场景只有一些简单的任务,但由于内存等原因不能加载这么复杂的网络,是否可以通过卸载该网络某些能力,就可以使用?
问题3:如果有更复杂的任务,该网络是否有通过扩展使它的能力更强?
从AlexNet到ZFNet到VGGNet、GoogLeNet再到ResNet和DenseNet,网络越来越深、越来越宽、越来越复杂、性能也越来越高、解决反向传播时梯度消失的方法也越来越巧妙,但如果让我们来设计强大的网络我们会采用什么样的方法呢?当然最快最好的方法就是把各路大神的成果直接拿来使用:
- 数据增广
- BN
- ReLU
- 全连接层替换为简单的全局平均pooling
- 引入Residual Connection
- 引入Dense Connection
- 引入Inception相似结构
这里不完全采用GoogLeNet中的Inception结构,而是做了简化,如今网络在深度方面已不是问题,再加上已通过大量实验表明,多个小的卷积替换大的卷积是可行的,并且多个小的卷积增加了更多的非线性变换,使得网络对特征的学习能力更强,因此我认为网络在深度/宽度上堆叠如下简单结构可以达到各种神奇的效果:
想降低参数或想升维/降维就可以在前面增加一个Conv 1X1如下图所示:
现已经在网络深度、网络宽度都得到很好的解决,想一想还缺什么?
SmartNet是什么?是一个新的网络架构,从网络深度、网络宽度、网络广度等方面来提高网络的性能,并来解决上面所提到的问题。
- 该架构怎么看上去很像DenseNet,但又多了许多连接?
对,很像DenseNet,其实图中的Smart Block就跟Dense Block几乎差不多,只是把Connection连接也引用到Block与Block之间,使得特征图最大化复用。同时把Dense Connection改名为Smart Connection,把Dense Block改名为Smart Block。
- 为什么把Dense Connection改名为Smart Connection?
这里利用Smart Connection连接,来解决(“没有利用上的特征图带来的计算是浪费的?”)的问题,即通过Smart Connection连接表示没有利用上的特征图不参与计算,细心的读者可能已看到了箭头线是虚线。
- 该架构中只看到第一层与后面的层有Smart Connection连接?
其实每一个Smart Block的输入与前面所有的Smart Block的输出都有Smart Connection连接,图中只是省略了,画太多连线就不好看了(给自己找一个借口,其实就是画不好嘛!)。
- 为什么把Dense Block改名为Smart Block?
- 架构中还有许多方向路标?DenseNet只有一个前进方向,SmartNet怎么有两个方向?
嗯,细心的读者可能已发现,图中上面的行所画的特征图比下面的行所画的特征图多,即想表达的意思让该网格在图中向右方向,表示的是网络的深度越来越深,性能也越来越高,在图中向下方向,表示的是只要能达到目标就找最近的出口出来,如下图所示:
这也是本文所指的网络广度(网络需要自己学习根据任务的难易程度自动选择最优的路径)。
举例子可能更容易理解,架构图中第一行Smart Block学习4个特征图(这里4是虚似值,实际可能是8,16,32,64,128等),下面我们假设Smart Block学习的特征图数写在特征图右上角,并假设这个值为每个Smart Block运行时间单位数(可以这样理解,学习1个特征图需要1个时间单位,学习8个特征图就需要8个时间单位),如下图所示:
嗯,FPN就是近些年其中一种特别火也特别有用的特征金字塔网络,但与这个特征图上三角矩阵可不是同一个东西。该特征图上三角矩阵是统一存储(网络学习出来的)特征图的地方并共享给后面所有Block来使用。
网络需要自己学习选择最优的路径。(这个可以考虑使用Condition GAN来训练生成一些隐信息来控制或使用强化学习)。
为了更加智能,Block中的层数最强的网络应该是自己学习得到的,这也就是为什么把Dense Block改名为Smart Block的原因。
可以采用不同大小的pooling或采用Fast/Faster RCNN中的ROI Pooling对不同大小的特征图映射到固定的大小。
这个同DenseNet一样,由于每一层都包含之前所有层的输出信息,因此它不需要再重新学习多余的特征图,仅学习少量的几层特征图就可以了。
即input4>input3>input2>input1。
该网络符合我们从小都懂的一个增减衣服最简易操作原则,即天热时,减去最外层的衣服,天冷时,在最外层基础上增加一层衣服。
这样的网络优势很多,网络可以按出口存储,按出口加载。
对于一般的任务,只加载前几个出口相关的参数即可,甚至以后网络还有类似GC功能(垃圾回收器),动态加载与回收出口相关的参数来提高运行效率。
题外话:众所都知目前的人工神经网络只学习W与b参数,可能还存在另外的参数需要学习,来使得我们的网络更强。
为了我们的人工智能更加智能,最强的网络应该是在我们给定的目标下(如:内存、计算时间、正确率等),网络会自动初化化如上面所说的特征图上三角矩阵大小,甚至通过学习来调整特征图上三角矩阵的大小,并学习选择最优的路径。这个时候我们好像只需要给定几个超参数,其余的一切网络都会自己学习到。
有了这样的网络我们是不是不用关心AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet、SmartNet、甚至是已在路上的XXXNet或未来的YYYNet,只需要关心的是我们使用CNN卷积神经网络就可以了。
多管齐下、化繁为简、岂不美哉!!!
我认为最美的卷积神经网络是:
在CNN中我认为最美的卷积是:
以上网络还有很多问题值得去思考,这里只是抛出想法,本人在这方面资历尚浅,可能有许多不准确或不正确的地方,欢迎指正及提出您们宝贵的意见与建议。
我知乎上连接 https://zhuanlan.zhihu.com/p/39120334