深度学习随手记

Group Convolution

最早来自于AlexNet,分组卷积是按卷积的通道进行分组,比如输入N通道,输出M通道,均分成K组,每组通道输入N/K,输出M/K,再将各组按照通道concatenate例:参数量256x3x3x256 => 8x32x3x3x32 (N=M=32,K=8) 参数量降到1/8

VGGnet 的 3x3 卷积

小卷积有利于网络的加深!

Inception 结构

GoogleNet,不同尺寸卷积核并联结构,特征组合!

Bottleneck结构

GoogleNet从NiN中受到启发,在Inception结构中加入了一些1x1卷积核,参数量降低分析:
深度学习随手记
256x3x3x256=589824256x1x1x64+64x3x3x64+64x1x1x256=69632
参数量降到1/9

Resnet网络 [=> FractalNet(Drop path)]

Resnet skip connection
层数加深 梯度消散严重 难于BP
为什么Resnet结构可以消除梯度弥散呢?
A: 先看一张图,梯度流过一个blcok之后,就已经下降了几个量级,传到前一层的梯度将会变得很小!
深度学习随手记
加入一条捷径,深度学习随手记

  • 右边来自深层网络传回来的梯度为1,经过一个加法门,橙色方向的梯度为dh(x)/dx=1,蓝色方向的梯度也为1。这样,经过梯度传播后,现在传到前一层的梯度就变成了[1, 0.0001, 0.01],多了一个“1”!正是由于多了这条捷径,来自深层的梯度能直接畅通无阻地通过,去到上一层,使得浅层的网络层参数等到有效的训练!
  • ResNet正是有了这样的Skip Connection,梯度能畅通无阻地通过各个Res blocks,作者何凯明说到,唯一影响深度的就是内存不足,因此只要内存足够,上千层的残差网络也都能实现。
  • Resnet同样还有Ensemble说法!
  • 而DenseNet更为极端,它的skip connection不仅仅只连接上下层,直接实现了跨层连接,每一层获得的梯度都是来自前面几层的梯度加成。深度学习随手记由于DenseBlock的横向结构类似 Inception block的结构,使得需要计算的参数量大大降低。深度学习随手记
  • Drop path 深度学习随手记
    PS:BatchNormalization(BN)BN通过规范化输入数据改变数据分布,在前传过程中消除梯度弥散。而skip connection则能在后传过程中更好地把梯度传到更浅的层次中。

DepthWise Operation

来自Xception网络,首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道feature maps之后,这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操作。这种操作被称为 DepthWise convolution Depthwise separable Convolution,缩写“DW”。深度学习随手记
参数量降低比较:
设输出3通道,输出256通道:
3×3×3×256 = 6,912 => 3×3×3 + 3×1×1×256 = 795 九分之一
PS: Depthwise和Pointwise(elementwise)

ShuffleNet (<=> MobileNet)

  • 在AlexNet的Group Convolution当中,特征的通道被平均分到不同组里面,最后再通过两个全连接层来融合特征,这样一来,就只能在最后时刻才融合不同组之间的特征,对模型的泛化性是相当不利的。
  • 边界效应,什么意思呢?就是某个输出channel仅仅来自输入channel的一小部分。这样肯定是不行的的,学出来的特征会非常局限。于是就有了channel shuffle来解决这个问题,
  • 为了解决这个问题,ShuffleNet在每一次层叠这种Group conv层前,都进行一次channel shuffle,shuffle过的通道被分配到不同组当中。进行完一次group conv之后,再一次channel shuffle,然后分到下一层组卷积当中,以此循环。
  • ShuffleNet的核心就是用pointwise group convolution,channel shuffle和depthwise separable convolution代替ResNet block的相应层构成了ShuffleNet uint,达到了减少计算量和提高准确率的目的。channel shuffle解决了多个group convolution叠加出现的边界效应,pointwise group convolution和depthwise separable convolution主要减少了计算量。深度学习随手记- AlexNet的分组卷积,实际上是标准卷积操作,而在ShuffleNet里面的分组卷积操作是depthwise卷积,因此结合了通道洗牌和分组depthwise卷积的ShuffleNet,能得到超少量的参数以及超越mobilenet、媲美AlexNet的准确率!
  • 然后在每个stage中用ShuffleNet unit代替原来的Residual block,这也就是ShuffleNet算法的核心。(ResNet中有4个stage,这里只有3个)深度学习随手记

SEnet

  • Squeeze-and-Excitation Networks 子结构!
  • 主要结构是各通道取均值(得1x1xC)+全连接层(即矩阵乘,得1x1xC/r)+ReLU+全连接层(得1x1xC)+Sigmoid(得所谓的“各通道特征的权重”)
    深度学习随手记
    One of our high-performing networks is constructed by integrating SE blocks with a modified ResNeXt,也就是Table3中最后一行的SENet!具体而言是在64*4d 的ResNeXt-152网络中引入了SE block。而这个ResNeXt-152是在ResNeXt-101的基础上根据ResNet-152的叠加方式改造出来的
    深度学习随手记
    Inception+SE inception_3a_global_pool是average pooling,inception_3a_prob是sigmoid函数
    深度学习随手记
    注意看这个SENet的红色部分都是用卷积操作代替文中的全连接层操作实现的,本质上没有什么区别。具体来说,inception_3a_11_down是输出channel为16的11卷积,其输入channel是256,这也符合文中说的缩减因子为16(256/16=16);而inception_3a_11_up是输出channel为256的11卷积。
    SE-ResNet-50
    深度学习随手记

SE-ResNet-50的情况也类似,如上图。在ResNet中都是在Residual block中嵌入SENet。下图最左边的长条连线是原来Residual block的skip connection,右下角的conv2_2_global_pool到conv2_2_prob以及左边那条连线都是SENet。不过也是用两个1*1卷积代替文中的两个全连接层。

Dilated convolution

标准的3×3卷积核只能看到对应区域3×3的大小,但是为了能让卷积核看到更大的范围,dilated conv使其成为了可能。深度学习随手记
深度学习随手记
VGGnet作者发现,7 x 7 的卷积层的正则等效于 3 个 3 x 3 的卷积层的叠加。而这样的设计不仅可以大幅度的减少参数,其本身带有正则性质的 convolution map 能够更容易学一个 generlisable, expressive feature space深度学习随手记

  • Deep CNN 对于其他任务还有一些致命性的缺陷。较为著名的是 up-sampling 和 pooling layer 的设计。这个在 Hinton 的演讲里也一直提到过。主要问题有:1 Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (a.k.a. not learnable) 2 内部数据结构丢失;3 空间层级化信息丢失。4 小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)
  • 在这样问题的存在下,语义分割问题一直处在瓶颈期无法再明显提高精度, 而 dilated convolution 的设计就良好的避免了这些问题。
  • 对于 dilated convolution, 我们已经可以发现他的优点,即内部数据结构的保留和避免使用 down-sampling 这样的特性。
  • 潜在问题 1:The Gridding Effect 深度学习随手记
    我们发现我们的 kernel 并不连续,也就是并不是所有的 pixel 都用来计算了,因此这里将信息看做 checker-board 的方式会损失信息的连续性。这对 pixel-level dense prediction 的任务来说是致命的。
  • 潜在问题 2:Long-ranged information might be not relevant.我们从 dilated convolution 的设计背景来看就能推测出这样的设计是用来获取 long-ranged information。然而光采用大 dilation rate 的信息或许只对一些大物体分割有效果,而对小物体来说可能则有弊无利了。如何同时处理不同大小的物体的关系,则是设计好 dilated convolution 网络的关键。
  • 通向标准化设计:Hybrid Dilated Convolution (HDC)深度学习随手记深度学习随手记这样我们的卷积依然是连续的也就依然能满足VGG组观察的结论,大卷积是由小卷积的 regularisation 的 叠加。
    以下的对比实验可以明显看出,一个良好设计的 dilated convolution 网络能够有效避免 gridding effect.深度学习随手记
  • 多尺度分割的另类解:Atrous Spatial Pyramid Pooling (ASPP),ASPP 则在网络 decoder 上对于不同尺度上用不同大小的 dilation rate 来抓去多尺度信息,每个尺度则为一个独立的分支,在网络最后把他合并起来再接一个卷积层输出预测 label。这样的设计则有效避免了在 encoder 上冗余的信息的获取,直接关注与物体之间之内的相关性。

Deformable convolution

Deformable Convolutional Networks
消除网络难以适应几何变形,变形的卷积核能让它只看感兴趣的图像区域 ,这样识别出来的特征更佳。
深度学习随手记
深度学习随手记要做到这个操作,可以直接在原来的过滤器前面再加一层过滤器,这层过滤器学习的是下一层卷积核的位置偏移量(offset),这样只是增加了一层过滤器,或者直接把原网络中的某一层过滤器当成学习offset的过滤器,这样实际增加的计算量是相当少的,但能实现可变形卷积核,识别特征的效果更好。

现今工业界趋势

网络的轻量化,希望又快又准!
从原来AlexNet、VGGnet,到体积小一点的Inception、Resnet系列,到目前能移植到移动端的mobilenet、ShuffleNet(体积能降低到0.5mb!):
卷积核方面:

  • 大卷积核用多个小卷积核代替;VGG
  • 单一尺寸卷积核用多尺寸卷积核代替; Inception
  • 固定形状卷积核趋于使用可变形卷积核;Deformable Conv
  • 使用1×1卷积核(bottleneck结构)。NiN

卷积层通道方面:

  • 标准卷积用depthwise卷积代替;Xception
  • 使用分组卷积;Group Conv
  • 分组卷积前使用channel shuffle;ShuffleNet
  • 通道加权计算。SEnet

卷积层连接方面:

  • 使用skip connection,让模型更深;ResNet
  • densely connection,使每一层都融合上其它层的特征输出 DenseNet

启发

  • 类比到通道加权操作,卷积层跨层连接能否也进行加权处理?
  • bottleneck (1x1 conv) + Group conv (MultiGPU) + channel shuffle (Randomize Grouplize) + depthwise (Pointwise) 的结合会不会成为以后降低参数量的标准配置?