论文地址:https://arxiv.org/abs/1911.11907
源码:huawei-noah/ghostnet
0. 摘要
基于大型卷积网络参数量巨大,无法有效应用在嵌入式设备上,本文提出一种叫做幻影模块(Ghost module)的结构,可以通过更少的运算量获得更多的特征参数。基于原始的输入特征图,通过一系列线性变换将初次卷积得到的特征图的层数扩大,从而以较少的计算量获得与常规方法相似信息的特征输出。该模块可以即插即用,堆叠该模块可以获得Ghost bottlenecks,进而得到轻量级的神经网络GhostNet。在ImageNet分类任务,GhostNet在相似计算量情况下Top-1正确率达75.7%,高于MobileNetV3的75.2%。
1. 引言
深度卷积神经网络已经在多种计算机视觉问题上取得了很好的表现。传统的神经网络通常包含巨大数量的参数和浮点运算量(FLOPs),例如,对于尺寸为224的输入图片,ResNet50包含25.6M参数和4.1B的FLOPs。因此,最近卷积神经网络的设计更倾向于分布式或更有效的网络结构,以便在移动设备上取得良好的表现。
另外,作者发现传统神经网络通常会产生大量甚至冗余的特征数量。例如,图中展示了ResNet50的部分特征图,可以发现其中一些特征图极为相似:
图 1. ResNet-50 中第一个残差组生成的一些特征图的可视化,其中三个相似的特征图对示例用相同颜色的框进行注释。 这对中的一个特征图可以通过廉价操作(用扳手表示)转换另一个特征图来近似获得。
本文提出Ghost module,使用少量参数产生更多的特征。常规深度神经网络中的一个卷积层可以被分成两部分。首先是常规的卷积操作,但严格控制卷积的输出层数;第二步是一系列的简单线性操作,用第一步产生的特征图产生更多的特征图,相比通常的卷积,在产生相同特征数量的结果下,减少了相当多的计算量。
基于Ghost module,作者提出GhostNet,并且通过实验验证,GhostNet可以在减少计算量和复杂度的情况下取得和当前最先进的模型相似的精度,并且超越MobileNet v3在移动设备上进行快速运行。
2. 提出的方法
2.1 Ghost module
深度CNN通常引用由大量卷积组成,导致大量的计算成本。尽管最近的工作,例如MobileNet和ShuffleNet引入了深度卷积(Depth Conv)或混洗操作(Channel Shuffle),以使用较小的卷积核(浮点运算)来构建有效的CNN,但其余 1×1 卷积层仍将占用大量内存和FLOPs。
鉴于主流CNN计算出的中间特征图中存在大量的冗余(如图1所示),作者提出减少所需的资源,即用于生成它们的卷积核。实际上,给定输入数据 X ∈ R c × h × w X \in \mathbb{R}^{c\times h \times w} X∈Rc×h×w ,用于生成 n n n 个特征图的任意卷积层的运算可表示为:
Y = X ∗ f + b Y = X * f + b Y=X∗f+b
其中 ∗ * ∗ 是卷积运算, b b b 是偏差项, Y ∈ R h ′ × w ′ × n Y \in \mathbb{R}^{h' \times w' \times n} Y∈Rh′×w′×n 是具有 n n n个通道的输出特征图, f ∈ R c × k × k × n f \in \mathbb{R}^{c \times k \times k \times n} f∈Rc×k×k×n是这一层中的卷积核。另外, h ′ h' h′ 和 w ′ w' w′ 分别是输出数据的高度和宽度, k × k k \times k k×k 分别是卷积核 f f f 的内核大小。在此卷积过程中,由于卷积核数量 n n n 和通道数 c c c 通常非常大(例如256或512),所需的FLOPs数量达 n ⋅ h ′ ⋅ w ′ ⋅ c ⋅ k ⋅ k n \cdot h' \cdot w' \cdot c \cdot k \cdot k n⋅h′⋅w′⋅c⋅k⋅k 之多。
根据上述公式,要优化的参数数量( f f f 和 b b b 中的参数)由输入和输出特征图的尺寸确定。如图1中所观察到的,卷积层的输出特征图通常包含很多冗余,并且其中一些可能彼此相似。作者指出,没有必要使用大量的FLOP和参数一一生成这些冗余特征图,而是说,输出特征图是少数原始特征图通过一些廉价转换的“幻影”。这些原始特征图通常具有较小的大小,并由普通的卷积核生成。具体来说, m m m 个原始特征图 Y ′ ∈ R h ′ × w ′ × m Y' \in \mathbb{R}^{h' \times w' \times m} Y′∈Rh′×w′×m 是使用一次卷积生成的:
Y ′ = X ∗ f ′ Y' = X * f' Y′=X∗f′
其中 f ′ ∈ R c × k × k × m f' \in \mathbb{R}^{c \times k \times k \times m} f′∈Rc×k×k×m 是使用的卷积核, m ≤ n m \le n m≤n,为简单起见,这里省略了偏差项。超参数(例如卷积核大小,stride,padding)与普通卷积中的超参数相同,以保持输出特征图的空间大小(即 h ′ h' h′ 和 w ′ w' w′ )保持一致。为了进一步获得所需的 n n n 个特征图,作者提出对 Y ′ Y' Y′ 中的每个原始特征应用一系列廉价的线性运算,以生成 s s s 个幻影特征图:
y
i
j
=
Φ
i
j
(
y
i
′
)
y_{ij} = \Phi_{ij}(y'_i) \\
yij=Φij(yi′)
i
=
1
,
2
,
.
.
.
,
m
j
=
1
,
2
,
.
.
.
,
s
i = 1, 2, ..., m \\ j = 1, 2, ..., s
i=1,2,...,mj=1,2,...,s
其中 y ′ y' y′ 是 Y ′ Y' Y′ 中第 i i i 个原始特征图,上述函数中的 Φ i j \Phi_{ij} Φij 是第 j j j 个线性运算,用于生成第 j j j 个幻影特征图 y i j y_{ij} yij,也就是说, y ′ y' y′ 可以具有一个或多个幻影特征图 { y i j } j = 1 s \{y_{ij}\}^s_{j=1} {yij}j=1s 。最后的 Φ i s \Phi_{is} Φis 是用于保留原始特征图的恒等映射,如图2(b)所示。
通过使用廉价操作,我们可以获得 n = m × s n=m\times s n=m×s 个特征图 Y = [ y 11 , y 12 , . . . , y m s ] Y = [y_{11}, y_{12}, ..., y_{ms}] Y=[y11,y12,...,yms] 作为Ghost module的输出数据。
注意,线性运算 Φ \Phi Φ 在每个通道上运行,其计算量比普通卷积少得多。实际上,Ghost module中可能有几种不同的线性运算,例如 3 × 3 3\times 3 3×3 和 5 × 5 5 \times 5 5×5 线性内核,将在实验部分进行分析。
2.2 复杂度分析
Ghost module具有一个恒等映射和 m × ( s − 1 ) = n s × ( s − 1 ) m \times (s - 1) = \frac{n}{s} \times (s - 1) m×(s−1)=sn×(s−1) 个线性运算,并且每个线性运算的平均内核大小为 d × d d\times d d×d。理想情况下, n × ( s − 1 ) n \times (s-1) n×(s−1) 个线性运算可以具有不同的形状和参数,但是特别是考虑到CPU或GPU的实用性,在线推理会受到阻碍。因此,作者建议在一个Ghost模块中采用相同大小的线性运算(例如全 3 × 3 3 \times 3 3×3 或全 5 × 5 5 \times 5 5×5 )以高效实现Ghost module。使用Ghost module升级普通卷积的理论加速比为:
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 s × d × d ≈ s × c s + c − 1 ≈ s \begin{aligned} r_s & = \frac{n \times h' \times w' \times c \times k \times k}{\frac{n}{s} \times h' \times w' \times c \times k \times k + (s - 1) \times \frac{n}{s} \times h' \times w' \times d \times d} \\ & = \frac{c \times k \times k}{\frac{1}{s} \times c \times k \times k + \frac{s-1}{s} \times d \times d} \\ & \approx \frac{s \times 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+ss−1×d×dc×k×k≈s+c−1s×c≈s
其中 d × d d \times d d×d 的幅度与 k × k k \times k k×k 相似,并且 s < < c s << c s<<c。
同样,参数压缩比可以计算为:
r s = n × c × k × k n s × c × k × k + ( s − 1 ) × n s × d × d ≈ s × c s + c − 1 ≈ s \begin{aligned} r_s & = \frac{n \times c \times k \times k}{\frac{n}{s} \times c \times k \times k + (s - 1) \times \frac{n}{s} \times d \times d}\\ & \approx \frac{s \times c}{s + c-1}\\ & \approx s \end{aligned} rs=sn×c×k×k+(s−1)×sn×d×dn×c×k×k≈s+c−1s×c≈s
它大约等于加速比。
2.3 构建Ghost Net
2.3.1 Ghost Bottleneck
作者利用Ghost module制作了专门为小型CNN设计的Ghost bottleneck(G-bneck),如下图所示。
图 3. Ghost 瓶颈。 左:stride=1 的幽灵瓶颈; 右图:stride=2 的幽灵瓶颈。
Ghost bottleneck类似于ResNet中的基本残差块(Basic Residual Block),其中集成了多个卷积层和shortcut。Ghost bottleneck主要由两个堆叠的Ghost module组成。第一个Ghost module用作扩展层,增加了通道数。这里将输出通道数与输入通道数之比称为expansion ratio。第二个Ghost模块减少通道数,与shortcut路径匹配。然后,使用shortcut连接这两个Ghost module的输入和输出。这里借鉴了MobileNet-v2,第二个Ghost module之后不使用ReLU,其他层在每层之后都应用了批量归一化(BN)和ReLU非线性激活。上述Ghost bottleneck适用于stride= 1,对于stride = 2的情况,shortcut路径由下采样层和stride = 2的深度卷积(Depthwise Convolution)来实现。出于效率考虑,Ghost module中的初始卷积是点卷积(Pointwise Convolution)。
2.3.2 GhostNet
基于Ghost bottleneck,作者提出GhostNet,如下表所示。作者遵循MobileNet-v3的基本体系结构,然后使用Ghost bottleneck替换MobileNet-v3中的bottleneck。GhostNet主要由一系列Ghost bottleneck组成,其中Ghost bottleneck以Ghost module为构建基础。第一层是具有16个卷积核的标准卷积层,然后是一系列Ghost bottleneck,通道逐渐增加。这些Ghost bottleneck根据其输入特征图的大小分为不同的阶段。除了每个阶段的最后一个Ghost bottleneck是stride = 2,其他所有Ghost bottleneck都是stride = 1。最后,利用全局平均池化和卷积层将特征图转换为1280维特征向量以进行最终分类。SE模块也用在了某些Ghost bottleneck中的残留层,如下表所示。
表 1. GhostNet 的整体架构。 G-bneck 表示 Ghost 瓶颈。 #exp 表示扩展大小。 #out 表示输出通道的数量。 SE 表示是否使用 SE 模块。
与MobileNet-v3不同的是,这里用ReLU换掉了Hard-swish激活函数。尽管进一步的超参数调整等方法将进一步GhostNet的性能,但上表所提供的架构提供了一个基本设计参考。
3. 实验
3.1 超参数分析
Ghost module中含有两个超参数 s s s 和 d d d,其中 s s s 用于生成 m = n s m = \frac{n}{s} m=sn 个内在特征图, d d d 用于生成幻影特征图的卷积核大小(使用 d d d 深度卷积)。作者测试了这两个超参数的影响。
首先,作者固定 s = 2 s=2 s=2 在 d ∈ { 1 , 3 , 5 , 7 } d\in\{1, 3, 5, 7\} d∈{1,3,5,7} 范围中调整 d d d,并在下表中列出CIFAR-10验证集上的结果。可以看到,当 d = 3 d=3 d=3 时的Ghost module的性能优于其他的Ghost module。这是因为大小为 1 × 1 1 \times 1 1×1 的内核无法在特征图上引入空间信息,而较大的内核(例如 d = 5 → 5 × 5 d=5 \rightarrow 5 \times 5 d=5→5×5 或 d = 7 → 7 × 7 d=7 \rightarrow 7 \times 7 d=7→7×7)会导致过拟合和更多计算量。因此,在以下实验中作者采用 d = 3 d=3 d=3 来提高有效性和效率。
在研究了内核大小的影响之后,作者固定 d = 3 d=3 d=3 并在 s ∈ { 2 , 3 , 4 , 5 } s \in \{2, 3, 4, 5 \} s∈{2,3,4,5} 的范围内调整超参数 s s s。实际上, s s s 与所得网络的计算成本直接相关,即较大的 s s s 导致较大的压缩率和加速比。结果如下表所示。
从表中的结果可以看出,当作者增加 s s s 时,FLOP显着减少,并且准确性逐渐降低,这是在预期之内的。特别地,当 s = 2 s=2 s=2,也就是将VGG-16压缩 2 × 2\times 2× 时,Ghost module的性能甚至比原始模型稍好,表明了本文所提出的Ghost module的优越性。
作者将Ghost module用在VGG-16和ResNet-56框架上,然后和几个代表性的最新模型进行了比较。如下表所示。
表 5. 在 CIFAR-10 上压缩 VGG-16 和 ResNet-56 的最先进方法的比较。 - 表示没有可用的报告结果。
Ghost-VGG-16 ( s = 2 s=2 s=2)以最高的性能(93.7%)胜过竞争对手,但FLOPs明显减少。 对于已经比VGG-16小得多的ResNet-56,基于Ghost模块的模型可以将计算量降低一半时获得可比的精度,还可以看到,其他具有相似或更大计算成本的最新压缩模型方法所获得的准确性低于Ghost模型。
3.2 特征图可视化
作者还可视化了Ghost模块的特征图,如下图所示。
图 4. Ghost-VGG-16 第 2 层的特征图。 左上图是输入,左边红框中的特征图来自初级卷积,右边绿框中的特征图是深度变换后的。
上图展示了Ghost-VGG-16的第二层特征,左上方的图像是输入,左红色框中的特征图来自初始卷积,而右绿色框中的特征图是经过深度卷积后的幻影特征图。尽管生成的特征图来自原始特征图,但它们之间确实存在显着差异,这意味着生成的特征足够灵活,可以满足特定任务的需求。
与之对比的还有原始VGG-16第二层卷积生成的特征图如下:
3.3 大型模型实验
作者在ImageNet数据集上对Ghost module的性能进行了实验,并和目前最先进的模型进行了比较。
可以看到,对比ResNet-50,Ghost-ResNet-50 (
s
=
2
s=2
s=2)相比
s
=
4
s=4
s=4效果要好,Top-1准确率高达75.0%,但二者的FLOPs和Weights不在一个数量级。
- Ghost-ResNet-50 ( s = 2 s=2 s=2)上方即为同一数量级,对比其他对ResNet-50压缩的策略,Ghost-ResNet-50 ( s = 2 s=2 s=2)有最低的FLOPs和最高的准确率。
- Ghost-ResNet-50 ( s = 4 s=4 s=4)上方即为同一数量级,对比其他对ResNet-50压缩的策略,Ghost-ResNet-50 ( s = 4 s=4 s=4)在持有最高准确率的同时,模型的参数和FLOPs也是比较低的。
4. GhostNet性能
4.1 ImageNet分类数据集
为了验证所提出的 GhostNet 的优越性,我们对 ImageNet 分类任务进行了实验。 我们遵循 ShuffleNet 中使用的大部分训练设置,除了在 8 个 GPU 上批量大小为 1,024 时初始学习率设置为 0.4。 所有结果均在 ImageNet 验证集上以单crop top-1 性能报告。 对于 GhostNet,为简单起见,我们在主卷积中设置内核大小 k = 1 k = 1 k=1,在所有 Ghost 模块中设置 s = 2 s = 2 s=2 和 d = 3 d = 3 d=3。
选择了几个现代小型网络架构作为竞争对手,包括 MobileNet 系列,ShuffleNet 系列,ProxylessNAS,FBNet,MnasNet 等。结果总结在表 7 中。模型分为通常用于移动应用程序的三个计算复杂度级别,即 ~ 50、~ 150 和 200-300 MFLOPs。 从结果中,我们可以看到,通常较大的 FLOP 会导致这些小型网络的准确性更高,这表明了它们的有效性。 我们的 GhostNet 在各种计算复杂度级别上始终优于其他竞争对手,因为 GhostNet 在利用计算资源生成特征图方面更有效。
启发:
- 通过拉宽网络进而提升其准确率(这样在类似准确率的情况下,对比网络的其他参数就有可比较性了)
实际推理速度。 由于所提出的 GhostNet 是为移动应用程序设计的,我们使用 TFLite 工具进一步测量了 GhostNet 在基于 ARM 的手机上的实际推理速度。 按照 [21, 44] 中的常见设置,我们使用批量大小为 1 的单线程模式。从图 7 的结果中,我们可以看到 GhostNet 在相同延迟的情况下比 MobileNetV3 获得了大约 0.5% 的 top-1 准确率, 和 GhostNet 需要更少的运行时间来实现类似的性能。 例如,准确度为 75.0% 的 GhostNet 只有 40 毫秒的延迟,而准确度相近的 MobileNetV3 处理一张图像需要大约 45 毫秒。 总体而言,我们的模型通常优于著名的最先进模型,即 MobileNet 系列、ProxylessNAS、FBNet和 MnasNet。
4.2 COCO目标检测数据集
为了进一步评估 GhostNet 的泛化能力,我们在 MS COCO 数据集上进行了对象检测实验。 我们使用 trainval35k 分割作为训练数据,并在 [32, 33] 之后以 minival 分割的平均平均精度 (mAP) 报告结果。 具有特征金字塔网络 (FPN) [43, 32] 的两阶段 Faster R-CNN 和单阶段 RetinaNet [33] 都用作我们的框架,GhostNet 作为主干特征提取器 (backbone) 的替代品。 我们使用 SGD 对 ImageNet 预训练权重的 12 个 epoch 训练所有模型,并使用 [32, 33] 中建议的超参数。 输入图像的大小调整为短边为 800,长边不超过 1333。表 8 显示了检测结果,其中通常使用 224 × 224 图像计算 FLOP。 由于计算成本显着降低,GhostNet 在单阶段 RetinaNet 和两阶段 Faster R-CNN 框架上实现了与 MobileNetV2 和 MobileNetV3 类似的 mAP。
5. 总结
为了减少最新的深度神经网络的计算成本,本文提出了一种用于构建高效的神经网络结构的新型Ghost module。Ghost module将原始卷积层分为两部分,首先使用较少的卷积核来生成原始特征图,然后,进一步使用廉价的线性变换操作以高效生产更多幻影特征图。在基准模型和数据集上进行的实验表明,该方法是一个即插即用的模块,能够将原始模型转换为更紧凑的模型,同时保持可比的性能。此外,在效率和准确性方面,使用提出的新模块构建的GhostNet均优于最新的轻量神经网络,如MobileNet-v3。