在嵌入式设备上设计卷积网络很困难,主要因为内存和计算资源有限。特征图冗余是这些CNN的一个重要特点,但是很少在网络结构设计上得到研究。本文提出了一个创新的 Ghost 模块,通过低成本的操作输出更多的特征图。基于一组内在的特征图,作者使用一系列低成本的线性变换就可以产生许多的 ghost 特征图,可以充分地揭示内在特征的信息。Ghost 模块可以作为一个即插即用的组建来对现有卷积网络做升级。Ghost bottlenecks 用于堆叠 Ghost 模块,然后我们就可以构建轻量级的 GhostNet。在基准上的试验表明,Ghost模块可以作为基线模型卷积层的替代选项。在 ImageNet ILSVRC-2012分类数据集上,它取得了更高的识别表现( 75.7 % 75.7\% 75.7%的 top-1准确率),比MobileNetV3还高,而计算成本相当。代码放在了:https://github.com/huawei-noah/ghostnet.
深度卷积网络在各种计算机视觉任务上表现不俗,如图像识别、目标检测、语义分割等。传统CNN通常需要大量的参数和浮点计算来得到满意的准确率,比如对于输入为 224 × 224 224\times 224 224×224的图片,ResNet-50 差不多有2560万个参数,需要41亿次的FLOPs。因此,一个最新的趋势是探索方便移植的、高效的神经网络结构,在移动设备也可取得不错的效果(如智能手机、自动驾驶汽车)。
人们提出了诸多方法来研究深度学习模型的小型化,如网络剪枝、量化、知识蒸馏等。 Han 等人提出可以剪去神经网络中不重要的权重。[31] 利用 l 1 l_1 l1 范数正则来裁剪CNN中的滤波器。[42]将网络权重和激活量化为 1-bit 数据,实现较高的压缩率和加速。[19] 引入了知识蒸馏,将大模型的知识迁移到小模型上。但是,这些方法的表现都以作为基线模型的预训练模型为上界。
高效率的神经结构对于构建高性能的神经网络非常有意义,它所需的参数和计算量更少,最近取得了显著成功。这类方法也给自动搜索方法提供了研究方向。例如,MobileNet 利用 depthwise和pointwise卷积,构建了一个计算模块去近似传统的大滤波器卷积层,性能相当。ShuffleNet 进一步研究了通道混洗操作,增强轻量模型的性能。
网络特征图里的丰富的信息确保了对输入数据的全面理解。例如,图1是 ResNet-50 对输入图像所产生的特征图,可看到有许多相似的特征图,就像彼此的 ghost 似的。特征图冗余是深度神经网络的重要特点之一。本文并没有排斥冗余的特征图,而是以高效率的方式来利用它。
本文作者引入了一个新的 Ghost 模块,用较少的参数输出更多的特征。一般的卷积层可以分为2个部分。第一部分为普通的卷积,它们的总数可以被严格控制。有了第一部分的特征图,我们就可以利用一系列的简单的线性操作来输出更多的特征图。和一般的卷积网络相比,Ghost模块没有改变输出特征图的大小,但是参数量和复杂度都减少了。基于Ghost模块,作者设计了一个高效的网络结构,叫做GhostNet。作者首先将benchmark网络结构中的卷积层替换,证明Ghost模块的性能,然后在多个benchmark视觉数据集上验证GhostNet的优越性。实验结果显示,Ghost模块能够降低一般卷积层的算力消耗,而识别表现差不多。在移动设备上进行测试,GhostNet 超越了state of the art 的网络模型如MobileNetV3。
这里作者介绍了下现有的轻量化模型,有2个部分:模型压缩和小型化结构设计。
对于给定的网络,模型压缩旨在减少计算量、电力消耗和存储空间。剪枝会剪去神经元中不重要的连接。通道裁剪进一步移除不重要的通道,加速更简单。模型量化用离散的值来表示网络的权重或激活,用于压缩网络与加速计算。二值化方法使用1-bit值,极大地加速了模型运算。张量分解降低参数和计算量,研究模型的冗余和权重的低秩性质。知识蒸馏利用更大的模型来教小模型,提升小模型的性能。这些方法的性能通常取决于给定的预训练模型。基础操作和结构的提升会让这些方法走的更远。
为了在嵌入式设备上部署网络模型,人们提出了一系列的小模型。Xception 利用 depthwise 卷积操作,高效率地使用模型参数。MobileNets 是一系列的轻量网络模型,它们基于 depthwise separable 卷积。MobileNetV2 提出了 inverted residual block,MobileNetV3则进一步使用了AutoML 方法,实现了更优的性能表现,FLOPs更少。ShuffleNet 引入了通道混洗操作,提升通道组之间的信息流动。ShuffleNetV2 进一步思考了硬件平台的事实速度。尽管这些方法都取得了不错的表现,FLOPs少了许多,但是特征图之间的冗余与联系却没被很好地研究。
本章中,作者首先介绍Ghost模块,利用较少的滤波器来产生更多的特征图,然后设计了一个新的GhostNet,非常高效而表现优异。
深度网络经常由大量的卷积构成,导致计算量很大。尽管MobileNet和ShuffleNet 引入了depthwise卷积和混洗操作,使用较小的卷积滤波器构建更高效的CNN,但是剩下的 1 × 1 1\times 1 1×1卷积仍会消耗大量的内存和FLOPs。
如图1所示,主流CNN计算出来的中间特征图有大量的冗余,作者提出降低所需的资源,如卷积滤波器。实际上,给定输入数据 X ∈ R c × h × w X\in \mathbb{R}^{c\times h\times w} X∈Rc×h×w,其中 c c c是输入通道数, h , w h,w h,w是输入的高度和宽度。产生 n n n个特征图的任意卷积层可表示如下:
Y = X ∗ f + b Y=X\ast f+b Y=X∗f+b
其中 ∗ \ast ∗是卷积操作, 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 ′ , w ′ h', w' h′,w′是输出数据的高度和宽度, k × k k\times k k×k是卷积滤波器 f f f的核大小。在一次卷积操作中,所需的FLOPs数量等于 n ⋅ h ′ ⋅ w ′ ⋅ c ⋅ k ⋅ k n\cdot h'\cdot w'\cdot c \cdot k \cdot k n⋅h′⋅w′⋅c⋅k⋅k,通常非常大,有几十上百万,因为滤波器的个数 n n n和通道个数 c c c一般都很大(如256或512)。
根据上面的等式, f f f和 b b b的参数个数由输入特征图和输出特征图的维度来决定。如图1中,卷积层的输出特征图通常有很多的冗余,有些特征图很相似。作者指出我们并不需要生成这些重复的特征图,它们会消耗大量的FLOPs和参数。假设输出特征图是一些内在特征图的 ghosts,只需一些低成本的变换。这些内在特征图通常较小,由一般的卷积滤波器产生。 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\ast 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\leq n m≤n,为了简洁些,偏置项被省略了。为了保证输出特征图的空间大小( h ′ , w ′ h', w' h′,w′)一致,超参数如滤波器大小、步长、padding与一般的卷积一样。为了进一步得到 n n n个特征图,根据下面的等式,作者对于 Y ′ Y' Y′的每个内在特征,提出应用一系列廉价的线性操作,产生 s s s个 ghost 特征:
y i j = Φ i , j ( y i ′ ) , ∀ i = 1 , . . . , m , j = 1 , . . . , s y_{ij} = \Phi_{i,j}(y_i'), \forall i=1,...,m, j=1,...,s yij=Φi,j(yi′),∀i=1,...,m,j=1,...,s
其中 y i ′ y_i' yi′是 Y ′ Y' Y′中第 i i i个内在特征图,上面函数中的 Φ i , j \Phi_{i,j} Φi,j是第 j j j个线性操作,产生第 j j j个ghost特征图 y i j y_{ij} yij, y i ′ y_i' yi′可以有一个或多个ghost 特征图 { y i j } j = 1 s \{y_{ij}\}_{j=1}^s {yij}j=1s。最后一个 Φ i , s \Phi_{i,s} Φi,s是恒等映射,保留内在特征图,如图2(b)所示。
利用上述等式,我们可以得到 n = m ⋅ s n=m\cdot s n=m⋅s个特征图, Y = [ y 11 , y 12 , . . . , y m s ] Y=[y_{11}, y_{12}, ..., y_{ms}] Y=[y11,y12,...,yms],作为Ghost模块的输出数据,如图2(b)所示。注意,线性操作 Φ \Phi Φ对每个通道进行计算,计算成本要远比传统的卷积低。实际上,在Ghost模块中可能有多个不同的线性操作,如 3 × 3 3\times 3 3×3和 5 × 5 5\times 5 5×5线性核,会在实验部分做分析。
与现有方法的不同。Ghost模块与现有卷积方法的不同之处在于:i) 与[21],[61] 中卷积相比,它们使用了大量的 1 × 1 1\times 1 1×1 pointwise 卷积,Ghost模块中的卷积核大小可以定制化。ii) 现有方法[21,44,61,40] 采用了pointwise 卷积来处理跨通道的特征,然后利用 depthwise 卷积来处理空间信息。相反,Ghost模块采用一般的卷积,首先生成一些内在特征图,然后利用廉价的线性操作来增强特征,增加通道数。iii) 在之前的结构中,处理每个特征图的操作都会受到 depthwise卷积或shift操作的限制,而Ghost模块中的线性操作则非常多样。iv) 此外,恒等映射与Ghost模块中的线性变换平行,为了保留内在特征图。
复杂度分析。由于我们可以利用等式3中的Ghost模块来产生与一般卷积层相同数量的特征图,我们可以很容易地将Ghost模块整合入现有的网络结构中,降低计算成本。这里作者进一步分析了Ghost模块使用内存的情况和理论上的加速。例如,它里面有1个恒等映射和 m ⋅ ( s − 1 ) = n s ⋅ ( s − 1 ) m\cdot (s-1) = \frac{n}{s}\cdot (s-1) m⋅(s−1)=sn⋅(s−1)个线性操作,每个线性操作的平均卷积核大小等于 d × d d\times d d×d。 n ⋅ ( s − 1 ) n\cdot (s-1) n⋅(s−1)个线性操作可以有不同的形状和参数,但是推理时可能会被CPU或GPU的利用率所限制。因此为了实现更高效,作者建议在Ghost模块中使用相同大小(如 3 × 3 , 5 × 5 3\times 3, 5\times 5 3×3,5×5)的线性操作。利用Ghost模块提升传统卷积的理论加速比率是
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 r_s = \frac{n\cdot h'\cdot w' \cdot c\cdot k\cdot k}{\frac{n}{s} \cdot h' \cdot w' \cdot c\cdot k\cdot k + (s-1) \cdot \frac{n}{s} \cdot h' \cdot w' \cdot d\cdot d} = \frac{c\cdot k\cdot k}{\frac{1}{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 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\leq c s≤c。相似地,压缩率可以计算为:
r c = n ⋅ c ⋅ k ⋅ k n s ⋅ c ⋅ k ⋅ k + ( s − 1 ) ⋅ n s ⋅ d ⋅ d ≈ s ⋅ c s + c − 1 ≈ s r_c = \frac{n\cdot c\cdot k\cdot k}{\frac{n}{s}\cdot c\cdot k\cdot k + (s-1)\cdot \frac{n}{s}\cdot d\cdot d} \approx \frac{s\cdot c}{s+c-1} \approx s rc=sn⋅c⋅k⋅k+(s−1)⋅sn⋅d⋅dn⋅c⋅k⋅k≈s+c−1s⋅c≈s
这和Ghost模块所带来的加速比率相等。
Ghost bottleneck。利用Ghost模块,作者针对小型CNN特别提出了Ghost bottleneck(G-bneck)。如图3所示,Ghost bottleneck 与基本的残差模块相似,整合了多个卷积层和短路连接。G-bneck 主要由两个堆叠的Ghost模块组成。第一个ghost模块作为扩张层,增加通道数。作者将输出通道和输入通道的个数比率叫做扩张比率。第二个Ghost模块降低通道数量,来匹配短路连接。然后在这俩Ghost模块的输入和输出之间通过短路连接起来。在每层之后都使用一个BN和ReLU非线性函数,和MobileNetV2建议的一样,在第二个Ghost模块后没有使用ReLU。
GhostNet。基于ghost bottleneck,作者提出了GhostNet,如表7所示。作者基本延续了MobileNetV3的结构,因为它效果很好,作者将MobileNetV3中的bottleneck block替换为Ghost bottleneck。GhostNet 主要由一组Ghost bottleneck 和Ghost模块构成。第一层是一个标准的卷积层,有16个滤波器,然后是一系列的Ghost bottlenecks,通道数逐渐增加。Ghost bottlenecks 被划分为不同的阶段,根据它们输入特征图的大小。所有的 Ghost bottlenecks 都使用了 s t r i d e = 1 stride=1 stride=1,除了每个阶段中的最后一个, s t r i d e = 2 stride=2 stride=2。最后,我们使用全局平均池化和卷积层来对特征图进行变换,变为1280维的特征向量,用于最终的分类。如表7,对于ghost bottleneck 中的残差层作者也使用了 Squeeze和Excite模块。与MobileNetV3相反,作者并没有使用 hard-swish 非线性函数,因为它延迟比较高。该网络结构为推理提供了一个基本的设计,尽管进一步的参数调优或自动结构搜索可能会提升性能。
宽度乘数。尽管在表7中给定的网络结构的延迟已经比较低,准确率也还可以,在一些场景中我们可能需要较小而更快的,或者更准确的模型。针对特殊的需要,作者简单地在每一层都对通道个数乘一个因子 α \alpha α。 α \alpha α叫做宽度乘数,因为它可以改变网络的宽度。作者将宽度乘数为 α \alpha α的GhostNet叫做 GhostNet- α × \alpha\times α×。宽度乘数可以控制模型的大小和计算量,约为 α 2 \alpha^2 α2。通常, α \alpha α越小,延迟就越低,表现就越差。
Pls read paper for more info.