本文为CVPR 2020 录用论文,作者来自华为、北京大学、悉尼大学,截止目前已有36次引用,github 星标1.2K,是近年来值得关注的轻量级CNN模型。
使用轻量操作代替部分传统卷积层生成冗余特征以减少计算量
GhostNet:More Features from Cheap Operations
论文:https://arxiv.org/pdf/1911.11907.pdf
代码:https://github.com/huawei-noah/ghostnet
0
绪论
随着卷积神经网络部署在终端的需求越来越强烈,很多研究者们开始研究如何降低神经网络的计算量。一种方法是在一个已经训练好的网络基础上做一些裁剪和量化,比如模型剪枝、低比特量化、知识蒸馏;另外一种方法是设计高效的神经网络架构,比如MobileNetv1-v3系列、ShuffleNet等等。
特征冗余性是卷积神经网络的重要特性之一,一些轻量化网络的工作恰恰是利用特征的冗余性,通过裁掉部分冗余特征达到模型轻量化的效果。
与其他工作不同,这篇文章并没有刻意裁剪冗余的特征,而是用一种比传统卷积层更轻量化的方法去生成冗余的特征。通过“少量传统卷积计算” “轻量的冗余特征生成器”的方式,既能减少网络的整体计算量,又能保证网络的精度。
1
动机
下图为针对一输入图片,ResNet-50中间的feature map,图中的30个feature map中,有一些feature map是很相似的,比如图中相同颜色标出的3组feature map。这种现象一定程度上说明了神经网络中feature map的冗余性,神经网络的冗余性有助于网络更全面地理解输入图片。与通过减少冗余性进行网络轻量化的工作不同,这篇文章并没有减少冗余性,而是采用一种新的、计算量小的方法生成冗余特征。
既然feature map具有冗余性,那么完全使用传统的卷积层生成这么冗余的特征是不是有点浪费计算资源了呢?考虑可以用一个输出feature map数量很少的卷积层和另外一个能增加冗余性、计算量小的操作去代替传统网络中的卷积层,既能保证特征冗余性从而保证精度,又能减少网络的整体计算量。
2
Ghost Module
作者提出了用于代替传统卷积层的Ghost module。Ghost module和传统卷积层的区别如下图所示:
使用表示输入feature map,其中是输入feature map的通道数,和分别是输入feature map的高和宽,那么上图中图(a)所示的传统卷积层可以用如下公式表示:
上式中表示含有个通道的输出feature map,和 分别是输出feature map的高和宽。表示卷积操作,表示卷积核,卷积核尺寸为,表示偏置项。计算整个卷积层,需要做次乘法和加法操作,在网络的浅层,和比较大;在网络的深层,和比较大。
上图中图(b)所示即为作者提出的Ghost module。既然feature map有冗余性,大可不必使用很昂贵的传统卷积层产生所有的feature map;只需要使用传统卷积层产生一部分feature map,然后通过对这部分feature map做简单的线性变换,增加feature map的冗余性,应该可以“模拟”传统卷积层的效果。
因此Ghost module由两部分组成:其一为输出少量feature map的传统卷积层;其二为用于产生冗余feature map的轻量级线性变换层。使用如下2个公式表述上图中图(b)的操作:
第一个公式表示输出少量feature map的传统卷积层,其中表示输出特征,表示该卷积操作的卷积核,这个卷积操作的输出feature map通道数要小于传统卷积层的通道数,即。
第二个公式表示用于产生冗余特征的线性变换操作,其中为的个feature map。中的每个feature map ,都要通过轻量级的线性操作,得到个feature map。
因此这个feature map通过线性操作共可以得到个feature map。为了使Ghost module能即插即用地替换传统卷积,即Ghost module输出的feature map数量与传统卷积一致,因此要保证,且Ghost module中卷积操作的卷积核尺寸、步长、padding等属性要与被替换的传统卷积层一致。
需要特别指出的是,每个的个线性变换中,最后一个线性变换被强行指定为恒等变换,从上图(b)中也可看出来这一点。这里的线性变换可以为或的卷积操作,当然也可以是其他轻量级的线性操作。
在如上图(b)所示的Ghost module中,左侧的操作计算量为;在右侧的操作中,每个的个线性操作中有1个恒等映射,
因此每个实际上只有个占用计算资源的线性变换,若采用卷积作为该线性变换,这部分计算为。
那么Ghost module的总计算量为
又因为,因此总计算量可以表示为
输出同样通道数和同样的feature map尺寸,传统的卷积层与ghost module的计算量之比为:
一般情况下,,若令,
则。
3
Ghost Bottleneck
以Ghost module为基础构建Ghost Bottleneck,如下图所示
Ghost Bottleneck的结构参考了如下两篇论文:
- Deep residual learning for image recognition.
- Mobilenetv2: Inverted residuals and linear bottlenecks.
Ghost Bottleneck具有如下特点:
- 每个Ghost Bottleneck中包含2个Ghost module,第1个Ghost module用于扩充特征的通道数,第2个Ghost module用于减少特征的通道数。
- 参考了ResNet中shortcut结构。
- 每个Ghost module后面加1个BN层。
- 参考了MobileNetv2的结构,第1个Ghost module后面有ReLU操作,第2个Ghost module后面没有ReLU操作。
此外,针对stride=2的情况,Ghost Bottleneck又增加了如下操作:
- shortcut部分包含下采样操作以保证维度一致。
- 2个Ghost module中间插入stride=2的DWConv层完成下采样操作,并在其后增加1个BN层。
在实际使用过程中,当stride=2时,令Ghost module中的卷积操作为1x1卷积,以减少计算量。
4
GhostNet
使用Ghost Bottleneck构建GhostNet,在构建GhostNet时参考了下面2篇文章提出的网络结构:
- Searching for mobilenetv3.
- Squeeze-and-excitation networks.
将MobileNetv3中的bottleneck替换成上文中的Ghost Bottleneck,GhostNet结构如下所示:
上图中的“#exp”一栏的数字,表示Ghost Bottleneck中第1个Ghost module产生的特征通道数;“SE”一栏表示是否使用了squeeze and excite模块。
为了保证计算效率,GhostNet并没有使用MobileNetv3中的hard-swish激活函数。
为了使GhostNet能够平衡计算量与性能,将上述网络结构中的通道数乘以,使得网络具有扩展性,记作GhostNet-。GhostNet-的计算量约为GhostNet-的倍。
5
超参数探索
作者通过实验探索最佳的s值和d值,使用CIFAR-10数据集和VGG结构,使用Ghost module替代VGG中的卷积层,首先令s=2,d={1,3,5,7}构建4个网络,这4个网络以及VGG16的计算量和性能如下表所示:
可以看出当d=3时网络性能最好,当d=5或者d=7时,计算量有一定提升,且网络性能并没有提高。
令d=3,s={2,3,4,5}构建4个网络,这4个网络以及VGG16的计算量和性能如下表所示:
当s=2时性能最好,且计算量是VGG16的一半。
6
实验结果
将上述超参数探索的结果应用于GhostNet,即令GhostNet中的s=2,d=3,为减少计算量,将卷积核尺寸设置为1x1。
在ImageNet训练集上训练,在ImageNet验证集上测试,结果如下表所示:
可以看出在不同计算量下,相比于其他网络,GhostNet都有很优越的性能。
为了证明GhostNet的通用性,将GhostNet-1.1X分别用于RetinaNet和Faster R-CNN框架下,在COCO数据集上做目标检测,效果如下表所示:
从上表可以看出,无论是使用RetinaNet方法还是Faster R-CNN方法,相比于使用其他backbone,使用GhostNet-1.1X作为backbone在保证精度的同时能显著降低计算量。
7
总结
1.利用feature map之间的冗余性,提出了Ghost module,使用轻量级操作(比如DWConv)代替部分传统的卷积层生成冗余特征。
2.以Ghost module为基础构建GhostNet,并通过实验证明了GhostNet的性能和通用性。
3.很适用于基于ARM的终端平台,但是由于现有的AI芯片对DWConv支持不够友好,因此在AI芯片上未必有很高的推理速度。
仅用于学习交流!
(本文为粉丝投稿)
END