Reading

轻量级网络系列

Introduction

Inception

在最初的版本 Inception/GoogleNet,其核心思想是利用多尺寸卷积核去观察输入数据。举个栗子,我们看某个景象由于远近不同,同一个物体的大小也会有所不同,那么不同尺度的卷积核观察的特征就会有这样的效果。于是就有了如下的网络结构图:

image

于是我们的网络就变胖了,通过增加网络的宽度,提高了对于不同尺度的适应程度。但这样的话,计算量有点大了。

Point-wise Conv

为了减少在上面结构的参数量并降低计算量,于是在 Inception V1 的基础版本上加上了 \(1\times 1\) 卷积核,这就形成了 Inception V1 的最终网络结构,如下图。

image

这个 \(1\times1 \)卷积就是 Pointwise Convolution,简称 PW。利用它的目的主要是为了减少维度,还用于引入更多的非线性。

我们来简单计算下:假定上一层输出的 feature map 维度为 \(100\times 100 \times 128\),经过256个大小为 \(5\times5 \)的卷积后,输出的 feature map 大小为 \(100\times 100\times 256\)。这里卷积参数为 \(256∗5∗5∗128=819,200\)。而假如上一层的输出先经过 32 个大小为 \(1\times 1 \)的卷积后,再经过256个大小为 \(5\times 5\) 的卷积,那么输出维度保持不变的情况下,卷积参数减少为 \(128∗1∗1∗32 + 32∗5∗5∗256=204,800\),降低为原来的 \(204800/819200=1/4\)

PW 主要用于数据降维,减少参数量。也有使用 PW 做升维的,在 MobileNet v2 中就使用 PW 将 feature map 的宽度扩张了6倍,丰富输入数据的特征。

Kernel Replace

Inception V2 和 V3 版本为了进一步降低卷积参数采用小卷积来替换大卷积,同 VGG 套路。

image

大尺寸的卷积核可以带来更大的感受野,但也意味着会产生更多的参数,比如 \(5\times 5\) 卷积核的参数有 25 个,\(3\times 3\) 卷积核的参数有 9 个,前者是后者的 \(25/9=2.78\) 倍。因此,GoogLeNet 团队提出可以用 2 个连续的 \(3\times 3\) 卷积层组成的小网络来代替单个的 \(5\times 5\) 卷积层,即在保持感受野范围的同时又减少了参数量。除了规整的的正方形,还有分解版本的 \(3\times 3 = 3\times 1 + 1\times 3\),这个效果在深度较深的情况下比规整的卷积核更好(feature map 大小建议在 12 到 20 之间)。

Feature Map Downsample

一般情况下,如果想让图像缩小,可以有如下两种方式:

image

先 pooling 再作 Inception 卷积,或者先作 Inception 卷积再作 Pooling。前者先作 Pooling 会导致特征缺失遇到 bottleneck,后者则相对来说计算量更大。为了同时保持特征表示且降低计算量,将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)。

image

Bottleneck

Bottleneck 三步走:先 PW 对数据进行降维,再进行常规卷积,最后 PW 对数据进行升维,形如沙漏。

image

这就是所谓的 Bottleneck 结构,上图中后者的计算量 \(256∗1∗1∗64+64∗3∗3∗64+64∗1∗1∗256=69,632\) 远小于前者\( 256∗3∗3∗256=589,824\)

Inception + ResNet

image

Group Conv Depthwise Separable Conv

Group Convolution 分组卷积,最早见于AlexNet,当时受限于硬件,Group Convolution被用来切分网络,使其在2个GPU上并行运行。

让我们先来回顾下常规卷积。对于输入为 \(𝐼\times 𝐻\times 𝑊\) 大小的 Input Features,经过 \(𝑂\) 个 \(𝐾\times 𝐾\times 𝐼 \)大小的卷积核后,输出 Output Features 的通道数也是 \(𝑂\)。这里的卷积参数量为 \(𝑂∗𝐾∗𝐾∗𝐼\),输入和输出 map 的连接方式如下图左所示,输出的每个通道都和输入的所有通道相关联:

image

Group Conv 顾名思义,则是对输入 feature map 进行分组,然后每组分别卷积。假设输入 feature map 的尺寸仍为\(𝐼\times 𝐻\times 𝑊\),输出 Output Features 的通道数也是 \(𝑂\),如果设定要分成 \(𝐺\) 个 groups,则每组的输入 feature map 数量为 \(\frac{I}{G}\),每组的输出 feature map 的数量为 \(\frac{𝑂}{𝐺}\),每个卷积核的尺寸为 \(𝐾\times 𝐾\times \frac{𝐼}{𝐺}\),每组的卷积核数量为 \(\frac{O}{𝐺}\),卷积核的总数仍为 \(𝑂\) 个,卷积核只与其同组的输入 map 进行卷积,卷积核的总参数量为 \(𝑂∗𝐾∗𝐾∗\frac{𝐼}{𝐺}\),可见,总参数量减少为原来的 \(\frac{1}{𝐺}\),其连接方式如上图右所示,group1 输出 map 数为 2,有 2 个卷积核,每个卷积核的 channel 数为 4,与 group1 的输入 map 的 channel 数相同,卷积核只与同组的输入 map 卷积,而不与其他组的输入 map 卷积。

Group Conv 的用途包括:

  • 减少参数数量,分成 \(G\)组,则该层的参数量减少为原来的\(\frac{1}{G}\)
  • Group Conv 可以看成是一种 structured sparse,每个卷积核的尺寸由 \(K\times K\times I\) 变成了\(K\times K\times \frac{I}{G}\),这里可以将其余的 \(1-K\times K\times \frac{I}{G}\) 维的参数视为 0。实际中,Group Conv 在减少参数量的同时有可能获得更好的效果(相当于正则)。

Depthwise Convolution 其实是 Group Conv 的一种特例,简称 DW。当分组数量等于输入 map 数量,输出 map 数量也等于输入 map 数量,即 \(𝐺=𝑂=𝐼\)\(𝑂\) 个卷积核每个尺寸为 \(𝐾\times 𝐾 \times 1\) 时,Group Convolution 就成了Depthwise Convolution。Depthwise Separable Convolution 则是DW+PW 的组合体,如图,参见 Xception 等,参数量进一步缩减。

image

更进一步,如果分组数 \(𝐺=𝑂=𝐼\),同时卷积核的尺寸与输入 map 的尺寸相同,即 \(𝐾=𝐻=𝑊\),则输出 map 为 \(𝐼\times 1\times 1\) 即长度为 \(𝑂\) 的向量,此时称之为 Global Depthwise Convolution (GDC),见 MobileFaceNet,可以看成是全局加权池化,与 Global Average Pooling (GAP) 的不同之处在于,GDC 给每个位置赋予了可学习的权重(对于已对齐的图像这很有效,比如人脸,中心位置和边界位置的权重自然应该不同),而 GAP 每个位置的权重相同,全局取个平均,如下图所示:

image

Xception

Xception 实际上就是从另一个角度来思考 Inception 的网络结构,同时在 Inception 的基础上将 Depthwise Separable Conv 发扬光大了!

The Inception Hypothesis

初始的 Inception V1 结构考虑从多尺度卷积核角度来观察输入数据的特征,Inception V3 则是从参数量和计算量角度来尝试改进。但我们也可以把 Inception V3 结构理解为:通过显式地将操作分解为一系列独立的通道相关性和空间相关性的学习,从而使得学习的过程变得更加简单和高效。具体来说,Inception V1 里各个卷积核需要同时学习空间上的相关性和通道间的相关性,结合了 spatial dimensions 和 channels dimensions;而 Inception V3 结构,先通过一组 \(1\times 1\) PW 卷积来学习通道相关性,将输入数据映射到多个单独的小空间(降维了),然后对于所有这些小空间,通过常规的 \(3×3\) 卷积,\(5×5\) 卷积等来学习空间相关性。因此,Inception 结构背后的基本假设是,通道相关性和空间相关性之间的耦合性已经充分分离,这样的话最好不要将它们联合起来学习。于是便有了 Xception:将通道相关性和空间相关性分开学习的结构设计

Extreme Inception

在 Inception 中,特征可以通过 \(1×1\) 卷积,\(3×3\) 卷积,\(5×5\) 卷积,pooling 等进行提取,Inception 结构将特征类型的选择留给网络自己训练,也就是将一个输入同时输给几种提取特征方式,然后做 concat 。Inception-v3的结构图如下:

image

对 Inception-v3 进行简化,去除 Inception-v3 中的 avg pool 后,输入的下一步操作就都是 \(1×1\) PW 卷积了:

image

再进一步假设,3 个 PW 卷积核统一起来变成共用一个 PW 卷积,后面的三个 \(3\times 3\) 卷积核则分别”负责“一部分通道(Group Conv):

image

最后 Extreme Inception 闪亮登场,对 PW 卷积后的每个channel分别进行 \(3×3\) 卷积操作(Depthwise Conv, DW),最后将结果 concat:

image

作者发现,在 Extreme Inception 模块中,用于学习空间相关性的 \(3×3\) 的 DW 卷积,和用于学习通道间相关性的 \(1×1\) PW 卷积之间,不使用非线性激活函数时,收敛过程更快、准确率更高。

Xception

Xception 常用版本是将 DW 和 PW 交换了个位置:Extreme Inception 先进行 \(1×1\) PW 卷积,再进行 \(3×3\) DW 卷积;Depthwise Separable Conv 先进行 \(3×3\)DW卷积,再进行 \(1×1\) PW 卷积(作者认为这个差异并没有大的影响)。

理论上计算量相比:

\[\begin{aligned} & P_{DW} = I*K*K + I*O \\ & P_{Normal} = I*K*K*O \\ & \frac{P_{DW}}{P_{Normal}} = \frac{1}{O} + \frac{1}{K^2} \approx \frac{1}{K^2} \end{aligned}\]

其中 \(𝐼\) 为输入通道数,\(𝑂\) 是输出通道数,\(𝐾\) 是标准卷积核大小。我们可以看到,当我们使用 \(3\times 3\) 卷积核的时候,参数量约等于标准卷积核的 1/9,大大减少参数量,从而加快训练速度。

MobileNet v1

MobileNet V1 理解起来就是对 Depthwise Separable Convolution 的加强使用。

结构上同 Xception 的区别在于,这里每个卷积之后都有 BN + ReLU 单元,如下图 所示。

image

由于 DW 的计算量较低,因此几乎所有(95% of the computation time and 75% of the parameters)的计算量都集中于密集的 \(1×1\) PW 里。特别的,与训练大型模型相反,这里使用较少的正则化和数据增强技术,因为小型模型的过拟合问题较少。训练策略基本上同 Inception V3,但作者建议较少甚至不使用 weight decay (l2 regularization) 在 DW 中,因为这个层的参数本来就很少了。

文中引入了两个超参数 \(\alpha\) 和 \(\rho\)

  1. \(\alpha\) 是个 width multiplier, 目的是降低 feature map 的宽度(channel)以减少计算复杂度和参数数量(大概\(\alpha^2\))的作用,其取值范围为 (0,1], 其中 \(\alpha =1\) 代表 baseline MobileNet。Table 6 对比了 width multiplier \(\alpha\) 大小对网络性能的影响:
image.png
  1. \(\rho\) 是个 resolution multiplier, 目的是降低 imput image 的尺度以减少计算复杂度(大概\(\rho^2\))和参数数量的作用,其取值范围为 (0,1], 其中 \(\rho =1\) 代表 baseline MobileNet。Table 7 对比了 resolution multipliers \(\rho\) 大小对网络性能的影响:
image.png

MobileNet V2

MobileNet V2 则可以理解为 Depthwise Separable Convolution + ResNet

在最早的 Network in Network 工作中, \(1\times 1\) PW 卷积被作为一个降维的操作而引入,后来逐渐发展为 Depthwise Separable Convolution 并被广泛应用,堪称跟 skip-connection 同样具有影响力的网络部件。在 Inception 单元最初提出之时,认为具有较多 channel 的 feature map 是可以压缩的,作者引入 PW  卷积将它们映射到低维(较少 channel 数)空间上并添加多路径处理的范式。之后的 Xception、MobileNet 等工作则将可分离卷积应用到极致:前者指出可分离卷积背后的假设是跨channel相关性和跨spatial相关性的解耦,后者则利用可控的两个超参来获得在效率和精度上取得较好平衡的网络。

Linear Bottlenecks

文中,经过激活层后的张量被称为兴趣流形,具有维\(H\times W\times D\),其中D即为通常意义的channel数,部分文章也将其称为网络的宽度(width)。

根据之前的研究,兴趣流形可能仅分布在激活空间的一个低维子空间里,利用这一点很容易使用 \(1\times 1\) PW 卷积将张量降维(即 V1的工作),但由于ReLU的存在,这种降维实际上会损失较多的信息。作者做了一个信息重构的实验,实验结论就是:激活函数在高维空间能够有效的增加非线性,而在低维空间时则会造成较大的信息损失。如下图所示:当原始输入维度数增加到 15 以后再加 ReLU,基本不会丢失太多的信息;但如果只把原始输入维度增加至 2∼5后再加 ReLU,则会出现较为严重的信息丢失。因此执行降维的卷积层后面不会接类似于 ReLU 这样的非线性激活层。

image

Depthwise Separable Convolutions

作者通过下图 描述了深度可分离卷积的演化史:

  • (a) 中普通卷积将 channel 和 spatial 信息同时进行映射,参数量较大;
  • (b) 为可分离卷积,解耦了 channel 和 spatial,有一定比例的参数节省;
  • (c) 中进行可分离卷积后又添加了 bottleneck,映射到低维空间中;
  • (d) 则是从低维空间开始,进行可分离卷积时扩张到较高的维度(前后维度之比被称为expansion factor,扩张系数),之后再通过\(1\times 1\)卷积降到原始维度。
image

继续上面信息损耗的话题,深度可分离卷积大大降低参数量的同时也带来了信息损失的风险。V2 采用了 Figure(d) 的类似结构(区别在于最后一层无激活函数),考虑到 DW 卷积的计算特性决定它自己没有改变通道数的能力,因此,给每个 DW 之前都配备了一个 PW,专门用来升维,定义升维系数 \(𝑡=6\),这样不管输入通道数 \(𝐶_{𝑖𝑛}\) 是多是少,经过第一个 PW 升维之后,DW 都是在相对的更高维 (\(𝑡⋅𝐶_{𝑖𝑛}\)) 进行工作的。因此可以发现,V2 结构里每个 Bottleneck 的输入通道都很小,并按照 “扩张 - 变换 - 压缩” 的形式搭建模型。

Inverted Residuals

为了提升网络结构的性能,综合上面的两个改进,作者还引入了 ResNet 结构,构成了作者所说的 Inverted Residual,如 (b) 所示。

image

以前大多数的模型结构加速的工作都停留在压缩网络参数量上。其实这是有误导性的:参数量少不代表计算量小;计算量小不代表理论上速度快(带宽限制)。ResNet 的结构其实对带宽不大友好:旁路的计算量很小,eltwise+ 的特征很大,所以带宽上就比较吃紧。而 Inverted residual 由于 eltwise+ 的特征较小的原因,缓解了这一问题。

image

ResNeXt

ResNeXt 这篇文章看到最后你会发现,原来就是 ResNet + Group Conv 的组合罢了。但是,和 Xception 论文套路一样,作者是经过一步步理论证明了的。

论文一开始采用  VGG stacking 的思想和 Inception 的 split-transform-merge 思想,这里有一个超参数 cardinality (the size of the set of transformations),如图所示:

image

论文中表示增加 cardinality 比增加网络的深度和宽度更有效。随后作者展示了三种相同的 ResNeXt blocks: Figure(a) 被称为 aggregated residual transformations。Figure (b) 采用了两层卷积后 concatenate,再卷积,有点类似 Inception-ResNet,只不过这里的 paths 都是相同的拓扑结构。Figure 15(c) 采用的是 grouped convolutions,这个 group 参数就是 caffe 的 convolusion 层的 group,最后把 channels 合并。作者在文中明确说明这三种结构是严格等价的,并且用这三个结构做出来的结果一模一样,在论文中展示的是 Figure (c) 的结果,因为 Figure (c) 的结构比较简洁而且速度更快。

image

实验中,为了控制网络参数量,作者利用 𝐶(cardinality) 和 𝑑(width of bottleneck) 两个超参数来进行平衡(ResNeXt50_32Cx4d≈ResNet50),这里面 \(𝑤𝑖𝑑𝑡ℎ\ 𝑜𝑓\ 𝑏𝑜𝑡𝑡𝑙𝑒𝑛𝑒𝑐𝑘\ ∗\ 𝑐𝑎𝑟𝑑𝑖𝑛𝑎𝑙𝑖𝑡𝑦=𝑤𝑖𝑑𝑡ℎ\ 𝑜𝑓\ 𝑔𝑟𝑜𝑢𝑝\ 𝑐𝑜𝑛𝑣.\)

ShuffeNet V1

Shuffe units

ShuffleNet V1 可以理解为进一步加强对 Group Conv 和 DW 的使用程度。该论文认为 Xception 里 DW 之后的 PW 计算量太大了,何不也换成 \(1\times 1 \)的 DW 。但是,如果多个 group convolutions 叠加在一起,就会产生一个副作用:某一通道的输出只来自一小部分输入 channels。下图(a) 为两组叠加卷积层的情况。很明显,某个组的输出只与组内的输入相关。这会阻塞通道组之间的信息流并削弱特征表示。

image

如 Figure(b),如果我们让 Group Conv 的输入来自不同的 group(其实 LeNet5 里就是这样的),那么输入和输出通道间信息就可以完全连接起来了。实际操作时有个效率问题,进行每个 group 计算时都要把整个 input feature 加载进来。因此按照图 Figure 34(c),可以事先将输入的 input feature 通过 reshape, transpose and flatten 操作来进行 Channel Shuffle(借鉴了 AlexNet 训练时候的方法),然后计算输出的 feature map 的时候,只要导入需要的输入的 feature map 而不是进行全局索引。

利用 Channel Shuffle 的特性,本文设计了一个 ShuffleNet Unit。基础网络是ResNet-18,如 F(a),这是一个 residual block,第一个 \(1\times 1\) 的 PW 用来降维,后面的 \(3\times 3 \) 是一个 DW,随后跟着一个 \(1\times 1\) 的 PW 升维。我们在设计时,将第一个 \(1\times 1\) 的 PW 替换成 pointwise group conv,随后通过 Channel Shuffle 操作送给 \(3\times 3 \)的 DW,最后一个 pointwise group conv 目的是升维。为了方便,作者没有在第二个 PW layer 后面加上 Channel Shuffle 操作,因为对性能没有提升。其他改动方面,作者没有在 DW 层加上 ReLU。对于 stride=2 的情况下,作者增加了一个 average pooling 和改变了 element wise add 为 concat 操作。

image

虽然 DW 的理论计算量很低,但在实际低功耗硬件上比较难高效实现。因此作者只在 bottleneck feature maps 上使用。

Network Architecture

如 Table 5,完整网络包含 16 个 ShuffleNer units。分为 3 个 stage(stage2∼∼stage4),每个 stage 的第一个 block 采用 stride=2 将 feature map 空间尺寸减半。每下一个 stage,通道数加倍。同 ResNet 一样,每个 ShuffleNet unit 里, bottleneck 的通道数是输出通道数的 1/4。在 ShuffleNet units 里,通过 g (group number) 来控制 PW 的 connection sparsity。表中展示了不同的 g 对性能的影响,可以发现 group number 越大,在保持计算量基本不变的前提下允许的通道数越多,网络越“宽”,潜在地有利于网络编码更多的信息,提升模型的性能。实验中还增加了一个网络“宽度”缩放因子 S,来控制各层通道数目,实现网络自定义。将 Table 5 中的网络定义为 "ShuffleNet 1x”, "ShuffleNet Sx” 意味着将 "ShuffleNet 1x" 的通道数降低为 S 倍。

image.png

ShuffleNet V2

Evaluation of model performance

在上面的文章中我们统一使用FLOPs作为评估一个模型的性能指标,但是在ShuffleNet v2的论文中作者指出这个指标是间接的,因为一个模型实际的运行时间除了要把计算操作算进去之外,还有例如内存读写,GPU并行性,文件IO等也应该考虑进去。最直接的方案还应该回归到最原始的策略,即直接在同一个硬件上观察每个模型的运行时间。如图4所示,在整个模型的计算周期中,FLOPs耗时仅占50%左右,如果我们能优化另外50%,我们就能够在不损失计算量的前提下进一步提高模型的效率。

在ShuffleNet v2中,作者从内存访问代价(Memory Access Cost,MAC)和GPU并行性的方向分析了网络应该怎么设计才能进一步减少运行时间,直接的提高模型的效率。

Practical Guidelines

G1):当输入通道数和输出通道数相同时,MAC最小

假设一个卷积操作的输入Feature Map的尺寸是 \(w\times h\times c_1\) ,输出Feature Map的尺寸为\(w\times h\times c_2\) 。卷积操作的FLOPs为 \(B = w h c_1 c_2\) 。在计算这个卷积的过程中,输入Feature Map占用的内存大小是\(hwc_1\) ,输出Feature Map占用的内存是\(hwc_2\),卷积核占用的内存是 \(c_1c_2\) 。总计:

\[MAC = hw(c1+c2)+c1c2. \\ MAC \ge2\sqrt{hwB}+\frac{B}{hw}\]

\(c_1=c_2\) 时上式取等号。也就是说当FLOPs确定的时候, \(c_1=c_2\) 时模型的运行效率最高,因为此时的MAC最小。

G2):MAC与分组数量 \(g\) 成正比

在分组卷积中, \(MAC\)的计算方式为

\[\begin{aligned}\text{MAC}&=hw(c_1+c_2)+\frac{c_1c_2}{g}\\ &=hwc_1+\frac{Bg}{c_1}+\frac{B}{hw} \end{aligned}\]

根据G2,我们在设计网络时 \(g\) 的值不应过大。

G3):网络的分支数量降低并行能力

分支数量比较多的典型网络是Inception,NasNet等。它们倾向于采用“多路”结构,即存在一个block中很多不同的小卷积或者pooling,这很容易造成网络碎片化,减低模型的并行度,相应速度会慢。

G4):Element-wise操作是非常耗时的

我们在计算FLOPs时往往只考虑卷积中的乘法操作,但是一些Element-wise操作(例如ReLU激活,偏置,单位加等)往往被忽略掉。作者指出这些Element-wise操作看似数量很少,但它对模型的速度影响非常大。尤其是深度可分离卷积这种MAC/FLOPs比值较高的算法。下图中统计了ShuffleNet v1和MobileNet v2中各个操作在GPU和ARM上的消耗时间占比。

image.png

总结一下,在设计高性能网络时,我们要尽可能做到:

  1. G1). 使用输入通道和输出通道相同的卷积操作;
  2. G2). 谨慎使用分组卷积;
  3. G3). 减少网络分支数;
  4. G4). 减少element-wise操作。

例如在ShuffleNet v1中使用的分组卷积是违背G2的,而每个ShuffleNet v1单元使用了bottleneck结构是违背G1的。MobileNet v2中的大量分支是违背G3的,在Depthwise处使用ReLU6激活是违背G4的。

从它的对比实验中我们可以看到虽然ShuffleNet v2要比和它FLOPs数量近似的的模型的速度要快。

Network Structure

下图中,(a),(b)是刚刚介绍的ShuffleNet v1,(c),(d)是这里要介绍的ShuffleNet v2。

image.png

仔细观察(c),(d)对网络的改进我们发现了以下几点:

  1. 在(c)中ShuffleNet v2使用了一个通道分割(Channel Split)操作。这个操作非常简单,即将 \(c\)个输入Feature分成$\(c^{'}\)$和 \(c-c^{'}\) 两组,一般情况下 \(c^{'}=\frac{c}{2}\)。这种设计是为了尽量控制分支数,为了满足G3。
  2. 在分割之后的两个分支,左侧是一个直接映射,右侧是一个输入通道数和输出通道数均相同的深度可分离卷积,为了满足G1。
  3. 在右侧的卷积中,  卷积并没有使用分组卷积,为了满足G2。
  4. 最后在合并的时候均是使用拼接操作,为了满足G4。
  5. 在堆叠ShuffleNet v2的时候,通道拼接,通道洗牌和通道分割可以合并成1个element-wise操作,也是为了满足G4。

最后当需要降采样的时候我们通过不进行通道分割的方式达到通道数量的加倍,如图(d),非常简单。

ShuffleNet v2 vs DenseNet

ShuffleNet v2能够得到非常高的精度是因为它和DenseNet有着思想上非常一致的结构:强壮的特征重用(Feature Reuse)。在DenseNet中,作者大量使用的拼接操作直接将上一层的Feature Map原汁原味的传到下一个乃至下几个模块。从图(c)中我们也可以看处,左侧的直接映射和DenseNet的特征重用是非常相似的。

不同于DenseNet的整个Feature Map的直接映射,ShuffleNet v2只映射了一半。恰恰是这一点不同,是ShuffleNet v2有了和DenseNet的升级版CondenseNet相同的思想。在CondenseNet中,作者通过可视化DenseNet的特征重用和Feature Map的距离关系发现

距离越近的Feature Map之间的特征重用越重要。ShuffleNet v2中第\(i\)个和第\(i+j\) 个Feature Map的重用特征的数量是\(\frac{c}{2^j}\)。也就是距离越远,重用的特征越少。

EfficientNet

EfficientNet源自Google Brain的论文EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. 从标题也可以看出,这篇论文最主要的创新点是Model Scaling. 论文提出了compound scaling,混合缩放,把网络缩放的三种方式:深度、宽度、分辨率,组合起来按照一定规则缩放,从而提高网络的效果。EfficientNet在网络变大时效果提升明显,把精度上限进一步提升,成为了当前最强网络。EfficientNet-B7在ImageNet上获得了最先进的 84.4%的top-1精度 和 97.1%的top-5精度,比之前最好的卷积网络(GPipe, Top-1: 84.3%, Top-5: 97.0%)大小缩小8.4倍、速度提升6.1倍。

EfficientNet的主要创新点并不是结构,不像ResNet、SENet发明了shortcut或attention机制,EfficientNet的base结构是利用结构搜索搜出来的,然后使用compound scaling规则放缩,得到一系列表现优异的网络:B0~B7. 下面两幅图分别是ImageNet的Top-1 Accuracy随参数量和flops变化关系图,可以看到EfficientNet饱和值高,并且到达速度快。

image.png
image.png

原理

增加网络参数可以获得更好的精度(有足够的数据,不过拟合的条件下),例如ResNet可以加深从ResNet-18到ResNet-200,GPipe将baseline模型放大四倍在ImageNet数据集上获得了84.3%的top-1精度。增加网络参数的方式有三种:深度宽度分辨率

深度是指网络的层数,宽度指网络中卷积的channel数(例如wide resnet中通过增加channel数获得精度收益),分辨率是指通过网络输入大小(例如从112x112到224x224)

直观上来讲,这三种缩放方式并不不独立。对于分辨率高的图像,应该用更深的网络,因为需要更大的感受野,同时也应该增加网络宽度来获得更细粒度的特征

之前增加网络参数都是单独放大这三种方式中的一种,并没有同时调整,也没有调整方式的研究。EfficientNet使用了compound scaling方法,统一缩放网络深度、宽度和分辨率。

\[\begin{aligned} \text{depth}: d &= \alpha^\phi \\ \text{width}: w &= \beta^\phi \\ \text{resolution}: r &= \gamma^\phi \\ \text{s.t. } \alpha \cdot \beta^2 \cdot \gamma^2 &\approx 2 \\ \alpha \geq 1, \beta &\geq 1, \gamma \geq 1 \end{aligned} \]

如下图所示,(a)为baseline网络,(b)、(c)、(d)为单独通过增加width,depth以及resolution使得网络变大的方式,(e)为compound scaling的方式。

image.png

EfficientNet中的base网络是和MNAS采用类似的方法(唯一区别在于目标从硬件延时改为了FLOPS),使用了compound scaling后,效果非常显著,在不同参数量和计算量都取得了多倍的提升。

网络结构

通过网络结构搜索设计了一个baseline网络,也就是EfficientNet-B0,如下图所示,网络结构利用了mobilenetV2的inverted bottleneck MBConv,比较简单以方便后续测试compound model scaling算法的效果。

image.png

在优化求解方面,作者提出2步优化,

第一步是固定\(Φ=1\),然后通过网格搜索找到满足公式3的最优\(α、β、γ\),比如对于EfficientNet-B0网络而言,最佳的参数分别是α=1.2、β=1.1、γ=1.15(此时得到的也就是EfficientNet-B1);

第二步是固定第一步求得的\(α、β、γ\)参数,然后用不同的Φ参数得到EfficientNet-B1到EfficientNet-B7网络,最后的实验结果如Table2所示,可以看到EfficientNet系列网络在取得和其他分类网络差不多的准确率时,参数量和计算量都很减少很多。 理论上,假如EfficientNet-B0网络是全卷积,且做scale操作过程中没有小数的取整操作,那么从EfficientNet-B0到EfficientNet-B7网络的FLOPS应该是严格的\(2^Φ\)关系,但从Table2来看显然没有,主要是因为scale过程中的取整操作以及EfficientNet-B0网络并非全卷积结构。

image.png