大数跨境
0
0

深入研究模型压缩经典Ghostnet:如何用少量计算生成大量特征图?

深入研究模型压缩经典Ghostnet:如何用少量计算生成大量特征图? 极市平台
2021-02-03
3
导读:介绍了华为的GhostNet和GhostSR两个架构的原理以及代码解读。
↑ 点击蓝字 关注极市平台

作者丨科技猛兽
审稿丨邓富城
编辑丨极市平台

极市导读

 

本文主要介绍了华为的GhostNet和GhostSR两个架构的原理以及代码解读。Ghostnet 仅通过少量计算就能生成大量特征图的结构,GhostSR 基于对超分模型特征图的观察,所以仅通过移位操作(shift operation)就能生成大量 "Ghost" 特征图。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

1 GhostNet: More Features from Cheap Operations (CVPR 2020 Oral)
1.1 GhostNet原理分析
1.2 GhostNet代码解读
2 GhostSR: Learning Ghost Features for Efficient Image Super Resolution
2.1 GhostSR原理分析

1 GhostNet

https://arxiv.org/abs/1911.11907
  • 1.1 GhostNet原理分析:
华为诺亚端侧作品Ghostnet: 仅通过少量计算(cheap operations)就能生成大量特征图的结构。
引言:
卷积神经网络推动了计算机视觉诸多任务的进步,比如图像识别、目标检测等。但在嵌入式设备上部署深度学习模型的一个困难就是模型过大,以及所需要的计算量过大。比如我们所熟悉的ResNet-50,它有大概25.6M的参数量,按照32位存储,就需要102.4MB的内存空间,同时处理一张  的图片的计算量大概是4.1B FLOPs。因此,深度神经网络设计的最新趋势是探索 PortableEfficient 的网络架构,为移动设备提供acceptable performance。
一些研究提出了模型的压缩方法,比如剪枝、量化、知识蒸馏等;还有一些则着重于高效的网络结构设计,比如MobileNet,ShuffleNet等。
这个工作从减少冗余特征图的角度出发,提出了一种全新的神经网络基本单元Ghost模块,从而搭建出轻量级神经网络架构GhostNet。
在一个well-trained的深度神经网络中,通常会包含丰富甚至冗余的特征图,以保证对输入数据有全面的理解。如下图1所示是在ResNet-50中,将经过第一个残差块处理后的特征图拿出来的可视化结果:
图1:ResNet-50中一些生成的特征
作者使用相同颜色的框标记相似的特征图,可以发现这些特征图中有些是两两相似的 (使用扳手图案表示),这就意味着该对中的一个特征图可以通过廉价操作将另一特征图变换而获得,所以,这对特征图中的一个可以视为另一个的一个 "幻影 (Ghost)"。有了这一发现,作者就提出:并非所有特征图都要用卷积操作来得到,“幻影”特征图可以用更廉价的操作来生成。
本文提出的Ghost模块是一种新颖的即插即用模块,主要目的是使用更少的参数来生成更多特征图 (generate more features by using fewer parameters)。具体来说,深度神经网络中的每一个卷积层将会分为两部分:第一部分是常规的卷积,但是特征图的数量将会严格控制,因为不能让计算量太大;那第二部分也得生成一些特征图,只是不采取常规的卷积来生成,而是通过简单的 "线性变换 (Linear Transformation)" 来生成。与普通卷积神经网络相比,在不更改输出特征图大小的情况下,该Ghost模块中所需的参数总数和计算复杂度均已降低。这就是Ghost模块。
基于Ghost模块,作者建立了一个高效的神经架构,即GhostNet。作者首先在基准神经体系结构中替换原始卷积层,以证明Ghost模块的有效性,然后在几个基准视觉数据集上验证GhostNet网络的优越性。实验结果表明,所提出的Ghost模块能够在保持相似识别性能的同时降低通用卷积层的计算成本。此外,在效率和准确性方面,使用提出的新模块构建的GhostNet均优于最新的轻量神经网络,如MobileNetV3。
具体方法:
MobileNet 和 ShuffleNet通过引入深度可分离卷积 (Depthwise Convolution) 与混洗操作 (Shuffle Operation) 来构建高效的CNN,但其余 卷积层仍将占用大量内存和FLOPs。
假设输入特征是  ,卷积核表示为  ,输出特征是  ,则常规的卷积操作可以写作:
式中, 和  分别是输出数据的高度和宽度, 分别是卷积核  的内核大小。在此卷积过程中,卷积核数量  和通道数  通常非常大 (例如256或512) ,这个操作的计算量是: 
图2:常规卷积层和Ghost module
根据上式(1),整个操作的计算量与输入和输出特征映射的维度相关,而结合一开始的发现,其实输出特征里面有很多特征是相似的 "幻影" 特征,因此,没有必要使用大量的FLOP和参数来生成这些冗余的特征图。我们假设,只有  个原始特征图  是使用一次卷积生成的:
式中, 是使用的卷积核, ,为简单起见,这里省略了偏差项。并且所有的超参数 (filter size, stride, padding) 都与普通卷积中的超参数相同,这样,输出特征的空间大小  和  保持一致。
但是现在我们只获得了  个特征图,为了补齐  个特征图,作者对  中的每个特征进行一次廉价的线性变换,得到  个 "幻影" 特征图。
式中,  代表第  个原始特征图,它经过线性变换  ,得到第  个 "幻影" 特征图  ,即:每个原始特征图  可以生成  个 "幻影" 特征图  。最后的 是用于保留原始特征图的恒等映射,如图2(b)所示。
通过使用廉价操作,我们可以获得  个特征图  作为 Ghost 模块的输出数据。注意,线性运算  在每个通道上运行,其计算量比普通卷积少得多。实际上,Ghost 模块中可能有几种不同的线性运算,例如  和  线性内核,将在实验部分进行分析。
问:这里的 "廉价的线性运算 (cheap linear operation)" 具体是什么?
答: cheap operation其实就是group convolution,group数 = input channel number,相当于深度可分离卷积 (Depthwise Convolution)。
问:与已有的方法相比区别在哪里?
答: 以往的方法 (Depthwise Convolution)等使用Depthwise Convolution处理空间信息,使用Pointwise Convolution处理不同channel之间的信息。相比之下,Ghost 模块先使用常规的卷积得到一些特征,再使用廉价线性变换得到另一些特征。而且,这个 cheap linear operation 可以有其他很多种变化。比如说 affine transformationwavelet transformation
复杂度的分析:
我们来进一步分析通过使用Ghost模块带来的内存和计算量的收益。具体来说,Ghost模块具有一个恒等映射和  个线性运算,并且每个线性运算的平均内核大小为 。而且这每个线性运算都可以具有不同的形状和参数,但是特别是考虑到 CPU 或 GPU 的实用性,这样做会使得在线推理 (online inference) 受到阻碍。所以,为了实现硬件上的高效实现 (efficient implementation) ,建议每个Ghost module的线性运算采用相同大小的线性运算 (例如全 或全 )。
使用Ghost模块升级普通卷积的理论加速比为:
其中  的幅度与  和  相似。同样,参数压缩比可以计算为
它大约等于加速比。
构建GhostNet:
Ghost Bottleneck: 作者设计了2种Ghost bottleneck(G-bneck)。如下图3所示,分别对应着  和  的情况。
Ghost bottleneck类似于ResNet中的基本残差块(Basic Residual Block),主要由两个堆叠的Ghost模块组成。
第1个Ghost模块用作扩展层,增加了通道数。这里将输出通道数与输入通道数之比称为expansion ratio。
第2个Ghost模块减少通道数,以与shortcut路径匹配。然后,使用shortcut连接这两个Ghost模块的输入和输出。这里借鉴了MobileNetV2,第二个Ghost模块之后不使用ReLU,其他层在每层之后都应用了批量归一化(BN)和ReLU非线性激活。上述Ghost bottleneck适用于stride= 1,对于stride = 2的情况,shortcut路径由下采样层和stride = 2的深度卷积(Depthwise Convolution)来实现。
考虑到效率的因素,实作中Ghost模块中的第1阶段的初始卷积是点卷积(Pointwise Convolution)。
图3:Ghost Bottleneck
GhostNet:基于Ghost bottleneck,作者提出GhostNet,如下图4所示。其中图4左图为GhostNet总体结构,右图为MobileNet-v3的结构。我们发现GhostNet的搭建过程就是使用Ghost bottleneck替换MobileNetV3中的bottleneck。GhostNet主要由一堆Ghost bottleneck组成,其中Ghost bottleneck以Ghost模块为构建基础。
第1层是具有16个卷积核的标准卷积层,然后是一系列Ghost bottleneck,通道逐渐增加。这些Ghost bottleneck根据其输入特征图的大小分为不同的阶段。除了每个阶段的最后一个Ghost bottleneck是stride = 2,其他所有Ghost bottleneck都以stride = 1进行应用。最后,利用全局平均池和卷积层将特征图转换为1280维特征向量以进行最终分类。SE模块也用在了某些Ghost bottleneck中的残留层,如表1中所示。
与MobileNetV3相比,这里用ReLU换掉了Hard-swish激活函数。尽管进一步的超参数调整或基于自动架构搜索的Ghost模块将进一步提高性能,但表1所提供的架构提供了一个基本设计参考。
图4:左图为GhostNet总体结构,右图为MobileNet-v3的结构。#exp代表expansion ratio,#out代表output channels输出通道数,SE代表是否使用SE模块,Stride代表stride
宽度压缩:
在某些情况下,我们可能需要更小、更快的模型或特定任务的更高准确性。为了定制网络以满足所需的需求,我们可以简单地在每一层均匀地乘以channel数量的因子  。这个因子  被称为Width Multiplier ,因为它可以改变整个网络的宽度。我们用Width Multiplier 表示高斯网络为GhostNet-  。Width Multiplier可以通过大约  控制模型大小和计算成本。通常较小的  会导致较低的延迟和较低的性能,反之亦然。
Experiments:
作者分别针对ResNet-56和VGG-16进行了Ghost模块化, 这两个模型中的所有卷积层都被所提出的Ghost模块取代,得到Ghost-ResNet-56和Ghost-VGG-16。
实验1:超参数消融实验
Ghost模块具有两个超参数,也就是, 用于生成  个内在特征图,以及用于计算幻影特征图的线性运算的  (即深度卷积核的大小)。作者测试了这两个参数的影响。
如图5上图所示,首先,作者首先研究超参数  的作用:固定  并在  范围中调整 ,并列出CIFAR-10验证集上的结果。作者可以看到,当 的时候,Ghost模块的性能优于更小或更大的Ghost模块。这是因为大小为 的内核无法在特征图上引入空间信息,而较大的内核(例如  或  )会导致过拟合和更多计算。因此,在以下实验中作者采用  来提高有效性和效率。
如图5下图所示,在研究了内核大小的影响之后,作者再研究超参数  的作用:固定  并在  的范围内调整超参数  。实际上,  与所得网络的计算成本直接相关,即,较大的  导致较大的压缩率和加速比。从表3中的结果可以看出,当作者增加  时,FLOP显着减少,并且准确性逐渐降低,这是在预期之内的。特别地,当  ,也就是将VGG-16压缩  时,Ghost模块的性能甚至比原始模型稍好,表明了所提出的Ghost模块的优越性。
图5:超参数消融实验
Ghost-ResNet-56和Ghost-VGG-16和几个代表性的最新模型的比较结果如下。Ghost-VGG-16取得了最优的性能 (93.7%),对于已经比VGG-16小得多的ResNet-56,可以在性能相当的条件下实现2倍的加速。
图6:Ghost-ResNet-56和Ghost-VGG-16和几个代表性的最新模型的比较结果
实验2:特征图可视化
作者还可视化了Ghost模块的特征图,如图7所示。红色框为Ghost模块的原始卷积,绿色框的特征图是经过廉价深度变换后的幻影特征图。尽管生成的特征图来自原始特征图,但它们之间确实存在显着差异,这意味着生成的特征足够灵活 (flexible enough),可以满足特定任务的需求。
图7:Ghost模块可视化
图8:原始VGG-16第2层的输出特征
实验3:ImageNet分类数据集
作者对ImageNet分类任务进行了实验,初始学习率0.4,batch size大小为1024,验证集上报告的所有结果均是single crop的top-1的性能。为简单起见,作者在初始卷积中设置了内核大小 ,在所有Ghost模块中设置了
【声明】内容源于网络
0
0
极市平台
为计算机视觉开发者提供全流程算法开发训练平台,以及大咖技术分享、社区交流、竞赛实践等丰富的内容与服务。
内容 8155
粉丝 0
极市平台 为计算机视觉开发者提供全流程算法开发训练平台,以及大咖技术分享、社区交流、竞赛实践等丰富的内容与服务。
总阅读7.6k
粉丝0
内容8.2k