分享

'幽灵网络' | 华为高效轻量级网络(附源码链接)

 taotao_2016 2020-07-03

计算机视觉研究院专栏

作者:Edison_G

这次我们“计算机视觉研究院”免费公开全部内容,有兴趣的可以一起来学习,一起来实践完成一次先进性的过程,该新技术值得好好学习!
由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络(CNNs)是困难的。特征映射中的冗余是CNN成功的一个重要特征,但在神经结构设计中很少被研究。
在训练较好的深度网络的特征图中,丰富甚至冗余的信息常常保证了对输入数据的全面理解。例如在输入图像的一些特征映射,并且存在许多相似的特征映射对,就像彼此的“幽灵”一样。
作者并没有避免冗余的特性映射,而是倾向于采用它们,但采用的是一种低成本的方式。

1.摘要

作者提出了一种新的Ghost模块,用于从简单的操作中获取更多的特征映射。基于一组内在特征映射,应用一系列简单的线性变换来生成许多Ghost特征映射,这些映射可以充分揭示内在特征的信息。提出的Ghost模块可以作为一个即插即用的组件来升级现有的卷积神经网络。Ghost瓶颈被设计成stack Ghost modules,然后可以很容易地建立轻量级的GhostNet。 

 在基准上进行的实验表明,所提出的Ghost模块是基线模型中卷积层的一个令人印象深刻的替代方案,GhostNet可以获得更高的识别性能(例如在ImageNetILSVRC-2012分类数据集上,与具有类似计算成本的MobileNetV3相比,准确率为75.7)。

2.背景

高效的神经结构设计具有很高的潜力,可以建立高效的深度网络,参数和计算较少,最近取得了相当大的成功。这种方法还可以为自动搜索方法提供新的搜索单元。例如,MobileNet利用深度卷积和点卷积构造了一个单元,用于用较大的滤波器逼近原始卷积层,并取得了类似的性能。ShuffleNet进一步探索了一种通道shuffle操作(这个不是很好翻译,但是通过具体操作可以理解),以提高轻量级模型的性能。 

例如上图显示了ResNet-50生成的输入图像的一些特征映射,并且存在许多类似的特征映射对,就像彼此的“幽灵”一样。作者并没有避免冗余的特性映射,而是倾向于采用它们,但采用的是一种低成本的方式。

今天我们就介绍了这种新的Ghost模块,通过使用较少的参数来生成更多的特征。具体来说,深度神经网络中的一个普通卷积层将被分成两部分。第一部分涉及普通卷积,但它们的总数将受到严格控制。给定第一部分的固有特征映射,然后应用一系列简单的线性操作来生成更多的特征映射。在不改变输出特征映射大小的情况下,与vanilla卷积神经网络相比,该Ghost模块中所需的参数总数和计算复杂性都有所降低。基于Ghost模块,建立了一种高效的神经网络架构,即GhostNet。 作者首先在基准神经架构中替换原始卷积层,以证明Ghost模块的有效性,然后验证GhostNet在几个基准视觉数据集上的优越性。实验结果表明,所提出的Ghost模块能够降低通用卷积层的计算成本,同时保持相似的识别性能,并且GhostNet可以在移动设备上具有快速推理的各种任务上超越最先进的有效深度模型,如MobileNetV3。

3.相关工作
Model Compression
网络剪枝、低比特量化、知识蒸馏等方法的性能往往是有上限的,因为使用了预先训练的深度神经网络作为其基线。因此这些方法的性能通常取决于给定的预训练模型。对基本操作和体系结构的改进将使它们走得更远。

Compact Model Design

虽然Xception、MobileNets、MobileNetV2、MobileNetV3、ShuffleNet和ShuffleNetV2等轻量级模型以很少的FLOPs获得了很好的性能,但是它们特征图之间的相关性和冗余性一直没有得到很好的利用

4.算法框架

Ghost Module for More Features

因为在由主流CNNs网络计算得到的中间特征映射中广泛存在的冗余,如上图。作者建议减少需要的资源,即用来生成这些特征映射的卷积过滤器。实际上,给定输入X∈Rc*h*w,其中c为channels数,h和w分别为输入的高和宽。用来生成n特征映射的任意卷积层的操作公式为:

其中*表示卷积操作,b为bias项。Y∈Rh' x w' x n是有着n个channels的输出特征映射,f∈Rc x k x k x n是该层的卷积过滤器。在该卷积操作中,需要的FLOPs数为n*h'*w'*c*k*k,该值通常很大,因为过滤器数量n和channel数量c一般很大

根据上面的公式,需要优化的参数数量(f和b)由输入和输出特征图的维数明确确定。如上图所示,卷积层的输出特征映射通常包含大量冗余,其中一些可能彼此相似。作者指出没有必要用大量的FLOPs和参数一个一个地生成这些冗余的特征图。假设输出的特性映射是一些带有一些cheap转换的内在特性映射的“幽灵”。这些固有的特征图通常较小,由普通的卷积过滤器产生。

具体来说,m个内在特征映射Y'∈ Rh' x w' x m是使用一个基本卷积操作生成的:

为了进一步获得想要的n个特征映射,作者提出在Y'中的每个内在特征中应用一系列的cheap线性操作来生成s个ghost特征,如下函数所示:

其中,yi′表示在Y'中的第i个内在特征映射,在上式中Φi,j是用于生成第j个ghost特征映射yij的第j个线性操作,也就是说yi′可以有一个甚至多个ghost特征映射{yij}sj=1。最后一个Φi,s是用来保存如下图(b)所示的内在特征映射的identity映射。

通过使用上等式,作者能够获得n=m*s特征映射,Y=[y11,y12,··· ,yms]即如上图(b)所示的一个Ghost模块的输出数据。注意,线性操作Φ在每个通道的计算成本远小于普通的卷积。在实际应用中,在一个Ghost模块中可能会有几种不同的线性运算,例如3×3和5×5的线性内核,这些将在实验部分进行分析。

Difference from Existing Methods

提出的Ghost模块与现有的高效卷积方案有很大的不同。如:

1)与[Xiangyu Zhang, Xinyu Zhou, Mengxiao Lin, and Jian Sun. Shufflenet: An extremely efficient convolutional neural net- work for mobile devices. CVPR]中广泛使用1×1 pointwise卷积的单元相比,Ghost模块中的主卷积可以定制内核大小;

2)现有的方法采用pointwise卷积跨通道处理特征,然后采用depthwise卷积处理空间信息。相比之下,Ghost模块采用普通卷积先生成少量的内在特征图,然后利用cheap的线性运算来扩充特征,增加channels;

3)在以往的高效架构中,处理每个特征映射的操作仅限于depthwise卷积或shift操作,而Ghost模块中的线性操作可以有较大的多样性;

4)另外,在Ghost模块中,将identity映射与线性变换并行进行,保持内在特征映射。

Analysis on Complexities.

由于可以利用上等式中提出的Ghost模块生成与普通卷积层相同数量的特征映射,因此可以很容易地将Ghost模块集成到现有设计良好的神经结构中,从而降低计算成本。

在这里,进一步分析了使用Ghost模块在内存使用和理论上的加速方面的好处。比如这里有一个identity映射和m*(s-1)=(n/s)*(s-1)个线性操作,每个线性操作的平均内核大小为d x d。理想情况下,n*(s-1)个线性操作能有不同形状和参数,但是线下推断将会受到阻碍,尤其是考虑到CPU或GPU cards的使用。因此为了高效实现,作者建议在一个Ghost模块中使用相同大小的线性操作(如3x3、5x5)。Ghost模块升级普通卷积的理论加速比为:

同样地,压缩比计算为:

Building Efficient CNNs

Ghost Bottlenecks:利用Ghost模块的优点,介绍了专门为小型CNNs设计的Ghost bottleneck(G-bneck)。

Ghost bottleneck看起来类似于ResNet中的基本residual块,其中集成了几个卷积层和shortcut。提出的ghost bottleneck主要由两个堆叠的ghost模块组成。第一个Ghost模块作为扩展层,增加通道的数量。作者把输出通道数与输入通道数之比称为expansion ratio;第二个Ghost模块减少通道的数量以匹配shortcut。然后将这两个Ghost模块的输入和输出连接起来。除了根据MobileNetV2的建议在第二个Ghost模块之后不使用ReLU外,每一层之后都使用batch归一化(BN)和ReLU非线性函数。

上面描述的Ghost bottleneck是stride=1的情况。对于stride=2的情况,通过向下采样层实现shortcut路径,并在两个Ghost模块之间插入stride=2的depthwise卷积。在实际应用中,Ghost模块中主要的卷积是pointwise卷积,以提高其效率。

GhostNet

作者基本上遵循了MobileNetV3架构的优势,用我们的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)模块也适用于某些ghost bottleneck的残层,如下表所示。

与MobileNetV3相比,作者没有使用hard-swish非线性函数,因为它有很大的延迟。所提出的体系结构提供了一个基本的设计参考,但进一步的超参数调整或基于ghost模块的自动体系结构搜索将进一步提高系统的性能。

Width Multiplier

尽管上表中的给定架构已经可以提供低延迟和保证精度,但在某些场景中,可能需要更小、更快的模型或更高的特定任务的精度。为了期望的需求可以定制网络,可以简单地在每一层channels的数量上均匀地乘以一个系数α。这个因子α称为宽度乘数,因为它可以改变整个网络的宽度。作者表示带有宽度乘数α的GhostNet为GhostNet-α×。宽度乘数可以控制模型大小和计算成本大约α2。通常小α导致更低的延迟和更低的性能,反之亦然。

5.实验分析

从上表可以看出,所有的MSE值都非常小,这说明在深度神经网络中,特征映射之间存在很强的相关性,这些冗余特征可以由多个固有的特征生成。除了上述实验中用到的卷积,还可以探索其他一些低成本的线性操作来构造Ghost模块,如仿射变换(affine)和小波变换(wavelet)。然而,卷积是一种高效的运算,已经得到了当前硬件的良好支持,它可以涵盖许多广泛使用的线性运算,如平滑、模糊、运动等。此外,虽然我们也可以学习关于Φ线性操作中每个过滤器的大小 、不规则的模块将降低计算单元的效率(例如CPU和GPU)。

在VGG-16架构上测试了这两个参数的影响。首先固定s = 2并调节d为{1,3,5,7}中之一,并在下表中列出了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与得到的网络的计算代价直接相关,即s越大,压缩比和加速比越大。从上表的结果可以看出,当增加s的时候,FLOPs明显减小,准确率逐渐降低,这是可以预料到的。特别是当s = 2时,也就是将VGG-16压缩2倍,提出的方法比原模型的性能稍好一些,说明了所提出的Ghost模块的优越性。

可视化Ghost模块的特征图

最后在检测数据集COCO的测试结果:

✄------------------------------------------------
如果想加入我们“计算机视觉研究院”,请扫二维码加入我们。我们会按照你的需求将你拉入对应的学习群!
计算机视觉研究院主要涉及深度学习领域,主要致力于人脸检测、人脸识别,多目标检测、目标跟踪、图像分割等研究方向。研究院接下来会不断分享最新的论文算法新框架,我们这次改革不同点就是,我们要着重”研究“。之后我们会针对相应领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多