首发于: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的计算方法,假定常规卷积可以看作是
其中为卷积核,其大小为。那么最终一次卷积产生的计算就变成了下式。
这个公式告诉我的是,在和很大(通常是256或512)的时候,会产生较大的计算量。 但是前面那张图又告诉我们,网络通过一堆计算会生成一堆特征图,而且部分特征图还和别的有点像。
那成,我们就把那些看起来类似的特征图看作是其他固有特征图(是由正常卷积生成的尺寸较小maps)经过一些cheap transformantion后生成的一些“ghosts”。
其中$ f’ \in \mathbb{R}^{c\times k \times k \times m}, m \leq nmY’$去做一些cheap的线性变化。
其中,是中的第个特征图,是对第个线性操作,也就是说可以一对多(至多个),记为$ \{{y_{ij}\}}_{j=1}^{s} $,
当然啦,最后一个的 是一个identity连接,用以保留原始特征图。同时线性变换也不是固定窗口的,有 也有 $ 5 \times 5$的。
最后,我们得到了数量的特征图集。
其实一言以蔽之,减少计算量的思想就是DW卷积那个,但是不一样的是使用线性变化能从原理上获得质量更高的特征图
Difference from Existing Methods
- 对比MobileNet,ShuffleNet,SqueezeNet大量使用的PW卷积而言,俺们的可以自定义尺寸。
- 对比MobileNet/v1-v2,ShuffleNet/v1-v2使用PW卷积来处理channel之间的信息,用DW卷积来处理空间信息,俺们直接使用正常卷积+Ghost Module
- MobileNet,ShuffelNet等网络使用的DW卷积和shift操作都有框架限定,俺们的没有因此有更广泛的适用性。
- identity映射是并行线性变换的。
Analysis on Complexities
这里分析一下到底降低了多少计算量和参数量,假设Ghost Module的线性变换核为大小的,且。
针对计算量:
针对参数量:
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: 。
输入 | 操作 | #exp | #out | Squeeze and excite | 步长 |
---|---|---|---|---|---|
Conv2d | - | 16 | - | 2 | |
G-bneck | 16 | 16 | - | 1 | |
G-bneck | 48 | 24 | - | 2 | |
G-bneck | 72 | 24 | - | 1 | |
G-bneck | 72 | 40 | 1 | 2 | |
G-bneck | 120 | 40 | - | 1 | |
G-bneck | 240 | 80 | 1 | 2 | |
G-bneck | 200 | 80 | - | 1 | |
G-bneck | 184 | 80 | - | 1 | |
G-bneck | 184 | 80 | - | 1 | |
G-bneck | 480 | 112 | 1 | 1 | |
G-bneck | 672 | 112 | 1 | 1 | |
G-bneck | 672 | 160 | 1 | 1 | |
G-bneck | 960 | 160 | - | 1 | |
G-bneck | 960 | 160 | 1 | 1 | |
G-bneck | 960 | 160 | - | 1 | |
G-bneck | 960 | 160 | 1 | 1 | |
Conv2d | - | 960 | - | 1 | |
AvgPool | - | - | - | - | |
Conv2d | - | 1280 | - | 1 | |
FC | - | 1000 | - | - |
Width Multiplier
GhostNet已经很nice了,但是还可以更nice,一个基础想法就是拓展一下宽度。比如使用对每层的通道数进行扩大或缩小,称为width multiplier,对应模型产生的额外参数和计算量大约为倍。通常来说越小,延迟越低,反之亦然。
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卷积核,学习他们之间的表达关系。采用的卷积核尺寸,使用MSE值来评估差异,结果如下表所示。
MSE | 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 | 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 |
发现使用能取得较好的结果,原因在于的卷积核不能够为特征图引入太多空间信息,而会导致过拟合和更多的计算量。
然后,固定,调节参数。这个参数的选择对最终的计算量的影响很大,实验结果如下表所示。
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 |
发现在显著减少计算量的时候,如,精度不仅提升了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里面最初的卷积核大小为, ,然后也加了一些不同的width multiplier来控制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 | 219 | 26.4 | |
GhostNet 1.1× | 164 | 26.6 | |
MobileNetV2 | Faster R-CNN | 300 | 27.5 |
MobileNetV3 | 219 | 26.9 | |
GhostNet 1.1× | 164 | 26.9 |
Section 5 总结
论文提出Ghost Module来减少DNN的计算消耗。将正常卷积分解成了两个部分,通过对第一部分正常卷积生成的特征图进行线性变换来生成ghost特征图。这种方式更高效的实现了特征图的生成,同时结果证明这事有效的,同时取得了一部分SOTA。
References
⭐️ 没有啥具体要看的,引用的都是些比较经典的论文 ⭐️