从卷积的变化看计算机视觉发展 xukunda2019-05-24 00:07:20 回复 11 查看 经验交流
从卷积的变化看计算机视觉发展

一、Group convolution:将卷积操作分部在不同的设备

群卷积最早出现于AlexNet中。由于当时的硬件资源有限,训练AlexNet时卷积操作不能全部放在同一个加速卡处理,因此作者把feature maps分给多个加速卡分别进行处理,最后把多个GPU的结果进行融合。Alex认为group conv的方式能够增加 filter之间的对角相关性,而且能够减少训练参数,不容易过拟合,这类似于正则的效果。

1558686013678656.png 

分组卷积的思想影响比较深远,当前一些轻量级的SOTA(State Of The Art)网络,都用到了分组卷积的操作,以节省计算量。但题主有个疑问是,如果分组卷积是分在不同MLU上的话,每个MLU的计算量就降低到 1/group。

下图是一个正常的、没有分组的卷积层结构。下图用第三维的视角展示了CNN的结构,一个filter就对应一个输出channel。随着网络层数的加深,通道数急剧增加,而空间维度随之减少,因为卷积层的卷积核越来越多,但是随着卷积池化操作,特征图越来越小。所以在深层网络中,channel的重要性越来越大。

 

1558686038712415.png

 

下图则是一个group convolution的CNN结构。filters被分成了两个group。每一个group都只有原来一半的feature map。

 

1558686038789846.png 

 

 

二、3×3卷积核:用小卷积核堆叠替换大卷积核

AlexNet中用到了一些大尺寸卷积核,比如11×11、5×5卷积核,之前人们的观念是,卷积核越大,receptive field(感受野)越大,看到的图片信息越多,因此获得的特征越好。虽说如此,但是大卷积同样会带来信息获取高度冗余,会导致计算量的暴增,不利于模型深度的增加,计算性能也会降低。于是在VGG(最早使用),利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳,同时参数量(3×3×2+1 VS 5×5×1+1)被降低,因此后来3×3卷积核被广泛应用在各种模型中。

· 3x3 是最小的能够捕获像素八邻域信息的尺寸。

· 两个 3x3 的堆叠卷基层的有限感受野是 5x5 ;三个 3x3 的堆叠卷基层的感受野是7x7,故可以通过小尺寸卷积层的堆叠替代大尺寸卷积层,并且感受野大小不变。

· 多个 3x3 的卷基层比一个大尺寸 filter卷基层有更多的非线性(更多层的非线性函数),使得判决函数更加具有判决性。

· 多个 3x3的卷积层比一个大尺寸的 filter 有更少的参数,假设卷基层的输入和输出的特征图大小相同为 C,那么三个 3x3 的卷积层参数个数 3x(3x3xCxC)=27C2;一个7x7的卷积层参数为49C2;所以可以把三个3x3的filter看成是一个7x7 filter的分解(中间层有非线性的分解, 并且起到隐式正则化的作用。

1558686038904554.png 

 

三、Inception结构:同时获得多种尺寸特征

传统的层叠式网络,基本上都是一个个卷积层的堆叠,每层只用一个尺寸的卷积核,例如VGG结构中使用了大量的3×3卷积层。事实上,同一层feature map可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,再把这些特征结合起来,得到的特征往往比使用单一卷积核的要好,谷歌的GoogleNet,或者说Inception系列的网络,就使用了多个卷积核的结构,Inception

的核心思想:通过多个卷积核提取图像不同尺度的信息,最后进行融合,可以得到图像更好的表征,这样的操作本质上会让神经网变得稍微「宽一些」,而不是「更深」。

 

1558686038939515.png 

最初版本的Inception结构

如上图所示,一个输入的feature map分别同时经过1×1、3×3、5×5的卷积核的处理,得出的特征再组合起来,获得更佳的特征。但这个结构会存在一个严重的问题:参数量比单个卷积核要多很多,如此庞大的计算量会使得模型效率低下。这就引出了一个新的结构:

 

四、Bottleneck:高效降低卷积层参数

发明GoogleNet的团队发现,如果仅仅引入多个尺寸的卷积核,会带来大量的额外的参数,受到Network In Network中1×1卷积核的启发,为了解决这个问题,他们往Inception结构中加入了一些1×1的卷积核,如图所示:

1558686038469898.png 

加入1×1卷积核的Inception结构

1558686038370116.png 

根据上图,我们来做个对比计算,假设输入feature map的维度为256维,要求输出维度也是256维。有以下两种操作:

1. 256维的输入直接经过一个3×3×256的卷积层,输出一个256维的feature map,那么参数量为:256×3×3×256 = 589,824

2. 256维的输入先经过一个1×1×64的卷积层,再经过一个3×3×64的卷积层,最后经过一个1×1×256的卷积层,输出256维,参数量为:256×1×1×64 + 64×3×3×64 + 64×1×1×256 = 69,632。足足把第一种操作的参数量降低到九分之一!

1×1卷积核也被认为是影响深远的操作,往后大型的网络为了降低参数量都会应用上1×1卷积核。

GoogleNet利用1x1的卷积降维后,得到了更为紧凑的网络结构,虽然总共22层,但是参数数量却只有8层的AlexNet的十二分之一。

1x1卷积层可以在不改变矩阵性质的情况下,可以灵活地变化矩阵channel的维度,不仅可以给矩阵降维减轻运算量,还可以构建bottleneck,低成本地增加网络复杂度使其可以逼近更精确的目标数学模型。

 

五、ResNet:解决 网络深度导致性能下降问题

ResNet 的核心思想是引入一个所谓的「恒等快捷连接」(identity shortcut connection),直接跳过一个或多个层

1558686038179624.png 

传统的卷积层层叠网络会遇到一个问题,当层数加深时,网络的表现越来越差,很大程度上的原因是因为当层数加深时,梯度消散得越来越严重,以至于反向传播很难训练到浅层的网络。为了解决这个问题,何凯明大神想出了一个“残差网络”,使得梯度更容易地流动到浅层的网络当中去,而且这种“skip connection”能带来更多的好处,

2018年的5月,Cornell University的几个人研究了ResNet,发现它所谓的“超深网络”只是个噱头,文章如下:

Residual Networks are Exponential Ensembles of Relatively Shallow Networks

文章的主题是:

A residual network is not a single ultra-deep network, but instead is a very large implicit ensemble of many networks.

意思是ResNet并不深,它本质上是一堆浅层网络的集合。 ResNet就像是搭积木,在一个主干网络的旁路上,插入了各种各样的积木网络,这种网络集合的效果类似于Dropout,或者更恰当的说, 类似于多个网络的ensemble形态,所以精度很高。

六、DepthWise操作:卷积操作时必须同时考虑通道和区域吗

1558686038914861.png 

标准的卷积过程可以看上图,一个2×2的卷积核在卷积时,对应图像区域中的所有通道均被同时考虑,问题在于,为什么一定要同时考虑图像区域和通道?我们为什么不能把通道和空间区域分开考虑?

1558686038975711.png 

Xception网络就是基于以上的问题发明而来。我们首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道feature maps之后,这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操作。这种操作被称为 “DepthWise convolution” ,缩写“DW”。

这种操作是相当有效的,在imagenet 1000类分类任务中已经超过了InceptionV3的表现,而且也同时减少了大量的参数,我们来算一算,假设输入通道数为3,要求输出通道数为256,两种做法:

1.直接接一个3×3×256的卷积核,参数量为:3×3×3×256 = 6,912

2.DW操作,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795,又把参数量降低到九分之一!

因此,一个depthwise操作比标准的卷积操作降低不少的参数量,同时论文中指出这个模型得到了更好的分类效果。

 

七、ShuffleNet:分组卷积能否对通道进行随机分组?

在AlexNet的Group Convolution当中,特征的通道被平均分到不同组里面,最后再通过两个全连接层来融合特征,这样一来,就只能在最后时刻才融合不同组之间的特征,对模型的泛化性是相当不利的。为了解决这个问题,ShuffleNet在每一次层叠这种Group conv层前,都进行一次channel shuffle,shuffle过的通道被分配到不同组当中。进行完一次group conv之后,再一次channel shuffle,然后分到下一层组卷积当中,以此循环。

1558686038590805.png 

来自ShuffleNet论文

经过channel shuffle之后,Group conv输出的特征能考虑到更多通道,输出的特征自然代表性就更高。另外,AlexNet的分组卷积,实际上是标准卷积操作,而在ShuffleNet里面的分组卷积操作是depthwise卷积,因此结合了通道洗牌和分组depthwise卷积的ShuffleNet,能得到超少量的参数以及超越mobilenet、媲美AlexNet的准确率!

另外值得一提的是,微软亚洲研究院MSRA最近也有类似的工作,他们提出了一个IGC单元(Interleaved Group Convolution),即通用卷积神经网络交错组卷积,形式上类似进行了两次组卷积,Xception 模块可以看作交错组卷积的一个特例,特别推荐看看这篇文章:王井东详解ICCV 2017入选论文:通用卷积神经网络交错组卷积

要注意的是,Group conv是一种channel分组的方式,Depthwise +Pointwise是卷积的方式,只是ShuffleNet里面把两者应用起来了。因此Group conv和Depthwise +Pointwise并不能划等号。

 

八、SEnet:赋予通道间的特征以权重

无论是在Inception、DenseNet或者ShuffleNet里面,我们对所有通道产生的特征都是不分权重直接结合的,那为什么要认为所有通道的特征对模型的作用就是相等的呢? 这是一个好问题,于是,ImageNet2017 冠军SEnet就出来了。

1558686038753900.png 

SEnet 结构

一组特征在上一层被输出,这时候分两条路线,第一条直接通过,第二条首先进行Squeeze操作(Global Average Pooling),把每个通道2维的特征压缩成一个1维,从而得到一个特征通道向量(每个数字代表对应通道的特征)。然后进行Excitation操作,把这一列特征通道向量输入两个全连接层和sigmoid,建模出特征通道间的相关性,得到的输出其实就是每个通道对应的权重,把这些权重通过Scale乘法通道加权到原来的特征上(第一条路),这样就完成了特征通道的权重分配。作者详细解释可以看这篇文章:专栏 | Momenta详解ImageNet 2017夺冠架构SENet

 

九、Dilated convolution:有限的参数获得更大的感受野

标准的3×3卷积核只能看到对应区域3×3的大小,但是为了能让卷积核看到更大的范围,dilated conv使其成为了可能。dilated conv原论文中的结构如图所示:

1558686038181515.png 

上图b可以理解为卷积核大小依然是3×3,但是每个卷积点之间有1个空洞,也就是在绿色7×7区域里面,只有9个红色点位置作了卷积处理,其余点权重为0。这样即使卷积核大小不变,但它看到的区域变得更大了。详细解释可以看这个回答:如何理解空洞卷积(dilated convolution)?

 

十、Deformable convolution :可变形卷积核

1558686038357204.png传统的卷积核一般都是长方形或正方形,但MSRA提出了一个相当反直觉的见解,认为卷积核的形状可以是变化的,变形的卷积核能让它只看感兴趣的图像区域 ,这样识别出来的特征更佳。

1558686038374861.png 

要做到这个操作,可以直接在原来的过滤器前面再加一层过滤器,这层过滤器学习的是下一层卷积核的位置偏移量(offset),这样只是增加了一层过滤器,或者直接把原网络中的某一层过滤器当成学习offset的过滤器,这样实际增加的计算量是相当少的,但能实现可变形卷积核,识别特征的效果更好。详细MSRA的解读可以看这个链接:可变形卷积网络:计算机新“视”界。

 

总结:

卷积核方面:

1. 大卷积核用多个小卷积核代替;

2. 单一尺寸卷积核用多尺寸卷积核代替;

3. 固定形状卷积核趋于使用可变形卷积核;

4. 使用1×1卷积核(bottleneck结构)。

卷积层通道方面:

1. 标准卷积用depthwise卷积代替;

2. 使用分组卷积;

3. 分组卷积前使用channel shuffle;

4. 通道加权计算。

卷积层连接方面:

1. 使用skip connection,让模型更深;

2. densely connection,使每一层都融合上其它层的特征输出(DenseNet)

 

 

 


官方微博 官方微信
版权所有 © 2019 寒武纪 Cambricon 备案/许可证号:京ICP备17003415
关闭