首发于: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=X∗f+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=n⋅h′⋅w′⋅c⋅k⋅k(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′=X∗f′(3.3)
其中$ f’ \in \mathbb{R}^{c\times k \times k \times m}, m \leq n
,
,
,m
是
用
来
界
定
到
底
有
多
少
参
数
是
固
有
的
有
多
少
是
g
h
o
s
t
的
参
数
。
在
此
基
础
上
,
为
了
获
得
和
正
常
卷
积
一
样
大
小
的
输
出
,
我
们
再
对
每
一
张
已
经
生
成
的
固
有
卷
积
特
征
图
是用来界定到底有多少参数是固有的有多少是ghost的参数。在此基础上,为了获得和正常卷积一样大小的输出,我们再对每一张已经生成的固有卷积特征图
是用来界定到底有多少参数是固有的有多少是ghost的参数。在此基础上,为了获得和正常卷积一样大小的输出,我们再对每一张已经生成的固有卷积特征图Y’$去做一些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=m⋅s数量的特征图集 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 s≪c。
针对计算量:
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=sn⋅h′⋅w′⋅c⋅k⋅k+(s−1)⋅sn⋅h′⋅w′⋅d⋅dn⋅h′⋅w′⋅c⋅k⋅k=s1⋅c⋅k⋅k+βs−1⋅d⋅dc⋅k⋅k≈s+c−1s⋅c≈s
针对参数量:
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=sn⋅c⋅k⋅k+ss−1⋅d⋅dn⋅c⋅k⋅k≈s+c−1s⋅c≈s
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 | #out | Squeeze and excite | 步长 |
---|---|---|---|---|---|
22 4 2 × 3 224^2 \times 3 2242×3 | Conv2d 3 × 3 3 \times 3 3×3 | - | 16 | - | 2 |
11 2 2 × 16 112^2 \times 16 1122×16 | G-bneck | 16 | 16 | - | 1 |
11 2 2 × 16 112^2 \times 16 1122×16 | G-bneck | 48 | 24 | - | 2 |
5 6 2 × 24 56^2 \times 24 562×24 | G-bneck | 72 | 24 | - | 1 |
5 6 2 × 24 56^2 \times 24 562×24 | G-bneck | 72 | 40 | 1 | 2 |
2 8 2 × 40 28^2 \times 40 282×40 | G-bneck | 120 | 40 | - | 1 |
2 8 2 × 40 28^2 \times 40 282×40 | G-bneck | 240 | 80 | 1 | 2 |
1 4 2 × 80 14^2 \times 80 142×80 | G-bneck | 200 | 80 | - | 1 |
1 4 2 × 80 14^2 \times 80 142×80 | G-bneck | 184 | 80 | - | 1 |
1 4 2 × 80 14^2 \times 80 142×80 | G-bneck | 184 | 80 | - | 1 |
1 4 2 × 80 14^2 \times 80 142×80 | G-bneck | 480 | 112 | 1 | 1 |
1 4 2 × 112 14^2 \times112 142×112 | G-bneck | 672 | 112 | 1 | 1 |
1 4 2 × 112 14^2 \times112 142×112 | G-bneck | 672 | 160 | 1 | 1 |
7 2 × 160 7^2 \times 160 72×160 | G-bneck | 960 | 160 | - | 1 |
7 2 × 160 7^2 \times 160 72×160 | G-bneck | 960 | 160 | 1 | 1 |
7 2 × 160 7^2 \times 160 72×160 | G-bneck | 960 | 160 | - | 1 |
7 2 × 160 7^2 \times 160 72×160 | G-bneck | 960 | 160 | 1 | 1 |
7 2 × 160 7^2 \times 160 72×160 | Conv2d 1 × 1 1 \times 1 1×1 | - | 960 | - | 1 |
7 2 × 960 7^2 \times 960 72×960 | AvgPool 7 × 7 7 \times 7 7×7 | - | - | - | - |
1 2 × 960 1^2 \times 960 12×960 | Conv2d 1 × 1 1 \times 1 1×1 | - | 1280 | - | 1 |
1 2 × 1280 1^2 \times 1280 12×1280 | FC | - | 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=1…7,使用MSE值来评估差异,结果如下表所示。
MSE ( 1 0 − 3 ) (10^{-3}) (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
- 超参数选择
此外对于参数 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,结果如下表所示。
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 = 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。这个参数的选择对最终的计算量的影响很大,实验结果如下表所示。
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 = 2 s=2 s=2,精度不仅提升了0.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不仅从计算量上有优势,精度上也有一定的优势。
- 可视化特征图
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
×
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呗,看表。
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是一个理论指标,具体的实际速度上,对比结果看图。
左边是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
⭐️ 没有啥具体要看的,引用的都是些比较经典的论文 ⭐️