架构之美-最强卷积神经网络架构设计初想

今天迎来了我家两公子周岁生日,在这美好的日子里我用“美”为主题分享一下目前非常火非常火的CNN卷积神经网络。


本文目录
最美的是什么?
经典架构回顾
聊一聊这些架构有哪些优缺点
架构设计思考
什么是最美的卷积神经网络?

深度学习是近几年迅速发展起来的学科,其在物体识别、检测、跟踪等任务中获得了突破性进展。卷积神经网络(Convolutional Neural Network,CNN)是深度学习中最为重要的分支之一,被大量用于检测、分割、物体识别以及图像的各个领域。
本文先回顾最近几年各种经典的CNN卷积神经网络架构,来领略一下各路大神高超的智慧,聊一聊这些架构有哪些优缺点,从中提炼出一些想法来设计最强最美的卷积神经网络架构。

一、最美的是什么?

在数学中我认为最美的符号是:

在数学中我认为最美的公式是:

这时候我想问自己一个问题,那在深度学习, 计算机视觉中,最美的卷积神经网络是什么?
先不着急,请细读下文,我会给出答案。

二、经典架构回顾
为了不让本文的遍幅过长,本节只聊重点, 只聊重点,各经典架构的详细介绍就烦请读者自行查阅。


上图是ILSVRC历年的Top-5错误率,我们就按照上图中经典架构出现的时间顺序对他们进行简单的总结。
  • LeNet (1998年)

成绩:
LeNet是卷积神经网络的祖师爷LeCun在1998年提出,用于解决手写数字识别的视觉任务。自从那时起,CNN的最基本的架构就定下来了:卷积层、池化层、全连接层。
贡献点:
  • 定义了CNN的基本组件
基本组件包括:卷积层、池化层、全连接层。
  • 层之间连接顺序
卷积层后接池化层,最后接全连接层。

  • AlexNet (2012年)

成绩:
AlexNet在2012年ImageNet竞赛中以超过第二名10.9个百分点的绝对优势一举夺冠,从此深度学习和卷积神经网络名声鹊起,深度学习的研究如雨后春笋般出现,AlexNet的出现可谓是卷积神经网络的王者归来。
贡献点:
  • 更深的网络
比LeNet的5层多了3层。
  • 数据增广
增强模型的泛化能力,避免过拟合,使用了随机裁剪的思路对原来256×256的图像进行随机裁剪。
  • ReLU
用ReLU代替Sigmoid来加快收敛。
  • 多GPU支持
利用多GPU加速训练。
  • Dropout
有效缓解过拟合。

  • ZFNet (2013年)
下图为AlexNet与ZFNet的比较:




成绩:
ZFNet是2013年ImageNet分类任务的冠军,其网络结构没什么改进,只是调了参数,性能较AlexNet提升了不少。
贡献点:
  • 使用更小的卷积核,更小的滑动步长
将AlexNet第一层卷积核由11变成7,滑动步长由4变为2。

  • VGGNet(2014年)

成绩:
VGGNet是2014年ImageNet竞赛定位任务的第一名和分类任务的第二名中的基础网络。
贡献点:
  • 使用多个小的卷积核代替大的卷积核


上图为两个3X3的卷积核代替一个5X5大的卷积核,在降低参数的同时并建立了更多的非线性变换,使得网络对特征的学习能力更强。
  • 有规则的卷积-卷积-池化操作
VGGNet包含多个conv->conv->max pool这样的结构。

  • GoogLeNet(2014年)

成绩:
GoogLeNet在2014年的ImageNet分类任务上击败了VGGNet夺得冠军,它在加深网络的同时(22层),也在网络结构上做了创新,引入Inception结构代替了单纯的卷积+激活的传统操作。
GoogLeNet包括多个版本,如下所示:
Inception V1贡献点:
  • 引入Inception结构


该Inception结构中卷积核的滑动步长为1,通过3×3池化、以及1×1、3×3和5×5这三种不同尺度的卷积核,一共4种方式对输入做特征提取。
  • 中间层的辅助loss单元
GoogLeNet网络结构中有3个loss单元,这样的网络设计是为了帮助网络的收敛,在中间层加入辅助计算的loss单元,目的是计算损失时让低层的特征也有很好的区分能力,从而让网络更好地被训练。
  • 全连接层替换为简单的全局平均pooling
减少参数,提高计算效率。
Inception V2贡献点:
  • 引入BN层,减少Internal Covariate Shift问题
Batch Normalization:批标准化,对每一个 mini-batch 数据进行标准化处理,使输出规范化到 N(0,1) 的正态分布,减少了Internal Covariate Shift(内部神经元分布改变)。
  • 引用了VGGNet中使用多个小的卷积核代替大的卷积核的特性
Inception V3贡献点:
  • 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吧。

  • ResNet(2015年)


成绩:
2015年何恺明推出的ResNet在ISLVRC和COCO上横扫所有选手,获得冠军。
贡献点:
  • 网络非常深,已经超过百层,甚至千层
设计了一种残差模块让我们可以训练更深的网络。
残差模块结构如下图所示:


上图可以看出,数据经过了两条路线,一条是常规路线,另一条则是捷径(shortcut),直接实现单位映射的路线。


上图展示了两种形态的残差模块,左图是常规残差模块,有两个3×3卷积核组成,但是随着网络进一步加深,这种残差结构在实践中并不是十分有效。针对这问题,右图的“瓶颈残差模块”(bottleneck residual block)可以有更好的效果,它依次由1×1、3×3、1×1这三个卷积层堆积而成,这里的1×1的卷积能够起降维或升维的作用,3×3的卷积可以在相对较低维度的输入上进行,以降低参数从而达到提高计算效率的目的。
  • 引入残差模块来解决退化问题
网络深度增加的一个问题在于这些增加的层是参数更新的信号,因为梯度是从后向前传播的,增加网络深度后,比较靠前的层梯度会很小。这意味着这些层基本上学习停滞了,这就是梯度消失问题。
深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,因此简单地去增加网络深度反而出现更高的训练误差,深层网络虽然收敛了,但网络却开始退化了,即增加网络层数却导致更大的误差。
  • DenseNet(2017年)


其中Dense Block的结构图如下:


成绩:
2017最佳论文。
贡献点:
  • 密集连接:加强特征传播,鼓励特征复用
DenseNet是一种具有密集连接的卷积神经网络。在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入。
  • 密集连接:缓解梯度消失问题
这种Dense Connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深的网络不是问题。
  • 极大的减少了参数量,提高计算效率
由于每一层都包含之前所有层的输出信息,因此它不需要再重新学习多余的特征图,仅学习少量的几层特征图就可以了。

三、聊一聊这些架构有哪些优缺点
在上面回顾部分,对经典架构中的各种优点(贡献点)简单的做了说明,那这些架构是不是也有一些没有解决或没有考虑到的问题,下面我们简单的来聊一聊。
1.AlexNetZFNetVGGNet
性能比GoogLeNet、ResNet、DenseNet要差一些,所以重点来聊GoogLeNet、ResNet、DenseNet。
2.GoogLeNet
  • GoogLeNet以及 Inception的结构复杂吗?
我认为当时没有Residual Connection/Dense Connection这样神奇的设计,在网络深度很难增加时,就在网络宽度上做了创新(即引入了Inception结构),并设计各种规格来提高性能,导致网络过于复杂。
3.ResNet
  • 引入了Residual Connection训练很深的网络,是否会导致有些层没有作用?
实验表明:丢掉某些层对网络没有影响,即存在没有作用的层。
问题1:没有作用的层带来的存储及计算是浪费的?
问题2:没有作用的层如何量化?即有多少?
  • Block数量怎样的配置为最好?
ResNet50中Block数量分别是(3, 4, 6, 3)
ResNet101中Block数量分别是(3, 4, 23, 3)
问题1:手动配置很难是最好的,那是否有更优的方案?
4.DenseNet
  • 引入了Dense Connection每一层的输入为前面所有层输出特征图的堆叠,这些输入的特征图都全部利用上了吗?
实验表明:存在某些层没有全部利用输入的所有特征图。
问题1:没有利用上的特征图带来的计算是浪费的?
问题2:没有利用上的特征图如何量化?即有多少?
  • Dense Connection的设计只能在Dense Block内吗?
问题1:Block与Block之间的特征图没有得到很好复用?
  • Block数量怎样的配置为最好吗?
DenseNet121中Block数量分别是(6, 12, 24, 16)
DenseNet169中Block数量分别是(6, 12, 32, 32)
问题1:手动配置很难是最好的,那是否有更优的方案?
5.共存的问题
  • 简单/一般/复杂的任务都要经过这么复杂的网络吗?
问题1:很明显,简单的任务几层的网络就可以做到,那是否有更优的方案?
问题2:某个场景只有一些简单的任务,但由于内存等原因不能加载这么复杂的网络,是否可以通过卸载该网络某些能力,就可以使用?
问题3:如果有更复杂的任务,该网络是否有通过扩展使它的能力更强?

四、架构设计思考
从AlexNet到ZFNet到VGGNet、GoogLeNet再到ResNet和DenseNet,网络越来越深、越来越宽、越来越复杂、性能也越来越高、解决反向传播时梯度消失的方法也越来越巧妙,但如果让我们来设计强大的网络我们会采用什么样的方法呢?当然最快最好的方法就是把各路大神的成果直接拿来使用:
  • 数据增广
  • BN
  • ReLU
  • 全连接层替换为简单的全局平均pooling
  • 引入Residual Connection
  • 引入Dense Connection
  • 引入Inception相似结构
这里不完全采用GoogLeNet中的Inception结构,而是做了简化,如今网络在深度方面已不是问题,再加上已通过大量实验表明,多个小的卷积替换大的卷积是可行的,并且多个小的卷积增加了更多的非线性变换,使得网络对特征的学习能力更强,因此我认为网络在深度/宽度上堆叠如下简单结构可以达到各种神奇的效果:


想降低参数或想升维/降维就可以在前面增加一个Conv 1X1如下图所示:


还缺什么?
现已经在网络深度、网络宽度都得到很好的解决,想一想还缺什么?
也许你想到了,还缺网络广度
网络广度? 网络广度是什么?请继续看下面的内容。

五、SmartNet
SmartNet是什么?是一个新的网络架构,从网络深度、网络宽度、网络广度等方面来提高网络的性能,并来解决上面所提到的问题。
1.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个时间单位),如下图所示:


2.特征图上三角矩阵


什么?特征图上三角矩阵?之前只知道特征金字塔。
嗯,FPN就是近些年其中一种特别火也特别有用的特征金字塔网络,但与这个特征图上三角矩阵可不是同一个东西。该特征图上三角矩阵是统一存储(网络学习出来的)特征图的地方并共享给后面所有Block来使用。

3.网络中几个关键点
  • 最优的路径?
网络需要自己学习选择最优的路径。(这个可以考虑使用Condition GAN来训练生成一些隐信息来控制或使用强化学习)。
  • Smart Connection?
网络需要自己学习选择对Block有用的特征图。
  • Smart Block?
为了更加智能,Block中的层数最强的网络应该是自己学习得到的,这也就是为什么把Dense Block改名为Smart Block的原因。
  • 每组Block输出的特征图尺寸不一样?
可以采用不同大小的pooling或采用Fast/Faster RCNN中的ROI Pooling对不同大小的特征图映射到固定的大小。
  • 网络的参数?
这个同DenseNet一样,由于每一层都包含之前所有层的输出信息,因此它不需要再重新学习多余的特征图,仅学习少量的几层特征图就可以了。
  • 多个出口?
后一个出口是对前一个出口的增强。
即input4>input3>input2>input1。
  • 增减衣服最简易操作原则?
该网络符合我们从小都懂的一个增减衣服最简易操作原则,即天热时,减去最外层的衣服,天冷时,在最外层基础上增加一层衣服。
这样的网络优势很多,网络可以按出口存储,按出口加载。
对于一般的任务,只加载前几个出口相关的参数即可,甚至以后网络还有类似GC功能(垃圾回收器),动态加载与回收出口相关的参数来提高运行效率。
  • 如何训练?
一个出口一个出口训练。
题外话:众所都知目前的人工神经网络只学习W与b参数,可能还存在另外的参数需要学习,来使得我们的网络更强。

4.总结
为了我们的人工智能更加智能,最强的网络应该是在我们给定的目标下(如:内存、计算时间、正确率等),网络会自动初化化如上面所说的特征图上三角矩阵大小,甚至通过学习来调整特征图上三角矩阵的大小,并学习选择最优的路径。这个时候我们好像只需要给定几个超参数,其余的一切网络都会自己学习到。
在这里我们把这最强的网络赋能给原始的CNN。
有了这样的网络我们是不是不用关心AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet、SmartNet、甚至是已在路上的XXXNet或未来的YYYNet,只需要关心的是我们使用CNN卷积神经网络就可以了。

多管齐下、化繁为简、岂不美哉!!!

是时候给出开头问题的答案了。
最美的卷积神经网络是什么?

我认为最美的卷积神经网络是:

在CNN中我认为最美的卷积是:

以上网络还有很多问题值得去思考,这里只是抛出想法,本人在这方面资历尚浅,可能有许多不准确或不正确的地方,欢迎指正及提出您们宝贵的意见与建议。

此文章是原创,若是转载,请标明出处。

我知乎上连接 https://zhuanlan.zhihu.com/p/39120334

阅读更多
个人分类: 深度学习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭