GhostNet 越来越多的小结构修改

时间:2024-03-27 22:51:17

首发于:jwxie.cn

GhostNet - More Features from Cheap Operations

???? PDF Link ???? Github Code
超越了MobileNetv3的轻量型网路实现方式。

个人前言

前几天论文预答辩的时候停了停大实验室里其他同学的研究,有一部分做网络压缩的,当时有个评委提了个问题

在如今MobileNet系列以及ShuffleNet等轻量级网络不断发展的前提下,网络压缩的发展方向在哪?

当时没仔细想,现在回过头来一想的确是个有意思的问题。

个人(非该方向)觉得,其实压缩的目的就是为了去除网络中的冗余参数,去掉的多了,对于复杂的网络而言也就变成了“轻量级网络”。

如果非要说发展方向在哪,我觉得不如和NAS结合起来来探究一下到底什么结构是又快又好的,或是直接对结构和宽度做优化设计新的网络。

当然也不是说不能继续对ShuffleNet之类的轻量级网络继续剪枝,但个人理解一定程度的冗余可能是有利于提升网络的泛化性。

Section 1 简介

过去许多工作来进行网络压缩,包括了剪枝低比特量化知识蒸馏等。但是这类工作有一个很大的上限,他们的性能被局限于预训练模型性能基线(应该不能说是狭义的上限,部分压缩还能能略略提升一点baseline的性能)。

和上面网络压缩不同的是,如MobileNet等轻量级网络则是从结构设计优化的角度减少参数和计算量(嘿,论文这里也提到了NAS,说结构设计工作其实可以和NAS结合起来),相对而言这些工作有着更大的潜力。

GhostNet 越来越多的小结构修改

作者认为特征图的冗余是有必要的,同时也选择拥抱这类特征冗余,但是会以一种更加高效的方式来得到这类冗余。上图展示了ResNet-50在识别一只猫的过程中所产生的特征图,其中有很多特征图是很像是另外一些特征图的一些ghost。

本文将传统的卷积拆分成两个部分,第一部分为正常卷积(这一部分的卷积核数量会被严格限制),另一部分为对第一部分产生的“固有”特征图进行一些线性变换的模块,最终保证和vanilla cnn中的卷积层有一样大小的输出但是更少的参数和计算量。

最后,轮到他们装逼的时候了!

  • 将baseline中的卷积层替换为Ghost Modules,证明了有效性
  • 证明了在许多benchmarks中有着更好的性能
  • 俺们是SOTA, MobileNetV3也8行!

Section 2 相关工作

⭐️ 细节自己看奥 ⭐️

  • Model Compression
  • Compact Model Design

Section 3 方法

3.1 Ghost Module for More Features

Ghost Module

尽管MobileNet和ShuffleNet使用了DW卷积和shuffle操作,但是即使是1x1的卷积也是有memory消耗和FLOPs的。
这里科普了一个FLOPs的计算方法,假定常规卷积可以看作是
Y=Xf+b(3.1)Y = X * f + b \tag{3.1}
其中ff为卷积核,其大小为k×kk \times k。那么最终一次卷积产生的计算就变成了下式。
FLOPs=nhwckk(3.2)FLOPs = n \cdot h' \cdot w' \cdot c \cdot k \cdot k \tag{3.2}
这个公式告诉我的是,在n:numberofkernelsn: number of kernelsc:channelsc: channels很大(通常是256或512)的时候,会产生较大的计算量。 但是前面那张图又告诉我们,网络通过一堆计算会生成一堆特征图,而且部分特征图还和别的有点像。

那成,我们就把那些看起来类似的特征图看作是其他固有特征图(是由正常卷积生成的尺寸较小maps)经过一些cheap transformantion后生成的一些“ghosts”。
Y=Xf(3.3) Y' = X * f' \tag{3.3}
其中$ f’ \in \mathbb{R}^{c\times k \times k \times m}, m \leq nmghost是用来界定到底有多少参数是固有的有多少是ghost的参数。在此基础上,为了获得和正常卷积一样大小的输出,我们再对每一张已经生成的固有卷积特征图Y’$去做一些cheap的线性变化。

yij=Φi,j(yi),i=1,,m,j=1,,s(3.4)y_{i j}=\Phi_{i, j}\left(y_{i}^{\prime}\right), \forall i=1, \ldots, m, j=1, \ldots, s \tag{3.4}

其中,yiy_i'YY'中的第ii个特征图,Φi,j\Phi_{i, j}yiy_i'对第jj个线性操作,也就是说可以一对多(至多ss个),记为$ \{{y_{ij}\}}_{j=1}^{s} $,
当然啦,最后一个的 Φi,s\Phi_{i, s}是一个identity连接,用以保留原始特征图。同时线性变换也不是固定窗口的,有3×33 \times 3 也有 $ 5 \times 5$的。

最后,我们得到了n=msn=m\cdot s数量的特征图集Y=[y11,y12,,yms]Y=\left[y_{11}, y_{12}, \cdots, y_{m s}\right]

其实一言以蔽之,减少计算量的思想就是DW卷积那个,但是不一样的是使用线性变化能从原理上获得质量更高的特征图

Difference from Existing Methods

  • 对比MobileNet,ShuffleNet,SqueezeNet大量使用的1×11 \times 1PW卷积而言,俺们的可以自定义尺寸。
  • 对比MobileNet/v1-v2,ShuffleNet/v1-v2使用PW卷积来处理channel之间的信息,用DW卷积来处理空间信息,俺们直接使用正常卷积+Ghost Module
  • MobileNet,ShuffelNet等网络使用的DW卷积和shift操作都有框架限定,俺们的没有因此有更广泛的适用性。
  • identity映射是并行线性变换的。

Analysis on Complexities

这里分析一下到底降低了多少计算量和参数量,假设Ghost Module的线性变换核为d×dd \times d大小的,且scs \ll c

针对计算量:
rs=nhwckknshwckk+(s1)nshwdd=ckk1sckk+s1βddscs+c1s \begin{aligned} r_{s} &=\frac{n \cdot h^{\prime} \cdot w^{\prime} \cdot c \cdot k \cdot k}{\frac{n}{s} \cdot h^{\prime} \cdot w^{\prime} \cdot c \cdot k \cdot k+(s-1) \cdot \frac{n}{s} \cdot h^{\prime} \cdot w^{\prime} \cdot d \cdot d} \\\\ &=\frac{c \cdot k \cdot k}{\frac{1}{s} \cdot c \cdot k \cdot k+\frac{s-1}{\beta} \cdot d \cdot d} \approx \frac{s \cdot c}{s+c-1} \approx s \end{aligned}

针对参数量:
rc=nckknsckk+s1sddscs+c1s r_{c}=\frac{n \cdot c \cdot k \cdot k}{\frac{n}{s} \cdot c \cdot k \cdot k+\frac{s-1}{s} \cdot d \cdot d} \approx \frac{s \cdot c}{s+c-1} \approx s

3.2 搭网络

Ghost BottleNecks(G-bneck)

GhostNet 越来越多的小结构修改

如图所示,这个BottleNeck跟ResNet很像,左边那个用两个Ghost Module来构成Ghost bottleneck(G-bneck)。第一个用来拓展特征维度,第二个用于降低通道数并平衡shortcut附带的特征通道数。

  • 这里定义了一个拓展比例=第一个Ghost Module的输出/输入通道数
  • 同时加上了第二个Ghost Module后面的ReLU(俺们不和MobileNetV2一样)。

对于stride=2的情况,就是在两个Ghost Module中间夹一个DW卷积。在实际过程中,这里把Ghost Module里面的正常卷积换成了PW卷积

GhostNet

结构和MobileNetV3很像,如下表。
但**层上没有使用hard-swish nonlinearity: x=xσ(x)x=x \cdot \sigma(x)

输入 操作 #exp #out Squeeze and excite 步长
2242×3224^2 \times 3 Conv2d 3×33 \times 3 - 16 - 2
1122×16112^2 \times 16 G-bneck 16 16 - 1
1122×16112^2 \times 16 G-bneck 48 24 - 2
562×2456^2 \times 24 G-bneck 72 24 - 1
562×2456^2 \times 24 G-bneck 72 40 1 2
282×4028^2 \times 40 G-bneck 120 40 - 1
282×4028^2 \times 40 G-bneck 240 80 1 2
142×8014^2 \times 80 G-bneck 200 80 - 1
142×8014^2 \times 80 G-bneck 184 80 - 1
142×8014^2 \times 80 G-bneck 184 80 - 1
142×8014^2 \times 80 G-bneck 480 112 1 1
142×11214^2 \times112 G-bneck 672 112 1 1
142×11214^2 \times112 G-bneck 672 160 1 1
72×1607^2 \times 160 G-bneck 960 160 - 1
72×1607^2 \times 160 G-bneck 960 160 1 1
72×1607^2 \times 160 G-bneck 960 160 - 1
72×1607^2 \times 160 G-bneck 960 160 1 1
72×1607^2 \times 160 Conv2d 1×11 \times 1 - 960 - 1
72×9607^2 \times 960 AvgPool 7×77 \times 7 - - - -
12×9601^2 \times 960 Conv2d 1×11 \times 1 - 1280 - 1
12×12801^2 \times 1280 FC - 1000 - -

Width Multiplier

GhostNet已经很nice了,但是还可以更nice,一个基础想法就是拓展一下宽度。比如使用α\alpha对每层的通道数进行扩大或缩小,α\alpha称为width multiplier,对应模型产生的额外参数和计算量大约为α2\alpha^2倍。通常来说α\alpha越小,延迟越低,反之亦然。

Section 4 实验

4.0 Dataset and Settings

  • Classification: CIFAR-10: crop/mirroring
  • Classification: ILSVRC2012 random crop/flip
  • Object Detection: MS COCO(用了trainval35k)

4.1 Efficiency of Ghost Module

4.1.1 Toy Experiments

在ResNet-50的第一个ResBlock之后,将Figure1中的三个特征图对(红、绿、蓝)为例子。将图像对左侧的图像作为输入,右边的作为输出,来训练DW卷积核,学习他们之间的表达关系。采用的卷积核尺寸d=17d=1 \ldots 7,使用MSE值来评估差异,结果如下表所示。

MSE(103)(10^{-3}) d = 1 d = 3 d = 5 d = 7
red pair 4.0 3.3 3.3 3.2
green pair 25.0 24.3 24.1 23.9
blue pair 12.1 11.2 11.1 11.0

发现其实差异(MSE)很小,所以除了卷积,还可以使用一些仿射变换、小波变换等方式来实现,但总的来说卷积是已经是最高效的了,而且可以很号的适应当前的硬件。

4.1.2 CIFAR-10

  1. 超参数选择
    此外对于参数dd的选择上,尽管可以任意的来,但是不规律的选择对计算单元的计算效率是有影响的,因此将采用固定的dd。结合另一个超参数ss,对其超参数的值进行实验。

首先,固定s=2s=2然后调节d=1,3,5,7d={1,3,5,7},结果如下表所示。

d Weigths(M) FLOPs(M) Acc. (%)
VGG-16 15.0 313 93.6
1 25.0 157 93.5
3 7.6 158 93.7
5 7.7 160 93.4
7 7.7 163 93.1

发现使用d=3d=3能取得较好的结果,原因在于1×11 \times 1的卷积核不能够为特征图引入太多空间信息,而d=5,7d=5, 7会导致过拟合和更多的计算量。

然后,固定d=3d=3,调节参数s=2,3,4,5s={2, 3, 4, 5}。这个参数的选择对最终的计算量的影响很大,实验结果如下表所示。

s Weigths(M) FLOPs(M) Acc. (%)
VGG-16 15.0 313 93.6
2 7.7 158 93.7
3 5.2 107 93.4
4 4.0 80 93.0
5 3.3 65 92.9

发现在显著减少计算量的时候,如s=2s=2,精度不仅提升了0.1计算量却降了一半。

  1. 对比SOTA
    主要就是采用了VGG-16和ResNet-56作为对比实验框架,主要实验结果如下表所示。
Model Weigths(M) FLOPs(M) Acc. (%)
VGG-16 15.0 313 93.6
ℓ1-VGG-16 5.4 206 93.4
SBP-VGG-16 - 136 92.5
Ghost-VGG-16 (s=2) 7.7 158 93.7
ResNet-56 0.85 125 93.0
CP-ResNet-56 - 63 92.0
ℓ1-ResNet-56 0.73 91 92.5
AMC-ResNet-56 (s=2) - 63 91.9
Ghost-ResNet-56 (s=2) 0.43 63 92.7

总的来说,GhostNet不仅从计算量上有优势,精度上也有一定的优势。

  1. 可视化特征图
    GhostNet 越来越多的小结构修改

4.1.3 ImageNet

Model Weigths(M) FLOPs(B) Top-1 Acc. (%) Top-5 Acc. (%)
ResNet-50 25.6 4.1 75.3 92.2
Thinet-ResNet-50 16.9 2.6 72.1 90.3
NISP-ResNet-50-B 11.0 3.0 74.5 91.8
SSS-ResNet-50 - 2.8 74.2 91.9
Taylor-FO-BN-ResNet-50 14.2 2.3 74.5 -
Thinet-ResNet-50 16.9 2.6 72.1 90.3
NISP-ResNet-50-B 11.0 3.0 74.5 91.8
Ghost-ResNet-50 (s=2) 13.0 2.2 75.0 92.3
Shift-ResNet-50 6.0 - 70.6 91.9
Taylor-FO-BN-ResNet-50 7.9 1.3 71.7 -
Slimmable-ResNet-50 0.5× 6.9 1.1 72.1 -
MetaPruning-ResNet-50 - 1.0 73.4 -
Ghost-ResNet-50 (s=4) 6.5 1.2 74.1 91.9

没啥好说的和前面的总结一样不仅从计算量上有优势,精度上也有一定的优势。

4.2 GhostNet on Visual Benchmarks

4.2.1 Classification

GhostNet里面最初的卷积核大小为k=1×1k = 1 \times 1, s=2,d=3s = 2, d = 3,然后也加了一些不同的width multiplierα\alpha来控制GhostNet的参数和模型大小。
别的不多说了,就是diao呗,看表。

Model Weigths(M) FLOPs(B) Top-1 Acc. (%) Top-5 Acc. (%)
ShuffleNetV1 0.5× (g=8) 1.0 40 58.8 81.0
MobileNetV2 0.35× 1.7 59 60.3 82.9
ShuffleNetV2 0.5× 1.4 41 61.1 82.6
MobileNetV3 Small 0.75× 2.4 44 65.4 -
GhostNet 0.5× 2.6 42 66.2 86.6
MobileNetV1 0.5× 1.3 150 63.3 84.9
MobileNetV2 0.6× 2.2 141 66.7 -
ShuffleNetV1 1.0× (g=3) 1.9 138 67.8 87.7
ShuffleNetV2 1.0× 2.3 146 69.4 88.9
MobileNetV3 Large 0.75× 4.0 155 73.3 -
GhostNet 1.0× 5.2 141 73.9 91.4
MobileNetV2 1.0× 3.5 300 71.8 91.0
ShuffleNetV2 1.5× 3.5 299 72.6 90.6
FE-Net 1.0× 3.7 301 72.9 -
FBNet-B 4.5 295 74.1 -
ProxylessNAS 4.1 320 74.6 92.2
MnasNet-A1 3.9 312 75.2 92.5
MobileNetV3 Large 1.0× 5.4 219 75.2 -
GhostNet 1.3× 7.3 226 75.7 92.9

另外,FLOPs是一个理论指标,具体的实际速度上,对比结果看图。

GhostNet 越来越多的小结构修改

左边是FLOPs,右边是实际的Latency,突出一个牛逼呗????。

4.2.2 Object Detection

废话不多说,上表。

Backbone Framework BackBone FLOPs(M) mAP(%)
MobileNetV2 RetinaNet 300 26.7
MobileNetV3 \uparrow 219 26.4
GhostNet 1.1× \uparrow 164 26.6
MobileNetV2 Faster R-CNN 300 27.5
MobileNetV3 \uparrow 219 26.9
GhostNet 1.1× \uparrow 164 26.9

Section 5 总结

论文提出Ghost Module来减少DNN的计算消耗。将正常卷积分解成了两个部分,通过对第一部分正常卷积生成的特征图进行线性变换来生成ghost特征图。这种方式更高效的实现了特征图的生成,同时结果证明这事有效的,同时取得了一部分SOTA。

References

⭐️ 没有啥具体要看的,引用的都是些比较经典的论文 ⭐️