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 \tag{3.1} $$
其中\(f\)为卷积核,其大小为\(k \times k\)。那么最终一次卷积产生的计算就变成了下式。
$$FLOPs = n \cdot h’ \cdot w’ \cdot c \cdot k \cdot k \tag{3.2}$$
这个公式告诉我的是,在\(n: number of kernels\)和\(c: channels\)很大(通常是256或512)的时候,会产生较大的计算量。 但是前面那张图又告诉我们,网络通过一堆计算会生成一堆特征图,而且部分特征图还和别的有点像。
那成,我们就把那些看起来类似的特征图看作是其他固有特征图(是由正常卷积生成的尺寸较小maps)经过一些cheap transformantion后生成的一些“ghosts”。
$$ Y’ = X * f’ \tag{3.3} $$
其中\( f’ \in \mathbb{R}^{c\times k \times k \times m}, m \leq n\),\(m\)是用来界定到底有多少参数是固有的有多少是ghost的参数。在此基础上,为了获得和正常卷积一样大小的输出,我们再对每一张已经生成的固有卷积特征图\(Y’\)去做一些cheap的线性变化。
$$y_{i j}=\Phi_{i, j}\left(y_{i}^{\prime}\right), \forall i=1, \ldots, m, j=1, \ldots, s \tag{3.4}$$
其中,\(y_i’\)是\(Y’\)中的第\(i\)个特征图,\(\Phi_{i, j}\)是\(y_i’\)对第\(j\)个线性操作,也就是说可以一对多(至多\(s\)个),记为\( \{{y_{ij}\}}{j=1}^{s} \), 当然啦,最后一个的 \(\Phi{i, s}\)是一个identity连接,用以保留原始特征图。同时线性变换也不是固定窗口的,有\(3 \times 3\) 也有 \( 5 \times 5\)的。
最后,我们得到了\(n=m\cdot s\)数量的特征图集\(Y=\left[y_{11}, y_{12}, \cdots, y_{m s}\right]\)。
其实一言以蔽之,减少计算量的思想就是DW卷积那个,但是不一样的是使用线性变化能从原理上获得质量更高的特征图
Difference from Existing Methods
- 对比MobileNet,ShuffleNet,SqueezeNet大量使用的\(1 \times 1\)PW卷积而言,俺们的可以自定义尺寸。
- 对比MobileNet/v1-v2,ShuffleNet/v1-v2使用PW卷积来处理channel之间的信息,用DW卷积来处理空间信息,俺们直接使用正常卷积+Ghost Module
- MobileNet,ShuffelNet等网络使用的DW卷积和shift操作都有框架限定,俺们的没有因此有更广泛的适用性。
- identity映射是并行线性变换的。
Analysis on Complexities
这里分析一下到底降低了多少计算量和参数量,假设Ghost Module的线性变换核为\(d \times d\)大小的,且\(s \ll c\)。
针对计算量:
$$
\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}
$$
针对参数量:
$$
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)
如图所示,这个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 \cdot \sigma(x)\)。
输入 | 操作 | #exp | #out | Squeeze and excite | 步长 |
---|---|---|---|---|---|
\(224^2 \times 3\) | Conv2d \(3 \times 3\) | - | 16 | - | 2 |
\(112^2 \times 16\) | G-bneck | 16 | 16 | - | 1 |
\(112^2 \times 16\) | G-bneck | 48 | 24 | - | 2 |
\(56^2 \times 24\) | G-bneck | 72 | 24 | - | 1 |
\(56^2 \times 24\) | G-bneck | 72 | 40 | 1 | 2 |
\(28^2 \times 40\) | G-bneck | 120 | 40 | - | 1 |
\(28^2 \times 40\) | G-bneck | 240 | 80 | 1 | 2 |
\(14^2 \times 80\) | G-bneck | 200 | 80 | - | 1 |
\(14^2 \times 80\) | G-bneck | 184 | 80 | - | 1 |
\(14^2 \times 80\) | G-bneck | 184 | 80 | - | 1 |
\(14^2 \times 80\) | G-bneck | 480 | 112 | 1 | 1 |
\(14^2 \times112\) | G-bneck | 672 | 112 | 1 | 1 |
\(14^2 \times112\) | G-bneck | 672 | 160 | 1 | 1 |
\(7^2 \times 160\) | G-bneck | 960 | 160 | - | 1 |
\(7^2 \times 160\) | G-bneck | 960 | 160 | 1 | 1 |
\(7^2 \times 160\) | G-bneck | 960 | 160 | - | 1 |
\(7^2 \times 160\) | G-bneck | 960 | 160 | 1 | 1 |
\(7^2 \times 160\) | Conv2d \(1 \times 1\) | - | 960 | - | 1 |
\(7^2 \times 960\) | AvgPool \(7 \times 7\) | - | - | - | - |
\(1^2 \times 960\) | Conv2d \(1 \times 1\) | - | 1280 | - | 1 |
\(1^2 \times 1280\) | FC | - | 1000 | - | - |
Width Multiplier
GhostNet已经很nice了,但是还可以更nice,一个基础想法就是拓展一下宽度。比如使用\(\alpha\)对每层的通道数进行扩大或缩小,\(\alpha\)称为width multiplier,对应模型产生的额外参数和计算量大约为\(\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=1 \ldots 7\),使用MSE值来评估差异,结果如下表所示。
MSE\((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\)。结合另一个超参数\(s\),对其超参数的值进行实验。
首先,固定\(s=2\)然后调节\(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\)能取得较好的结果,原因在于\(1 \times 1\)的卷积核不能够为特征图引入太多空间信息,而\(d=5, 7\)会导致过拟合和更多的计算量。
然后,固定\(d=3\),调节参数\(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\),精度不仅提升了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 \times 1\), \(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
⭐ 没有啥具体要看的,引用的都是些比较经典的论文 ⭐