GhostNet: More Features from Cheap Operations - 1 - 论文学习
GhostNet: More Features from Cheap Operations
1. Introduction
在训练有素的深度神经网络的特征图中,丰富甚至冗余的信息常常保证了对输入数据的全面理解。例如,图1展示了由ResNet-50生成的输入图像的一些特征映射,并且存在许多相似的特征映射对,就像彼此的幽灵一样。特征图中的冗余度是深度神经网络成功的重要特征。我们并没有避免冗余的特性映射,而是倾向于采用它们,但采用的是一种低成本的方式。
2. Related Work
2.1. Model Compression
网络修剪[14,39]、低比特量化[42,26]、知识精馏[19,57]等方法的性能往往是有上限的,因为使用了预先训练的深度神经网络作为其基线。因此这些方法的性能通常取决于给定的预训练模型。对基本操作和体系结构的改进将使它们走得更远。
2.2. Compact Model Design
虽然Xception [7]、MobileNets [21] 、MobileNetV2 [44] 、MobileNetV3 [20] 、ShuffleNet [61] 和ShuffleNetV2 [40]等轻量级模型以很少的FLOPs获得了很好的性能,但是它们特征图之间的相关性和冗余性一直没有得到很好的利用。
3. Approach
3.1. Ghost Module for More Features
因为在由主流CNNs网络计算得到的中间特征映射中广泛存在的冗余,如上图1所示,我们建议减少需要的资源,即用来生成这些特征映射的卷积过滤器。实际上,给定输入X∈ Rc x h x w,其中c为channels数,h和w分别为输入的高和宽。用来生成n特征映射的任意卷积层的操作公式为:
其中* 表示卷积操作,b为bias项。Y∈ Rh' x w' x n是有着n个channels的输出特征映射,f∈ Rc x k x k x n是该层的卷积过滤器。h' 和w'分别是输出的高和宽,k x k是卷积过滤器f的内核大小。在该卷积操作中,需要的FLOPs数为n*h'*w'*c*k*k,该值通常很大,因为过滤器数量n和channel数量c一般很大(如256和512)
根据公式1,需要优化的参数数量(f和b)由输入和输出特征图的维数明确确定。如图1所示,卷积层的输出特征映射通常包含大量冗余,其中一些可能彼此相似。我们指出没有必要用大量的FLOPs和参数一个一个地生成这些冗余的特征图。假设输出的特性映射是一些带有一些cheap转换的内在特性映射的“幽灵”。这些固有的特征图通常较小,由普通的卷积过滤器产生。
具体来说,m channels的内在特征映射Y'∈ Rh' x w' x m是使用一个基本卷积操作生成的:
f'∈ Rc x k x k x m是使用的过滤器,m<=n且为了简化将bias项省略。超参数如过滤器size、stride和padding和在等式1中的常见卷积操作相同,用来保持输出特征映射空间大小(即h' 和w')的一致性。为了进一步获得想要的n channels的特征映射,我们提出在Y'中的每个内在特征中应用一系列的cheap线性操作来生成s个ghost特征,如下函数所示:
yi′表示在Y'中的第i个内在特征映射,在上式中Φi,j是用于生成第j个ghost特征映射yij的第j个线性操作,也就是说yi′可以有一个甚至多个ghost特征映射{yij}sj=1。最后一个Φi,s是用来保存如图2(b)所示的内在特征映射的identity映射。
通过使用等式3,我们能够获得n = m*s channels的特征映射,Y = [y11,y12,··· ,yms]即如图2(b)所示的一个Ghost模块的输出数据。注意,线性操作Φ操作在每个通道的计算成本远小于普通的卷积。在实际应用中,在一个Ghost模块中可能会有几种不同的线性运算,例如3×3和5×5的线性内核,这些将在实验部分进行分析。
Difference from Existing Methods.提出的Ghost模块与现有的高效卷积方案有很大的不同。
i)与[21,61]中广泛使用1×1 pointwise卷积的单元相比,Ghost模块中的主卷积可以定制内核大小。
ii)现有的方法[21,44,61,40]采用 pointwise卷积跨通道处理特征,然后采用depthwise卷积处理空间信息。相比之下,Ghost模块采用普通卷积先生成少量的内在特征图,然后利用cheap的线性运算来扩充特征,增加channels。
iii)在以往的高效架构中[21,61,53,28],处理每个特征映射的操作仅限于depthwise卷积或shift操作,而Ghost模块中的线性操作可以有较大的多样性。
iv)另外,在Ghost模块中,将identity映射与线性变换并行进行,保持内在特征映射。
Analysis on Complexities.由于我们可以利用等式3中提出的Ghost模块生成与普通卷积层相同数量的特征映射,因此我们可以很容易地将Ghost模块集成到现有设计良好的神经结构中,从而降低计算成本。在这里,我们进一步分析了使用Ghost模块在内存使用和理论上的加速方面的好处。比如这里有一个identity映射和m*(s-1)=(n/s)*(s-1)个线性操作,每个线性操作的平均内核大小为d x d。理想情况下,n*(s-1)个线性操作能有不同形状和参数,但是线下推断将会受到阻碍,尤其是考虑到CPU或GPU cards的使用。因此为了高效实现,我们建议在一个Ghost模块中使用相同大小的线性操作(如3x3、5x5)。Ghost模块升级普通卷积的理论加速比为:
其中dxd与kxk有着相同的量级,且s<<c。
同样地,压缩比计算为:
可见通过使用提出的Ghost模型,其结果于加速比是等价的
这样子的计算方法的理解为:
因为原本通过一次卷积运算得到的输出有着很多相似的特征映射对,那么使用Ghost方法就是将其变为两个步骤来得到同样的有着很多相似特征映射对的输出。
首先一开始进行的小的卷积映射得到的Y'是m个没有重复的特征映射结果哦,之后再进行的每个特征映射的线形操作就是为每个特征映射生成(s-1)个相似的特征映射。
这样就能够以一个更快、FLOPs更少的方法得到和原来的卷积运算相同的有着相似特征映射对的最终的n个channels的特征映射输出
3.2. Building Efficient CNNs
Ghost Bottlenecks. 利用Ghost模块的优点,我们介绍了专门为小型CNNs设计的Ghost bottleneck(G-bneck)。如图3所示:
Ghost bottleneck看起来类似于ResNet[16]中的基本residual块,其中集成了几个卷积层和shortcut。提出的ghost bottleneck主要由两个堆叠的ghost模块组成。第一个Ghost模块作为扩展层,增加通道的数量。我们把输出通道数与输入通道数之比称为扩展比(expansion ratio)。第二个Ghost模块减少通道的数量以匹配shortcut。然后将这两个Ghost模块的输入和输出连接起来。除了根据MobileNetV2[44]的建议在第二个Ghost模块之后不使用ReLU外,每一层之后都使用batch归一化(BN)[25]和ReLU非线性函数。
上面描述的Ghost bottleneck是stride=1的情况。对于stride=2的情况,通过向下采样层实现shortcut路径,并在两个Ghost模块之间插入stride=2的depthwise卷积。在实际应用中,Ghost模块中主要的卷积是pointwise卷积,以提高其效率。(即stride=1的情况是不改变输出的宽高,只改变channels数;stride=2是不改变channels数,只下采样一倍宽高)
GhostNet.基于ghost bottleneck,我们建议使用如表1所示的GhostNet:
我们基本上遵循了MobileNetV3[20]架构的优势,用我们的Ghost bottleneck代替了MobileNetV3中的bottleneck块。GhostNet主要由一组Ghost bottleneck组成,Ghost模块作为构建块。第一层是标准的卷积层,有16个filter,然后是一系列的Ghost bottleneck,通道逐渐增加。这些Ghost bottleneck根据其输入特征图的大小被分组到不同的阶段。所有的Ghost bottleneck都使用stride=1,除了最后一个阶段使用stride=2。最后利用全局平均池化层和卷积层将特征映射转化为一个1280维的特征向量进行最终分类。squeeze and excite(SE)模块[22]也适用于某些ghost bottleneck的残层,如表7所示。
与MobileNetV3相比,我们没有使用hard-swish非线性函数,因为它有很大的延迟。所提出的体系结构提供了一个基本的设计参考,但进一步的超参数调整或基于ghost模块的自动体系结构搜索将进一步提高系统的性能。
Width Multiplier. 尽管表7中的给定架构已经可以提供低延迟和保证精度,但在某些场景中,我们可能需要更小、更快的模型或更高的特定任务的精度。为了期望的需求可以定制网络,我们可以简单地在每一层channels的数量上均匀地乘以一个系数α。这个因子α称为宽度乘数,因为它可以改变整个网络的宽度。我们表示带有宽度乘数α的GhostNet为GhostNet-α×。宽度乘数可以控制模型大小和计算成本大约α2。通常小α导致更低的延迟和更低的性能,反之亦然。
4. Experiments
4.1. Efficiency of Ghost Module
4.1.1 Toy Experiments.
我们在图1中展示了一个图表,指出存在一些类似的特征映射对,它们可以使用一些有效的线性操作来有效地生成。在这里,我们首先进行一个toy实验来观察原始特征图和生成的Ghost特征图之间的重构误差。以图1中的三对(即红色、绿色和蓝色)为例,使用ResNet-50[16]的第一个residual块提取特征。在左边的特征作为输入,另一个作为输出,我们利用一个小depthwise卷积过滤器学习映射,即它们之间的线性操作Φ。卷积滤波器d的大小范围为1 ~ 7,不同d对的MSE(均方误差)值如表2所示:
从表2可以看出,所有的MSE值都非常小,这说明在深度神经网络中,特征映射之间存在很强的相关性,这些冗余特征可以由多个固有的特征生成。除了上述实验中用到的卷积,我们还可以探索其他一些低成本的线性操作来构造Ghost模块,如仿射变换(affine)和小波变换(wavelet)。然而,卷积是一种高效的运算,已经得到了当前硬件的良好支持,它可以涵盖许多广泛使用的线性运算,如平滑、模糊、运动等。此外,虽然我们也可以学习关于Φ线性操作中每个过滤器的大小 ,不规则的模块将降低计算单元的效率(例如CPU和GPU)。因此,在接下来的实验中,我们建议让Ghost模块中的d为一个固定值,利用深度卷积实现等式3,构建高效的深度神经网络。
Analysis on Hyper-parameters. 如等式3所述,为高效的深度神经网络提出的Ghost模块有两个超参数,即s和d,s用于生成m = n / s个内在特征映射,d即用于计算ghost特征图的线性操作的内核大小d×d(即depthwise卷积过滤器的大小)。在VGG-16架构上测试了这两个参数的影响。
首先,我们固定s = 2并调节d为{1,3,5,7}中之一,并在表3中列出了CIFAR-10验证集的结果:
我们可以看到,提出的d = 3的Ghost模块比d值较小或较大的Ghost模块性能更好。这是因为尺寸为1×1的kernel不能在特征映射上引入空间信息,而尺寸较大的kernel如d = 5或d = 7会导致过拟合和增加计算量。因此,我们在接下来的实验中采用d = 3来进行有效性和效率的检验。
在研究了所提议的Ghost模块中使用的内核大小之后,我们保持d = 3,并在{2,3,4,5}范围内调优其他超参数s。事实上,s与得到的网络的计算代价直接相关,即如等式5和等式4所分析的,s越大,压缩比和加速比越大。从表4的结果可以看出,当我们增加s的时候,FLOPs明显减小,准确率逐渐降低,这是可以预料到的。特别是当s = 2时,也就是将VGG-16压缩2倍,我们的方法比原模型的性能稍好一些,说明了所提出的Ghost模块的优越性。
Comparison with State-of-the-arts.
上图为比较的结果
Visualization of Feature Maps. 我们还可视化了ghost模块的功能图,如图4所示:
虽然生成的特征映射来自于主要的特征映射,但是它们确实有显著的差异,这意味着生成的特征足够灵活,可以满足特定任务的需要。
4.1.3 Large Models on ImageNet
将其用到更大规模的网络中的对比结果:
4.2. GhostNet on Visual Benchmarks
用于分类中的对比:
Actual Inference Speed.
在目标检测任务中的对比: