深度学习随手记
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=589824
右 256x1x1x64+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)
的结合会不会成为以后降低参数量的标准配置?