AI |算法工程师必备的深度学习--CNN:图像分类(下)
作者:华校专
作者信息:
华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。
编者按:
算法工程师必备系列更新啦!继上次推出了算法工程师必备的数学基础后,小编继续整理了必要的机器学习知识,全部以干货的内容呈现,哪里不会学哪里,老板再也不用担心你的基础问题!
9.2.2 MobileNet V2
MobileNet V2
创新性的提出了具有线性bottleneck
的Inverted
残差块。这种块特别适用于移动设备和嵌入式设备,因为它用到的张量都较小,因此减少了推断期间的内存需求。
9.2.2.1 线性bottleneck
- 一直以来,人们认为与任务相关的信息是嵌入到
feature map
中的一个低维子空间。因此feature map
事实上有一定的信息冗余。如果缩减feature map
的通道数量(相当于降维),则可以降低计算量。MobileNet V1
就是采用宽度乘子,从而在计算复杂度和准确率之间平衡。 - 由于
ReLU
非线性激活的存在,缩减输入feature map
的通道数量可能会产生不良的影响。输入feature map
中每个元素值代表某个特征,将所有图片在该feature map
上的取值扩成为矩阵:其中 N 为样本的数量, 。即:行索引代表样本,列索引代表特征。所有特征由feature map
展平成一维得到。通常 ,则输入矩阵 的秩 。其中 , 为输出通道数。上面的讨论的是ReLU
的非线性导致信息的不可逆丢失。 - 对于输出的维度 ,如果 在维度 j 上的取值均小于 0 ,则由于 ReLU 的作用, 在维度 j 上取值均为 0 ,此时可能发生信息不可逆的丢失。
- 如果
1x1
卷积的输出通道数很小(即 较小),使得 ,则 的每个维度都非常重要。一旦经过ReLU
之后 的信息有效维度降低(即 ),则发生信息的丢失。且这种信息丢失是不可逆的。这使得输出feature map
的有效容量降低,从而降低了模型的表征能力。 - 如果
1x1
卷积的输出通道数较大(即 较大),使得 ,则 的维度出现冗余。即使 的某个维度被丢失,该维度的信息仍然可以从其它维度得到。 - 如果
1x1
卷积的输出通道数非常小,使得 ,则信息压缩的过程中就发生信息不可逆的丢失。 如果考虑 ReLU
,则输出featuremap
为:对于 1x1
卷积(不考虑ReLU
),则1x1
卷积是输入特征的线性组合。输出featuremap
以矩阵描述为:- 实验表明:
bootleneck
中使用线性是非常重要的。虽然引入非线性会提升模型的表达能力,但是引入非线性会破坏太多信息,会引起准确率的下降。在Imagenet
测试集上的表现如下图:
9.2.2.2 bottleneck block
bottleneck block
:输入feature map
首先经过线性bottleneck
来扩张通道数,然后经过深度可分离卷积,最后通过线性bottleneck
来缩小通道数。输入bootleneck
输出通道数与输入通道数的比例称作膨胀比。通常较小的网络使用略小的膨胀比效果更好,较大的网络使用略大的膨胀比效果更好。 如果膨胀比小于 1 ,这就是一个典型的 resnet
残差块。- 可以在
bottleneck block
中引入旁路连接,这种bottleneck block
称作Inverted
残差块,其结构类似ResNet
残差块。 - 在
ResNeXt
残差块中,首先对输入feature map
执行1x1
卷积来压缩通道数,最后通过1x1
卷积来恢复通道数。这对应了一个输入feature map
通道数先压缩、后扩张的过程。 - 在
Inverted
残差块中,首先对输入feature map
执行1x1
卷积来扩张通道数,最后通过1x1
卷积来恢复通道数。这对应了一个输入feature map
通道数先扩张、后压缩的过程。这也是Inverted
残差块取名为Inverted
的原因。 - 当深度可分离卷积的步长为
1
时,bottleneck block
包含了旁路连接。当深度可分离卷积的步长不为1
时,bottleneck block
不包含旁路连接。这是因为:输入feature map
的尺寸与块输出feature map
的尺寸不相同,二者无法简单拼接。虽然可以将旁路连接通过一个同样步长的池化层来解决,但是根据ResNet
的研究,破坏旁路连接会引起网络性能的下降。
4.事实上旁路连接有两个插入的位置:在两个
1x1
卷积的前后,或者在两个Dwise
卷积的前后。通过实验证明:在两个
1x1
卷积的前后使用旁路连接的效果最好。在Imagenet
测试集上的表现如下图:5.bottleneck block
可以看作是对信息的两阶段处理过程:在
MobileNet v2
中这二者是独立的,而传统网络中这二者是相互纠缠的。阶段一:对输入 feature map
进行降维,这一部分代表了信息的容量。阶段二:对信息进行非线性处理,这一部分代表了信息的表达。
9.2.2.3 网络性能
MobileNet V2
的设计基于MobileNet v1
,其结构如下:- 每一行代表一个或者一组相同结构的层,层的数量由 n 给定。
- 相同结构指的是:
- 同一行内的层的类型相同,由
Operator
指定。其中bottleneck
指的是bottleneck block
。 - 同一行内的层的膨胀比相同,由
t
指定。 - 同一行内的层的输出通道数相同,由
c
指定。 - 同一行内的层:第一层采用步幅
s
,其它层采用步幅1
。 - 采用
ReLU6
激活函数,因为它在低精度浮点运算的环境下表现较好。 - 训练过程中采用
dropout
和BN
。 - 与
MobileNet V1
类似,MobileNet V2
也可以引入宽度乘子、分辨率乘子这两个超参数。 - 网络推断期间最大内存需求(
通道数/内存消耗(Kb)
):采用 16 bit 的浮点运算。
4.网络在
ImageNet
测试集上的表现:网络 | Top 1 | Params(百万) | 乘-加 数量(百万) | CPU |
---|---|---|---|---|
MobileNet V1 | 70.6 | 4.2 | 575 | 113ms |
ShuffleNet (1.5) | 71.5 | 3.4 | 292 | - |
ShuffleNet (x2) | 73.7 | 5.4 | 524 | - |
NasNet-A | 74.0 | 5.3 | 564 | 183ms |
MobileNet V2 | 72.0 | 3.4 | 300 | 75ms |
MobileNet V2(1.4) | 74.7 | 6.9 | 585 | 143ms |
最后一列给出了预测单张图片的推断时间。
9.3 ShuffleNet 系列
9.3.1 ShuffleNet
ShuffleNet
提出了1x1分组卷积+通道混洗
的策略,在保证准确率的同时大幅降低计算成本。ShuffleNet
专为计算能力有限的设备(如:10~150MFLOPs
)设计。在基于ARM
的移动设备上,ShuffleNet
与AlexNet
相比,在保持相当的准确率的同时,大约 13 倍的加速。
9.3.1.1 ShuffleNet block
- 在
Xception
和ResNeXt
中,有大量的1x1
卷积,所以整体而言1x1
卷积的计算开销较大。如ResNeXt
的每个残差块中,1x1
卷积占据了乘-加
运算的 93.4% (基数为32时)。在小型网络中,为了满足计算性能的约束(因为计算资源不够)需要控制计算量。虽然限制通道数量可以降低计算量,但这也可能会严重降低准确率。解决办法是:对1x1
卷积应用分组卷积,将每个1x1
卷积仅仅在相应的通道分组上操作,这样就可以降低每个1x1
卷积的计算代价。 1x1
卷积仅在相应的通道分组上操作会带来一个副作用:每个通道的输出仅仅与该通道所在分组的输入(一般占总输入的比例较小)有关,与其它分组的输入(一般占总输入的比例较大)无关。这会阻止通道之间的信息流动,降低网络的表达能力。解决办法是:采用通道混洗,允许分组卷积从不同分组中获取输入。如下图所示: (a)
表示没有通道混洗的分组卷积;(b)
表示进行通道混洗的分组卷积;(c)
为(b)
的等效表示。由于通道混洗是可微的,因此它可以嵌入到网络中以进行端到端的训练。 ShuffleNet
块的结构从ResNeXt
块改进而来:下图中(a)
是一个ResNeXt
块,(b)
是一个ShuffleNet
块,(c)
是一个步长为2
的ShuffleNet
块。在ShuffleNet
块中:因为当feature map
减半时,为了缓解信息丢失需要将输出通道数加倍从而保持模型的有效容量。- 第一个
1x1
卷积替换为1x1
分组卷积+通道随机混洗。 - 第二个
1x1
卷积替换为1x1
分组卷积,但是并没有附加通道随机混洗。这是为了简单起见,因为不附加通道随机混洗已经有了很好的结果。 - 在
3x3 depthwise
卷积之后只有BN
而没有ReLU
。 - 当步长为2时:
- 恒等映射直连替换为一个尺寸为
3x3
、步长为2
的平均池化。 3x3 depthwise
卷积的步长为2
。- 将残差部分与直连部分的
feature map
拼接,而不是相加。
9.3.1.2 网络性能
- 在
Shufflenet
中,depthwise
卷积仅仅在1x1
卷积的输出feature map
上执行。这是因为depthwise
很难在移动设备上高效的实现,因为移动设备的计算/内存访问
比率较低,所以仅仅在1x1
卷积的输出feature map
上执行从而降低开销。 ShuffleNet
网络由ShuffleNet
块组成。- 网络主要由三个
Stage
组成。 - 每个
Stage
的第一个块的步长为 2 ,stage
内的块在其它参数上相同。 - 每个
Stage
的输出通道数翻倍。 - 在
Stage2
的第一个1x1
卷积并不执行分组卷积,因此此时的输入通道数相对较小。 - 每个
ShuffleNet
块中的第一个1x1
分组卷积的输出通道数为:该块的输出通道数的1/4
。 - 使用较少的数据集增强,因为这一类小模型更多的是遇到欠拟合而不是过拟合。
- 复杂度给出了计算量(
乘-加运算
),KSize
给出了卷积核的尺寸,Stride
给出了ShuffleNet block
的步长,Repeat
给出了ShuffleNet block
重复的次数,g
控制了ShuffleNet block
分组的数量。g=1
时,1x1
的通道分组卷积退化回原始的1x1
卷积。 - 超参数
g
会影响模型的准确率和计算量。在ImageNet
测试集上的表现如下: ShuffleNet sx
表示对ShuffleNet
的通道数增加到s
倍。这通过控制Conv1
卷积的输出通道数来实现。g
越大,则计算量越小,模型越准确。其背后的原理是:小模型的表达能力不足,通道数量越大,则小模型的表达能力越强。g
越大,则准确率越高。这是因为对于ShuffleNet
,分组越大则生成的feature map
通道数量越多,模型表达能力越强。* 网络的通道数越小(如ShuffleNet 0.25x
),则这种增益越大。- 随着分组越来越大,准确率饱和甚至下降。这是因为随着分组数量增大,每个组内的通道数量变少。虽然总体通道数增加,但是每个分组提取有效信息的能力变弱,降低了模型整体的表征能力。
- 虽然较大
g
的ShuffleNet
通常具有更好的准确率。但是由于它的实现效率较低,会带来较大的推断时间。 - 通道随机混洗的效果要比不混洗好。在
ImageNet
测试集上的表现如下: 通道混洗使得分组卷积中,信息能够跨分组流动。 分组数 g
越大,这种混洗带来的好处越大。- 多种模型在
ImageNet
测试集上的表现:比较分为三组,每一组都有相差无几的计算量。 给出了在该组中,模型相对于MobileNet
的预测能力的提升。 MFLOPs
表示乘-加
运算量(百万),错误率表示top-1 error
。ShuffleNet 0.5x(shallow,g=3)
是一个更浅的ShuffleNet
。考虑到MobileNet
只有 28 层,而ShuffleNet
有 50 层,因此去掉了Stage 2-4
中一半的块,得到一个教浅的、只有 26 层的ShuffleNet
。- 在移动设备上的推断时间(
Qualcomm Snapdragon 820 processor
,单线程):
9.3.2 ShuffleNet V2
ShuffleNet V2
基于一系列对照实验提出了高效网络设计的几个通用准则,并提出了ShuffleNet V2
的网络结构。
9.3.2.1 小型网络通用设计准则
- 目前衡量模型推断速度的一个通用指标是
FLOPs
(即乘-加
计算量)。事实上这是一个间接指标,因为它不完全等同于推断速度。如:MobileNet V2
和NASNET-A
的FLOPs
相差无几,但是MobileNet V2
的推断速度要快得多。如下所示为几种模型在GPU
和ARM
上的准确率(在ImageNet
验证集上的测试结果)、模型推断速度(通过Batch/秒
来衡量)、计算复杂度(通过FLOPs
衡量)的关系。 - 在
ARM
平台上batchsize=1
, 在GPU
平台上batchsize=8
。 - 准确率与模型容量成正比,而模型容量与模型计算复杂度成成比、计算复杂度与推断速度成反比。因此:模型准确率越高,则推断速度越低;模型计算复杂度越高,则推断速度越低。
FLOPs
和推断速度之间的差异有两个原因- 除了
FLOPs
之外,还有几个因素对推断速度有重要的影响。 - 内存访问量(
memory access cost:MAC
):在某些操作(如分组卷积)中,其时间开销占相当大比例。因此它可能是GPU
这种具有强大计算能力设备的瓶颈。 - 模型并行度:相同
FLOPs
的情况下,高并行度的模型比低并行度的模型快得多。 - 即使相同的操作、相同的
FLOPs
,在不同的硬件设备上、不同的库上,其推断速度也可能不同。 MobileNet V2
和ShuffleNet V1
这两个网络非常具有代表性,它们分别采用了group
卷积和depth-wise
卷积。这两个操作广泛应用于其它的先进网络。利用实验分析它们的推断速度(以推断时间开销来衡量)。其中:宽度乘子均为1,ShuffleNet V1
的分组数g=3
。从实验结果可知:FLOPs
指标仅仅考虑了卷积部分的计算量。虽然这部分消耗时间最多,但是其它操作包括数据IO
、数据混洗、逐元素操作(ReLU
、逐元素相加)等等时间开销也较大。
4.小型网络通用设计准则:
- 准则一:输入通道数和输出通道数相等时,
MAC
指标最小。假设输入feature map
尺寸为 、通道数为 ,输出通道数为 。假设为1x1
卷积,则FLOPs
为: 。其内存访问量为:输入featuremap
内存访问量+输出featuremap
内存访问量+卷积核内存访问量。因此有: 。根据不等式 。当 时等式成立。 - 准则二:大量使用分组卷积会增加
MAC
。分组卷积可以降低FLOPs
。换言之,它可以在FLOPs
固定的情况下,增大featuremap
的通道数从而提高模型的容量。但是采用分组卷积可能增加MAC
。对于1x1
卷积,设分组数为g
,则FLOPs
数为 ,内存访问量为 当 时, 最小。因此 MAC 随着 g 的增加而增加。 - 准则三:网络分支会降低并行度。虽然网络中采用分支(如
Inception
系列、ResNet
系列)有利于提高模型的准确率,但是它对GPU
等具有高并行计算能力的设备不友好,因此会降低计算效率。另外它还带来了卷积核的lauching
以及计算的同步等问题,这也是推断时间的开销。 - 准则四:不能忽视元素级操作的影响。元素级操作包括
ReLU、AddTensor、AddBias
等,它们的FLOPs
很小但是MAC
很大。在ResNet
中,实验发现如果去掉ReLU
和旁路连接,则在GPU
和ARM
上大约有 20% 的推断速度的提升。
9.3.2.2 ShuffleNet V2 block
ShuffleNet V1 block
的分组卷积违反了准则二,1x1
卷积违反了准则一,旁路连接的元素级加法违反了准则四。而ShuffleNet V2 block
修正了这些违背的地方。ShuffleNet V2 block
在ShuffleNet V1 block
的基础上修改。(a),(b)
表示ShuffleNet V1 block
(步长分别为1、2),(c),(d)
表示ShuffleNet V2 block
(步长分别为1、2)。其中GConv
表示分组卷积,DWConv
表示depthwise
卷积。- 当步长为1 时,
ShuffleNet V2 block
首先将输入feature map
沿着通道进行拆分。设输入通道数为 ,则拆分为 和 。 - 根据准则三,左路分支保持不变,右路分支执行各种卷积操作。
- 根据准则一,右路的三个卷积操作都保持通道数不变。
- 根据准则二,右路的两个
1x1
卷积不再是分组卷积,而是标准的卷积操作。因为分组已经由通道拆分操作执行了。 - 根据准则四,左右两路的
featuremap
不再执行相加,而是执行特征拼接。可以将Concat、Channel Shuffle、Channel Split
融合到一个element-wise
操作中,这可以进一步降低element-wise
的操作数量。 - 当步长为2时,
ShuffleNet V2 block
不再拆分通道,因为通道数量需要翻倍从而保证模型的有效容量。 - 在执行通道
Concat
之后再进行通道混洗,这一点也与ShuffleNet V1 block
不同。
9.3.2.3 网络性能
ShuffleNet V2
的网络结构类似ShuffleNet V1
,主要有两个不同:用 ShuffleNet v2 block
代替ShuffleNet v1 block
。在 Global Pool
之前加入一个1x1
卷积。ShuffleNet V2
可以结合SENet
的思想,也可以增加层数从而由小网络变身为大网络。下表为几个模型在ImageNet
验证集上的表现(single-crop
)。
3.ShuffleNet V2
和其它模型的比较:根据计算复杂度分成 40,140,300,500+
等四组,单位:MFLOPs
。准确率指标为模型在 ImageNet
验证集上的表现(single-crop
)。GPU
上的batchsize=8
,ARM
上的batchsize=1
。默认图片尺寸为 224x224
,标记为*
的图片尺寸为160x160
,标记为**
的图片尺寸为192x192
。
4.ShuffleNet V2
准确率更高。有两个原因:但是
ShuffleNet v2 block
在特征Concat
之后又执行通道混洗,这又不同于DenseNet
。ShuffleNet V2 block
的构建效率更高,因此可以使用更多的通道从而提升模型的容量。- 在每个
ShuffleNet V2 block
,有一半通道的数据( )直接进入下一层。这可以视作某种特征重用,类似于DenseNet
。
9.4 IGCV 系列
- 设计小型化网络目前有两个代表性的方向,并且都取得了成功:
通过一系列低秩卷积核(其中间输出采用非线性激活函数)去组合成一个线性卷积核或者非线性卷积核。如用 1x3 +3x1
卷积去替代3x3
卷积 。使用一系列稀疏卷积核去组成一个密集卷积核。如:交错卷积中采用一系列分组卷积去替代一个密集卷积。
9.4.1 IGCV
- 简化神经网络结构的一个主要方法是消除结构里的冗余。目前大家都认为现在深度神经网络结构里有很强的冗余性。冗余可能来自与两个地方:
IGCV
通过研究卷积核通道方向的冗余,从而减少网络的冗余性。 卷积核空间方向的冗余。通过小卷积核替代(如,采用 3x3
、1x3
、3x1
卷积核)可以降低这种冗余。卷积核通道方向的冗余。通过分组卷积、 depth-wise
卷积可以降低这种冗余。- 事实上解决冗余性的方法有多种:除了将卷积核进行二元化或者整数化之外,也可以将
feature map
进行二元化/整数化。 - 卷积核低秩分解:将大卷积核分解为两个小卷积核 ,如:将
100x100
分解为100x10
和10x100
、将5x5
分解为两个3x3
。 - 稀疏卷积分解:将一个密集的卷积核分解为多个稀疏卷积核。如分组卷积、
depth-wise
卷积。 - 二元化:将卷积核变成二值的
-1
和+1
,此时卷积运算的乘加
操作变成了加减
操作。这样计算量就下降很多,存储需求也降低很多(模型变小)。 - 浮点数转整数:将卷积核的
32
位浮点数转换成16
位整数。此时存储需求会下降(模型变小)。
9.4.1.1 IGCV block
IGCV
提出了一种交错卷积模块,每个模块由相连的两层分组卷积组成,分别称作第一层分组卷积primary group conv
、第二层分组卷积secondary group conv
。- 第一层分组卷积采用
3x3
分组卷积,主要用于处理空间相关性;第二层分组卷积采用1x1
分组卷积,主要用于处理通道相关性。 - 每层分组卷积的每个组内执行的都是标准的卷积,而不是
depth-wise
卷积。 - 这两层分组卷积的分组是交错进行的。假设第一层分组卷积有
L
个分组、每个分组M
个通道,则第二层分组卷积有M
个分组、每个分组L
个通道。 - 第一层分组卷积中,同一个分组的不同通道会进入到第二层分组卷积的不同分组中。第二层分组卷积中,同一个分组的不同通道来自于第一层分组卷积的不同分组。
- 这两层分组卷积是互补的、交错的,因此称作交错卷积
Interleaved Group Convolution:IGCV
。 - 这种严格意义上的互补需要对每层分组卷积的输出
feature map
根据通道数重新排列Permutation
。这不等于混洗,因为混洗不能保证严格意义上的通道互补。 - 由于分组卷积等价于稀疏卷积核的常规卷积,该稀疏卷积核是
block-diagonal
(即:只有对角线的块上有非零,其它位置均为 0 )。因此IGCV
块等价于一个密集卷积,该密集卷积的卷积核由两个稀疏的、互补的卷积核相乘得到。 - 假设第一层分组卷积的卷积核尺寸为 ,则
IGCV
块的参数数量为:令 G=LM 为IGCV
块 的输入feature map
通道数量,则 。对于常规卷积,假设卷积核的尺寸为 ,输入输出通道数均为 C,则参数数量为: 。当参数数量相等,即 时,则有: 。当 时,有 。通常选择 ,考虑到 ,因此该不等式几乎总是成立。于是IGCV
块总是比同样参数数量的常规卷积块更宽(即:通道数更多)。 - 在相同参数数量/计算量的条件下,
IGCV
块(除了L=1
的极端情况)比常规卷积更宽,因此IGCV
块更高效。 - 采用
IGCV
块堆叠而成的IGCV
网络在同样参数数量/计算量的条件下,预测能力更强。 Xception
块、带有加法融合的分组卷积块都是IGCV
块的特殊情况。- 当
M=1
,L
等于IGCV
块输入feature map
的输入通道数时,IGCV
块退化为Xception
块。 - 当
L=1
,M
等于IGCV
块输入feature map
的输入通道数时,IGCV
块退化为采用Summation
融合的Deeply-Fused Nets block
。
9.4.1.2 网络性能
IGCV
网络结构如下表所示,其中:RegConv-Wc
表示常规卷积,W
表示卷积核的尺寸为WxW
,c
表示通道数量;Summation
表示加法融合层(即常规的1x1
卷积,而不是1x1
分组卷积)。在 IGCV
块之后紧跟BN
和ReLU
,即结构为:IGC block+BN+ReLU
。4x(3x3,8)
表示分成4组,每组的卷积核尺寸为3x3
输出通道数为 8 。网络主要包含3个 stage
,B
表示每个stage
的块的数量。某些 stage
的输出通道数翻倍(对应于Output size
减半),此时该stage
的最后一个block
的步长为2(即该block
中的3x3
卷积的步长为2) 。IGCV
网络的模型复杂度如下所示。SumFusion
的参数和计算复杂度类似RegConv-W16
,因此没有给出。
3.IGCV
模型在CIFAR-10
和 CIFAR-100
上的表现:- 如果增加恒等映射,则结果为:
- 所有的模型比较:
4.IGCV
模型在ImageNet
上的表现:(输入224x224
,验证集,single-crop
)5.超参数
L
和 M
的选取:通过
IGCV
在CIFAR100
上的表现可以发现:L
占据统治地位,随着 L 的增加模型准确率先上升到最大值然后缓缓下降。9.4.2 IGCV2
IGCV2 block
的主要设计思想是:将IGCV block
两个结构化的稀疏卷积核组成的交错卷积推广到更多个结构化的稀疏卷积核组成的交错卷积,从而进一步消除冗余性。
9.4.2.1 IGCV2 block
- 假设输入
feature map
的通道数为 ,卷积核尺寸为 ,输出通道数为 。考虑输入feature map
的一个patch
(对应卷积核大小),该patch
经过卷积之后的结果为: 。其中 是一个长度为 的向量, 是一个长度为 的向量, 是一个 行、 列的矩阵。其中 至少有一个为块稀疏block-wise sparse
矩阵; 为置换矩阵,用于重新调整通道顺序; 为一个密集矩阵。其中 表示第 i 层分组卷积的卷积核,它是一个block-wise sparse
的矩阵,其中第 j 组的卷积核矩阵为 。 对于 IGCV1
, 令 为第 i 层分组卷积的分组数,则:Xception、deep roots、IGCV1
的思想是:将卷积核 分解为多个稀疏卷积的乘积:IGCV2
不是将 分解为 2个block-wise sparse
矩阵的乘积(不考虑置换矩阵),而是进一步分解为 L 个块稀疏矩阵的乘积:其中 为块稀疏矩阵,它对应于第 l 层分组卷积,即:IGCV2
包含了 L 层分组卷积; 为置换矩阵。为了设计简单,第 l 层分组卷积中,每个分组的通道数都相等,设为 K_l 。 如下所示为一个 IGCV2 block
。实线表示权重 ,虚线表示置换 ,加粗的线表示产生某个输出通道(灰色的那个通道)的路径。
9.4.2.2 互补条件 & 平衡条件
- 事实上并不是所有的 L 个块稀疏矩阵的乘积一定就是密集矩阵,这其中要满足一定的条件,即互补条件
complementary condition
。互补条件用于保证:每个输出通道,有且仅有一条路径,该路径将所有输入通道与该输出通道相连。 - 要满足互补条件,则有以下准则:对于任意 m , 等价于一层分组卷积,且 也等价于一层分组卷积。且这两层分组卷积是互补的:第一层分组卷积中,同一个分组的不同通道会进入到第二层分组卷积的不同分组中;第二层分组卷积中,同一个分组的不同通道来自于第一层分组卷积的不同分组。
其物理意义为:从任意位置 m 截断,则前面一半等价于一层分组卷积,后面一半也等价于一层分组卷积。 可以证明 IGCV2 block
满足这种互补条件。- 假设
IGCV2 block
的输入通道数为 C ,输出通道数也为 C ,其L
层分组卷积中第 l 层分组卷积每组卷积的输入通道数为 。现在考虑 需要满足的约束条件。对于IGCV2 block
的某个输入通道,考虑它能影响多少个IGCV2 block
的输出通道。 - 设该输入通道影响了第 l 层分组卷积的 个输出通道。因为互补条件的限制,这 个通道在第 层进入不同的分组,因此分别归属于 组。而每个分组影响了 个输出通道,因此有递归公式:
- 考虑初始条件,在第
1
层分组卷积有: 。则最终该输入通道能够影响IGCV2 block
的输出通道的数量为: 。 - 由于互补条件的限制:每个输出通道,有且仅有一条路径,该路径将所有输入通道与该输出通道相连。因此每个输入通道必须能够影响所有的输出通道。因此有: 。
- 考虑仅仅使用尺寸为
1x1
和WxH
的卷积核。由于1x1
卷积核的参数数量更少,因此L
层分组卷积中使用1层尺寸为WxH
的卷积核、L-1
层尺寸为1x1
卷积核。 - 假设第1层为
WxH
卷积核,后续层都是1x1
卷积核,则总的参数数量为: 。 - 第一项来自于
1x1
分组卷积。对于第 层的分组卷积,输入通道数为 C、分组数为 、输出通道数为 C 。则参数数量为: 。 - 第二项来自于
WxH
分组卷积。参数数量为: 。 - 根据互补条件 ,以及
Jensen
不等式有:, 等式成立时 。这称作平衡条件balance condition
。 - 考虑选择使得 Q 最小的 L。根据则有: 。
- 当
Block
的输出feature map
尺寸相对于输入feature map
尺寸减半(同时也意味着通道数翻倍)时,Block
的输出通道数不等于输入通道数。设输入通道数为 ,输出通道数为 ,则有: - 互补条件: 。
- 平衡条件:设
feature map
的尺寸缩减发生在3x3
卷积,则后续所有的1x1
卷积的输入通道数为 、输出通道数也为 。 - 对于第 l>=2 层的分组卷积,参数数量为: 。
- 对于第1层分组卷积,参数数量为: ,其中 为分组数量。则总的参数数量为:。等式成立时有:
- 选择使得 Q 最小的 L 有: 。因此对于
feature map
尺寸发生缩减的IGCV2 Block
,互补条件&平衡条件仍然成立,只需要将 C 替换为输出通道数。
9.4.2.3网络性能
IGCV2
网络结构如下表所示:其中 x 为网络第一层的输出通道数量,也就是后面block
的输入通道数 C。- 网络主要包含3个
stage
,B
表示每个stage
的块的数量。 - 某些
stage
的输出通道数翻倍,此时该stage
的最后一个block
的步长为2(即该block
中的3x3
卷积的步长为2) 。 - 每2个
block
添加一个旁路连接,类似ResNet
。即在 这种结构添加旁路连接。 - 表示输入通道数为 x 的
3x3
卷积。 表示输出通道数为 x 的1x1
卷积。 - L 和 K 为
IGCV2
的超参数。 表示有 L-1 层分组卷积,每个组都是 K 个输入通道的1x1
卷积。事实上IGCV2
每个stage
都是L
层,只是第一层的分组数为 1 。 对于 IGCV2(Cx)
,L=3 ;对于IGCV2*(Cx)
, 。IGCV2*
的(3x3,64)
应该修改为 。
2.通过一个简化版的、没有
feature map
尺寸缩减(这意味着IGCV2 Block
的输入、输出通道数保持不变 )的IGCV2
网络来研究一些超参数的限制:IGCV2 block
最接近互补条件限制条件 时,表现最好。如下所示,红色表示互补条件限制满足条件最好的情况。其中匹配程度通过 来衡量。IGCV2 block
的 L 最佳的情况是:网络的宽度(通过C 刻画)和稀疏性达到平衡,如下所示。- 下图中,每一种 L 都选择了对应的
Width
(即 C )使得其满足互补条件限制,以及平衡条件,从而使得参数保持相同。 Non-sparsity
指的是IGCV2 block
等效的密集矩阵中非零元素的比例。IGCV2
网络越深越好、越宽越好,但是加宽网络比加深网络性价比更高。如下图所示:采用IGCV2*
,深度用D
表示、宽度用C
表示。
3.IGCV2
网络与不同网络比较:4.IGCV2
网络与MobileNet
的比较:(ImageNet
)9.4.3 IGCV3
IGCV3
结合了块稀疏的卷积核(如:交错卷积) 和低秩的卷积核(如:bottleneck
模块),并放松了互补条件。
9.4.3.1 IGCV3 block
IGCV3
的block
修改自IGCV2 block
,它将IGCV2 block
的分组卷积替换为低秩的分组卷积。按照IGCV2
的描述方式,输入feature map
的一个patch
,经过IGCV3 block
之后的结果为:其中 为低秩的块稀疏矩阵; 为置换矩阵,用于重新调整通道顺序 。
首先对输入 feature map
进行分组,然后在每个分组中执行1x1
卷积来扩张通道数。然后执行常规分组卷积,并对结果进行通道重排列。 最后执行分组卷积,在每个分组中执行 1x1
卷积来恢复通道数,并对结果进行通道重排。
2.下图分别展示了
IGCV1 block
、Inverted
残差块、IGCV3 block
的区别。每个圆圈代表一个通道,箭头代表通道的数据流动。IGCV1
块中,两层分组卷积的卷积核都是稀疏的;在Inverted
残差块中,两层1x1
卷积的卷积核都是低秩的;在IGCV3
块中,两层1x1
卷积的卷积核是稀疏的,也都是低秩的。3.设
IGCV3 block
第一层分组卷积(1x1
分组扩张卷积) 的分组数量为 ;第二层分组卷积(普通分组卷积)的分组数不变,也是 ;第三层分组卷积(1x1
分组压缩卷积)的分组数量为 。则 是非常重要的超参数。9.4.3.2 loose 互补条件
- 实验中发现:如果
IGCV3 block
如果严格遵守互补条件会导致卷积核过于稀疏,从而导致更大的内存消耗而没有带来准确率的提升。因此IGCV3 block
提出了宽松互补条件loose complementary condition
,从而允许输入通道到输出通道存在多条路径。 - 在
IGCV3 block
中定义了超级通道Super-Channel
,设为 。在一个IGCV3 block
中,每个feature map
都具有同等数量的Super-Channel
。 输入 feature map
的通道数假设为 C ,因此每个输入超级通道包含 条普通的输入通道。经过 1x1
分组卷积扩张的输出通道数假设为 ,则这里的每个超级通道包含 条普通的通道。经过常规分组卷积的输出通道数也是 ,则这里的每个超级通道也包含 条普通的通道。 最后经过 1x1
分组卷积压缩的输出通道数也是 C,因此每个输出超级通道包含 条普通的输出通道。loose complementary condition
:第一层分组卷积中,同一个分组的不同超级通道会进入到第三层分组卷积的不同分组中;第三层分组卷积中,同一个分组的不同超级通道来自于第一层分组卷积的不同分组。由于超级通道中可能包含多个普通通道,因此输入通道到输出通道存在多条路径。- 通常设置 ,即:超级通道数量等于输入通道数量。则每条超级通道包含的普通通道数量依次为:{1,expand,expand,1},其中 expand 表示
1x1
分组卷积的通道扩张比例。也可以将 设置为一个超参数,其取值越小,则互补条件放松的越厉害(即:输入通道到输出通道存在路径的数量越多)。
9.4.3.3 网络性能
IGCV3
网络通过叠加IGCV3 block
而成。因为论文中的对照实验是在网络参数数量差不多相同的条件下进行。为了保证IGCV3
网络与IGCV1/2,MobileNet,ShuffleNet
等网络的参数数量相同,需要加深或者加宽IGCV3
网络。论文中作者展示了两个版本:网络更宽的版本,深度与对比的网络相等的同时,加宽网络的宽度,记做 IGCV3-W
。参数为: 。网络更深的版本,宽度与对比的网络相等的同时,加深网络的深度,记做 IGCV3-D
。参数为:。IGCV3
与IGCV1/2
的对比:IGCV3
降低了参数冗余度,因此在相同的参数的条件下,其网络可以更深或者更宽,因此拥有比IGCV1/2
更好的准确率。
3.IGCV3
和其它网络的在ImageNet
上的对比:MAdds
用于刻画网络的计算量,单位是百万乘-加运算
。中的 表示宽度乘子,它大概以 的比例减少了参数数量,降低了计算量。
4.更深的
IGCV
网络和更宽的IGCV
网络的比较:更深的网络带来的效果更好,这与人们一直以来追求网络的 深度
的理念相一致。在宽度方向有冗余性,因此进一步增加网络宽度并不会带来额外的收益。
5.ReLU
的位置比较:第一个
IGCV3 block
的ReLU
位置在两个1x1
卷积之后;第二个IGCV3 block
的ReLU
位置在3x3
卷积之后;第三个IGCV3 block
的 ReLU
在整个block
之后(这等价于一个常规卷积+ReLU
)。6.超参数 的比较:
- 只要 都是输入、输出通道数的公约数时,
loose
互补条件就能满足,因此存在 的很多选择。 - 实验发现, 比较小、 比较大时网络预测能力较好。但是这里的
IGCV3
网络采用的是同样的网络深度、宽度。如果采用同样的网络参数数量,则 可以产生一个更深的、准确率更高的网络。
9.5 CondenseNet
CondenseNet
基于DenseNet
网络,它在训练的过程中自动学习一个稀疏的网络从而减少了Densenet
的冗余性。这种稀疏性类似于分组卷积,但是CondenseNet
从数据中自动学到分组,而不是由人工硬性规定分组。CondenseNet
网络在GPU
上具有高效的训练速度,在移动设备上具有高效的推断速度。MobileNet、ShuffleNet、NASNet
都采用了深度可分离卷积,这种卷积在大多数深度学习库中没有实现。而CondenseNet
采用分组卷积,这种卷积被大多数深度学习库很好的支持。
- 准确的说,
CondenseNet
在测试阶段采用分组卷积,在训练阶段采用的是常规卷积。
9.5.1 网络剪枝
- 有一些工作(
Compressing neural networks with the hashing trick
、Deep networks with stochastic depth
)表明:CNN
网络中存在大量的冗余。DenseNet
通过直接连接每个层的输出特征与之后的所有层来特征重用。但是如果该层的输出特征是冗余的或者不需要的,则这些连接会带来冗余。 CNN
网络可以通过权重剪枝从而在不牺牲模型准确率的条件下实现小型化。有不同粒度的剪枝技术:独立的权重剪枝:一种细粒度的剪枝,它可以带来高度稀疏的网络。但是它需要存储大量的索引来记录哪些连接被剪掉,并且依赖特定的硬件/软件设施。 filter
级别剪枝:一种粗粒度的剪枝,它得到更规则的网络,且易于实现。但是它带来的网络稀疏性较低。CondenseNet
也可以认为是一种网络剪枝技术,它与以上的剪枝方法都不同:CondenseNet
的网络剪枝发生、且仅仅发生在训练的早期。这比在网络整个训练过程中都采用L1
正则化来获取稀疏权重更高效。CondenseNet
的网络剪枝能产生比filter
级别剪枝更高的网络稀疏性,而且网络结构也是规则的、易于实现的。
9.5.2 LGC
- 分组卷积在很多
CNN
网络中大量使用。在DenseNet
中,可以使用3x3
分组卷积来代替常规的3x3
卷积从而减小模型大小,同时保持模型的准确率下降不大。但是实验表明:在DenseNet
中,1x1
分组卷积代替1x1
常规卷积时,会带来模型准确率的剧烈下降。对于一个具有 L 层的DenseNet Block
,1x1
卷积是第 层的第一个操作。该卷积的输入是由当前DenseNet Block
内第 层输出feature map
组成。因此采用1x1
分组卷积带来准确率剧烈下降的原因可能有两个:因此将这些输出feature
强制性的、固定的分配到不相交的分组里会影响特征重用。 第 层输出 feature
具有内在的顺序,难以决策哪些feature
应该位于同一组、哪些feature
应该位于不同组。这些输出 feature
多样性较强,缺少任何一些feature
都会减小模型的表达能力。- 一种解决方案是:在
1x1
卷积之前,先对1x1
卷积操作的输入特征进行随机排列。这个策略会缓解模型准确率的下降,但是并不推荐。因为可以采用模型更小的DenseNet
网络达到同样的准确率,而且二者计算代价相同。与之相比,特征混洗+1x1分组卷积
的方案并没有任何优势。 - 另一种解决方案是:通过训练来自动学习出
feature
的分组。考虑到第 层输出feature
中,很难预测哪些feature
对于第 l 层有用,也很难预先对这些feature
执行合适的分组。因此通过训练数据来学习这种分组是合理的方案。这就是学习的分组卷积Learned Group Convolution:LGC
。 - 在
LGC
中: - 卷积操作被分为多组
filter
,每个组都会自主选择最相关的一批feature
作为输入。由于这组filter
都采用同样的一批feature
作为输入,因此就构成了分组卷积。 - 允许某个
feature
被多个分组共享(如下图中的Input Feature 5、12
),也允许某个feature
被所有的分组忽略(如下图中的Input Feature 2、4
)。 - 即使某个
feature
被第 l 层1x1
卷积操作的所有分组忽略,它也可能被第 l+1 层1x1
卷积操作的分组用到。
9.5.3 训练和测试
CondenseNet
的训练、测试与常规网络不同。CondenseNet
的训练是一个多阶段的过程,分为浓缩阶段和优化阶段。- 浓缩阶段
condensing stage
:训练的前半部分为浓缩阶段,可以有多个condensing stage
(如下图所示有2个浓缩阶段)。每个condensing stage
重复训练网络一个固定的iteration
,并在训练过程中:引入可以产生稀疏性的正则化、裁剪掉权重幅度较小的filter
。 - 优化阶段
optimization stage
:训练的后半部分为优化阶段,只有一个optimization stage
。在这个阶段,网络的1x1
卷积的分组已经固定,此阶段在给定分组的条件下继续学习1x1
分组卷积。 CondenseNet
的测试需要重新排列裁剪后的filter
,使其重新组织成分组卷积的形式。因为分组卷积可以更高效的实现,并且节省大量计算。- 通常所有的浓缩阶段和所有的优化阶段采取
1:1
的训练epoch
分配。假设需要训练 M 个epoch
,有N 个浓缩阶段,则: - 所有的浓缩阶段消耗 个
epoch
,每个浓缩阶段消耗 个epoch
。 - 所有的优化阶段也消耗 个
epoch
。 - 假设卷积核的尺寸为 ,输入通道数为 ,输出通道数为 。当采用
1x1
卷积核时4D
的核张量退化为一个矩阵,假设该矩阵表示为 。将该矩阵按行(即输出通道数)划分为同样大小的 G 个组,对应的权重为: 。其中 对应第 g 个分组的第i 个输出特征(对应于整体的第 个输出特征)和整体的第 j 个输入特征的权重。 CondenseNet
在训练阶段对每个分组筛选出对其不太重要的特征子集。对于第 g 个分组,第 j 个输入特征的重要性由该特征在 g分组所有输出上的权重的绝对值均值来刻画: 。如果 相对较小,则删除输入特征 j ,这就产生了稀疏性。- 为了缓解权重裁剪带来的准确率损失,这里引入
L1
正则化。因为L1
正则化可以得到更稀疏的解,从而使得删除 相对较小的连接带来的准确率损失较小(因为这些权重大多数为0 或者很小的值)。CondenseNet
中引入分组L1
正则化group-lasso
: 。这倾向于将 的某一列 整体拉向 0 ,使得产生filter
级别的稀疏性(而不是权重级别的稀疏性)。 - 考虑到
LGC
中,某个feature
可以被多个分组分享,也可以不被任何分组使用,因此一个feature
被某个分组选取的概率不再是 。定义浓缩因子 C,它表示每个分组包含 的输入。 - 如果不经过裁剪,则每个分组包含 C_I 个输入;经过裁剪之后,最终保留 比例的输入。
filter
裁剪融合于训练过程中。给定浓缩因子 C,则CondenseNet
包含 C-1 个condensing stage
(如上图中,C=3 )。在每个condensing stage
结束时,每个分组裁剪掉整体输入 比例的输入。经过 C-1 个condensing stage
之后,网络的每个分组仅仅保留 的输入。- 在每个
condensing stage
结束前后,training loss
都会突然上升然后下降。这是因为权重裁剪带来的突变。最后一个浓缩阶段突变的最厉害,因为此时每个分组会损失50%
的权重。但是随后的优化阶段会逐渐降低training loss
。下图中,学习率采用cosine
学习率。
5.训练完成之后,
CondenseNet
引入index layer
来重新排列权重裁剪之后剩下的连接,使其成为一个1x1
分组卷积。下图中:左图为标准的
DenseNet Block
,中间为训练期间的CondenseNet Block
,右图为测试期间的CondenseNet Block
。训练时, 1x1
卷积是一个LGC
。测试时, 1x1
卷积是一个index layer
加一个1x1
分组卷积。
6.在训练早期就裁剪了一些权重,而裁剪的原则是根据权重的大小。因此存在一个问题:裁剪的权重是否仅仅因为它们是用较小的值初始化?
论文通过实验证明网络的权重裁剪与权重初始化无关。
9.5.4 IGR 和 FDC
CondenseNet
对DenseNet
做了两个修改:- 递增的学习率
increasing growth rate:IGR
:原始的DenseNet
对所有的DenseNet Block
使用相同的增长率。考虑到DenseNet
更深的层更多的依赖high-level
特征而不是low-level
特征,因此可以考虑使用递增的增长率,如指数增长的增长率: ,其中 m 为Block
编号。该策略会增加模型的参数,降低网络参数的效率,但是会大大提高计算效率。 - 全面的连接
fully dense connectivity:FDC
:原始的DenseNet
中只有DenseNet Block
内部的层之间才存在连接。在CondenseNet
中,将每层的输出连接到后续所有层的输入,无论是否在同一个CondenseNet Block
中。如果有不同的feature map
尺寸,则使用池化操作来降低分辨率。 - 对
LGC、LGR、FDC
的实验分析如下:(CIFAR-10
数据集) - 配置:默认 k=12,
3x3
卷积为分组数量为4的分组卷积。 LGC:learned group convolution
:C=4
,1x1
卷积为LGC
。IGR:exponentially increasing learning rate
: 。FDC:fully dense conectivity
。- 相邻两条线之间的
gap
表示对应策略的增益。 - 第二条线和第一条线之间的
gap
表示IGC
的增益。 - 第三条线和第二条线之间的
gap
表示IGR
的增益。 - 第四条线和第三条线之间的
gap
表示FDC
的增益。FDC
看起来增益不大,但是如果模型更大,根据现有曲线的趋势FDC
会起到效果。
9.5.5 网络性能
CondenseNet
与其它网络的比较:(*
表示使用cosine
学习率训练 600个 epoch)
2.CondenseNet
与其它裁剪技术的比较:3.CondenseNet
的超参数的实验:(CIFAR-10
,DenseNet-50
为基准)- 裁剪策略:(
G=4
) Full Model
:不进行任何裁剪。Traditional Pruning
:在训练阶段(300个epoch)完成时执行裁剪(因此只裁剪一次),裁剪方法与LGC
一样。然后使用额外的300个 epoch 进行微调。- 分组数量:(
C=8
) - 这里的分组值得是
3x3
分组卷积的分组数量。 - 随着分组数量的增加,测试误差逐渐降低。这表明
LGC
可以降低网络的冗余性。 - 浓缩因子:(
G=4
) 可以看到: 可以带来更好的效益;但是 C>1 时,网络的准确率和网络的FLOPs
呈现同一个函数关系。这表明裁剪网络权重会带来更小的模型,但是也会导致一定的准确率损失。
4.在
ImageNet
上的比较:- 网络结构:为了降低参数,在
epoch 60
时(一共120
个epoch
)裁剪了全连接层FC layer
50% 的权重。思想与1x1
卷积的LGC
相同,只是 G=1,C=2 。 CondenseNet
与其它网络的比较:- 网络在
ARM
处理器上的推断时间(输入尺寸为224x224
):
本文福利
可以在本公众号后台回复关键词:“DS”获取大量由我平台编辑精心整理的学习资料,如果觉得有用,请勿吝啬你的留言和赞哦!
——完——
文章须知
文章作者:华校专
责任编辑:周岩Logic破茧
审核编辑:阿春
微信编辑:破茧
本文由『运筹OR帷幄』原创发布
如需转载请在公众号后台获取转载须知
原文链接:http://www.huaxiaozhuan.com/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/chapters/5_CNN_1_classfication.html
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。