GhostNet 越来越多的小结构修改

首发于:jwxie.cn

GhostNet - More Features from Cheap Operations

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

个人前言

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

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

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

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

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

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

Section 1 简介

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

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

作者认为特征图的冗余是有必要的,同时也选择拥抱这类特征冗余,但是会以一种更加高效的方式来得到这类冗余。上图展示了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 = X ∗ f + b (3.1) Y = X * f + b \tag{3.1} Y=Xf+b(3.1)
其中 f f f为卷积核,其大小为 k × k k \times k k×k。那么最终一次卷积产生的计算就变成了下式。
F L O P s = n ⋅ h ′ ⋅ w ′ ⋅ c ⋅ k ⋅ k (3.2) FLOPs = n \cdot h' \cdot w' \cdot c \cdot k \cdot k \tag{3.2} FLOPs=nhwckk(3.2)
这个公式告诉我的是,在 n : n u m b e r o f k e r n e l s n: number of kernels n:numberofkernels c : c h a n n e l s c: channels c:channels很大(通常是256或512)的时候,会产生较大的计算量。 但是前面那张图又告诉我们,网络通过一堆计算会生成一堆特征图,而且部分特征图还和别的有点像。

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

y i j = Φ i , j ( y i ′ ) , ∀ 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} yij=Φi,j(yi),i=1,,m,j=1,,s(3.4)

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

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

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

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

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

针对计算量:
r s = n ⋅ h ′ ⋅ w ′ ⋅ c ⋅ k ⋅ k n s ⋅ h ′ ⋅ w ′ ⋅ c ⋅ k ⋅ k + ( s − 1 ) ⋅ n s ⋅ h ′ ⋅ w ′ ⋅ d ⋅ d = c ⋅ k ⋅ k 1 s ⋅ c ⋅ k ⋅ k + s − 1 β ⋅ d ⋅ d ≈ s ⋅ c s + c − 1 ≈ s \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} rs=snhwckk+(s1)snhwddnhwckk=s1ckk+βs1ddckks+c1scs

针对参数量:
r c = n ⋅ c ⋅ k ⋅ k n s ⋅ c ⋅ k ⋅ k + s − 1 s ⋅ d ⋅ d ≈ s ⋅ c s + c − 1 ≈ s 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 rc=snckk+ss1ddnckks+c1scs

3.2 搭网络

Ghost BottleNecks(G-bneck)

如图所示,这个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) x=xσ(x)

输入操作#exp#outSqueeze and excite步长
22 4 2 × 3 224^2 \times 3 2242×3Conv2d 3 × 3 3 \times 3 3×3-16-2
11 2 2 × 16 112^2 \times 16 1122×16G-bneck1616-1
11 2 2 × 16 112^2 \times 16 1122×16G-bneck4824-2
5 6 2 × 24 56^2 \times 24 562×24G-bneck7224-1
5 6 2 × 24 56^2 \times 24 562×24G-bneck724012
2 8 2 × 40 28^2 \times 40 282×40G-bneck12040-1
2 8 2 × 40 28^2 \times 40 282×40G-bneck2408012
1 4 2 × 80 14^2 \times 80 142×80G-bneck20080-1
1 4 2 × 80 14^2 \times 80 142×80G-bneck18480-1
1 4 2 × 80 14^2 \times 80 142×80G-bneck18480-1
1 4 2 × 80 14^2 \times 80 142×80G-bneck48011211
1 4 2 × 112 14^2 \times112 142×112G-bneck67211211
1 4 2 × 112 14^2 \times112 142×112G-bneck67216011
7 2 × 160 7^2 \times 160 72×160G-bneck960160-1
7 2 × 160 7^2 \times 160 72×160G-bneck96016011
7 2 × 160 7^2 \times 160 72×160G-bneck960160-1
7 2 × 160 7^2 \times 160 72×160G-bneck96016011
7 2 × 160 7^2 \times 160 72×160Conv2d 1 × 1 1 \times 1 1×1-960-1
7 2 × 960 7^2 \times 960 72×960AvgPool 7 × 7 7 \times 7 7×7----
1 2 × 960 1^2 \times 960 12×960Conv2d 1 × 1 1 \times 1 1×1-1280-1
1 2 × 1280 1^2 \times 1280 12×1280FC-1000--
Width Multiplier

GhostNet已经很nice了,但是还可以更nice,一个基础想法就是拓展一下宽度。比如使用 α \alpha α对每层的通道数进行扩大或缩小, α \alpha α称为width multiplier,对应模型产生的额外参数和计算量大约为 α 2 \alpha^2 α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 = 1 … 7 d=1 \ldots 7 d=17,使用MSE值来评估差异,结果如下表所示。

MSE ( 1 0 − 3 ) (10^{-3}) (103)d = 1d = 3d = 5d = 7
red pair4.03.33.33.2
green pair25.024.324.123.9
blue pair12.111.211.111.0

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

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

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

dWeigths(M)FLOPs(M)Acc. (%)
VGG-1615.031393.6
125.015793.5
37.615893.7
57.716093.4
77.716393.1

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

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

sWeigths(M)FLOPs(M)Acc. (%)
VGG-1615.031393.6
27.715893.7
35.210793.4
44.08093.0
53.36592.9

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

  1. 对比SOTA
    主要就是采用了VGG-16和ResNet-56作为对比实验框架,主要实验结果如下表所示。
ModelWeigths(M)FLOPs(M)Acc. (%)
VGG-1615.031393.6
ℓ1-VGG-165.420693.4
SBP-VGG-16-13692.5
Ghost-VGG-16 (s=2)7.715893.7
ResNet-560.8512593.0
CP-ResNet-56-6392.0
ℓ1-ResNet-560.739192.5
AMC-ResNet-56 (s=2)-6391.9
Ghost-ResNet-56 (s=2)0.436392.7

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

  1. 可视化特征图
4.1.3 ImageNet
ModelWeigths(M)FLOPs(B)Top-1 Acc. (%)Top-5 Acc. (%)
ResNet-5025.64.175.392.2
Thinet-ResNet-5016.92.672.190.3
NISP-ResNet-50-B11.03.074.591.8
SSS-ResNet-50-2.874.291.9
Taylor-FO-BN-ResNet-5014.22.374.5-
Thinet-ResNet-5016.92.672.190.3
NISP-ResNet-50-B11.03.074.591.8
Ghost-ResNet-50 (s=2)13.02.275.092.3
Shift-ResNet-506.0-70.691.9
Taylor-FO-BN-ResNet-507.91.371.7-
Slimmable-ResNet-50 0.5×6.91.172.1-
MetaPruning-ResNet-50-1.073.4-
Ghost-ResNet-50 (s=4)6.51.274.191.9

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

4.2 GhostNet on Visual Benchmarks

4.2.1 Classification

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

ModelWeigths(M)FLOPs(B)Top-1 Acc. (%)Top-5 Acc. (%)
ShuffleNetV1 0.5× (g=8)1.04058.881.0
MobileNetV2 0.35×1.75960.382.9
ShuffleNetV2 0.5×1.44161.182.6
MobileNetV3 Small 0.75×2.44465.4-
GhostNet 0.5×2.64266.286.6
MobileNetV1 0.5×1.315063.384.9
MobileNetV2 0.6×2.214166.7-
ShuffleNetV1 1.0× (g=3)1.913867.887.7
ShuffleNetV2 1.0×2.314669.488.9
MobileNetV3 Large 0.75×4.015573.3-
GhostNet 1.0×5.214173.991.4
MobileNetV2 1.0×3.530071.891.0
ShuffleNetV2 1.5×3.529972.690.6
FE-Net 1.0×3.730172.9-
FBNet-B4.529574.1-
ProxylessNAS4.132074.692.2
MnasNet-A13.931275.292.5
MobileNetV3 Large 1.0×5.421975.2-
GhostNet 1.3×7.322675.792.9

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

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

4.2.2 Object Detection

废话不多说,上表。

BackboneFrameworkBackBone FLOPs(M)mAP(%)
MobileNetV2RetinaNet30026.7
MobileNetV3 ↑ \uparrow 21926.4
GhostNet 1.1× ↑ \uparrow 16426.6
MobileNetV2Faster R-CNN30027.5
MobileNetV3 ↑ \uparrow 21926.9
GhostNet 1.1× ↑ \uparrow 16426.9

Section 5 总结

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

References

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

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值