马金林,张 裕,马自萍,毛凯绩
1.北方民族大学 计算机科学与工程学院,银川750021
2.图像图形智能处理国家民委重点实验室,银川750021
3.北方民族大学 数学与信息科学学院,银川750021
在近几年中,轻量化神经网络成为一个非常重要且十分活跃的研究领域,许多学者在网络结构和卷积方面对轻量化方法进行了研究,并取得了大量成果,诞生了很多贴合实际应用需求的优秀轻量化神经网络模型。2012 年AlexNet的惊艳亮相为神经网络发展提供了改进思路,使得ZF-Net、VGG-Nets、GoogleNet、ResNet以及DenseNet等众多网络模型可以采用加深网络和增强卷积功能的方式来提升网络识别准确率。该方式使得模型性能有了显著提升,但网络结构较之前更为复杂,使得所需计算量和内存大大增加。
上述模型以提升准确率为主要目的,与其不同的是,2016 年最早公开的轻量化网络SqueezeNet在ImageNet 数据集上可达到近似AlexNet 的效果,但参数量仅为AlexNet 的2%,若同时结合模型压缩(deep compression)技术,SqueezeNet 的参数量则会进一步降低为AlexNet参数量的约0.2%。
轻量化神经网络模型(lightweight neural network model)是基于原有卷积神经网络(convolutional neural network,CNN)的发展进行改进的,目的是为了能更好地将神经网络进行移动普及应用,可以说是专为嵌入式移动设备视觉终端设计的模型。与原有网络模型相比,轻量化模型具有结构轻便、计算简单、可移植性强的优点。目前,轻量化模型应用已涉及自然语言处理、数据挖掘、医学图像处理等领域,在确保模型精度不降低的前提下,最大程度地提高运算速度。
在轻量化神经网络中,大多使用人工设计的卷积进行网络构建。由于设计思路的局限性,模型中可能存在大量卷积冗余。若想进一步提升网络运行速度,则可以选择对网络中的基础构建功能块之一“卷积”进行轻量化设计。通过对卷积的空间维度和通道维度进行调整,可有效降低卷积冗余度,提升卷积计算速度,达到轻量化目的。卷积的轻量化主要分为卷积结构轻量化、卷积模块轻量化以及卷积运算轻量化三方面。卷积结构轻量化主要调整单一卷积核的数量、大小及其计算方式。卷积模块轻量化主要调整各卷积间的结构组成。卷积运算轻量化主要调整网络中的卷积运算方式。
卷积是轻量化神经网络中的核心组成部分,用于提取图像特征。对卷积进行调整以达到轻量化目的,是大多数神经网络进行修改操作的优先选择。单一卷积结构的轻量化可通过调整所使用的卷积核大小,改变使用的卷积核总数,同时改变卷积核的数量并结合网络宽度的方式进行实现。
卷积核尺寸的选取决定了网络中感受野(receptive field)的范围大小。卷积核的尺寸越大,感受野也越大。感受野是指在卷积操作过程中所看到的图片信息,因此看到得越多,特征的提取效果越好。AlexNet 的网络设计中使用11×11 的卷积核,并在2012 年的ImageNet 分类竞赛中获得了冠军,证明了其网络设计的优越性。因此,当时的人们普遍认为模型设计时,卷积核的尺寸越大越好。于是,在早期的神经网络模型中为保证提取效果,网络中大多使用尺寸较大的卷积核进行特征提取。
但是后续大量模型的实验效果证明了使用大尺寸卷积核在特征提取效果优越的同时也存在着隐患。大卷积核会使得模型出现计算量骤增、无法自如调整深度、性能受限等问题,因此近年的神经网络构建中已经很少直接使用如11×11 等较大尺寸的卷积核。
神经网络中常用的卷积核尺寸有11×11、7×7、5×5、3×3、1×1 这五种类型。卷积核尺寸的调整可分为使用小卷积替换大卷积和使用特殊卷积“1×1 卷积”调整网络两个方向。
卷积替换的思路源于InceptionV3,通过对不同尺寸卷积核所需计算量进行分析比较后,InceptionV3 提出可对大尺寸卷积核进行拆分操作。在InceptionV3 的卷积结构中,原有卷积层中的5×5 卷积被两个3×3 卷积进行替换。与原始的5×5 卷积的模型参数量相比,使用两个3×3 卷积替换后,参数量降低了27.8%,且卷积分解前后,感受野较之前未发生变化。
如图1 所示,5×5 的输入特征图经由一个5×5 卷积和两个3×3 卷积后,所得的输出特征图尺寸均为1×1,且所得感受野大小均为5。
图1 卷积感受野对比Fig.1 Convolution receptive field comparison
PVANet也如同Inception 一样对图像中的目标进行捕获,甚至为了提升网络性能还搭配了跳跃连接(skip connrection)进行基础网络的特征提取,最终在图形处理器(graphics processing unit,GPU)上达到21.7 FPS(frames per second)的运行速度。PeleeNet的2-way Dense(原Dense 结构的改进)结构受Inception 多尺度思想的影响,将5×5 的卷积核拆分为两个3×3的卷积核后,与一个3×3卷积核并行,如图2所示。PeleeNet 的计算成本较经典轻量化模型MobileNets减少11%,准确率较MobileNets提升0.6%。
图2 PeleeNet中2-way Dense LayerFig.2 2-way Dense Layer in PeleeNet
在八邻域像素内,3×3 卷积是能够捕捉信息的最小奇数卷积核尺寸,因此各类轻量化模型常使用3×3 卷积进行卷积替换操作,以此来降低模型计算量。3×3 卷积核单独使用可提取目标图片中小尺度的目标信息,大卷积核的拆分可以在保留与大卷积相同的特征学习能力的同时降低模型计算量。因此PeleeNet 的2-way Dense 结构进行并行处理可在降低计算量的同时获得准确率的提升。5×5 卷积使用3×3卷积替换的实质是将一次5×5 操作拆解为两个3×3的结果之和,使用简单的加法运算对复杂的乘法运算进行替换,降低了计算量,维持了感受野,提升了运行速度。
除使用3×3 的常规卷积降低网络参数量外,也可以使用1×1 的卷积达到相同目的。1×1 卷积由于尺寸原因,无需考虑与周围其他像素的关系。1×1 卷积操作仅可以对特征图的通道个数进行调整,升维或降维的功效取决于所采用1×1 卷积的个数。如图3所示,若采用两个1×1 卷积,特征图的深度将由3 变为2;若采用四个1×1 卷积,特征图的深度将由3 变为4。当1×1 卷积进行降维时,产生的特征图减少,参数量下降,因而达到了轻量化的目的。
图3 1×1 卷积的作用Fig.3 Role of 1×1 convolution
MobileNets 里由深度卷积(depthwise convolution,DW)和逐点卷积(pointwise convolution,PW)两部分构成的深度可分离卷积(depthwise separable convolution,DSC)中,逐点卷积便是通过1×1 卷积计算调整深度卷积输出的线性组合,从而得到新的特征。与标准的3×3 卷积相比,3×3 的深度可分离卷积在精度略有下降的情况下,将计算量在原有基础上降低了11.1%至12.5%。CornerNet-Lite中CornerNet-Squeeze结构借鉴了MobileNets 的思想,将3×3 的普通卷积替换为MobileNets 的3×3 深度可分离卷积,将部分3×3常规卷积替换为1×1 卷积,并且削减3×3 卷积的输入通道数,尽可能加速推理过程,提高网络效率。
两种卷积核尺寸的缩减虽在设计结构中存在差异,但其本质都是通过降低乘法过程中的操作数大小来实现,在数学意义上将标准单次乘法操作进行拆解,使用底层机器更为青睐的加法运算替代部分乘法操作,以达到提升模型运行速度的效果。
不同于调整卷积核大小策略中通过采用小型卷积来降低运算量的方式,改变卷积核数量选择将常规卷积在空间维度与通道维度上进行拆解,并分步骤进行,使得所用卷积数量较原始卷积数量有所变化。常规卷积操作涉及空间结构与通道两方面,可认为标准卷积操作是同时对空间卷积与线性通道进行了操作。并且众所周知,卷积操作是乘法运算。对于底层设备而言,乘法运算的计算难度远高于加法运算。综上所述,为降低卷积计算量,卷积核数量的改变可分为两种方法,一种是将标准卷积在空间结构与通道方面进行解耦,另一种是对卷积的乘积运算在空间结构上进行因式分解,通过拆解完整乘积运算为分段式运算的总和来达到目的。两种方式在运算上均采用分段运算,因卷积步骤拆解,所以会导致所使用的卷积核数量较原始卷积发生变化,通常拆解卷积会较之前使用更多的小尺寸卷积,卷积数量增多,卷积结构更为复杂。
MobileNets 提出的深度可分离卷积便是解耦操作。深度可分离卷积将常规三维卷积分解为二维空间的深度卷积和修改通道个数的逐点卷积,将三维输入特征变成独立的二维平面特征和通道维度。卷积过程中为每个通道分配一个卷积核,并将卷积后的特征图维度作为输入通道数,利用单个卷积滤波器实施;然后将特征图串联(Concat)起来进行逐点卷积,通过逐点卷积计算输入通道的线性组合来构建新特征。在模型参数量占比中除完全连接层(fully connected layer,FC)占据的24.33%外,逐点卷积占据模型总参数量的74.59%。解耦操作产生的分段计算大大降低了网络计算量,达到了轻量化的目的。Xception中的extreme Inception 模块效果与深度可分离卷积类似,区别仅在于DW 和PW 的运行顺序,但模块在整体网络结构中都是相连的,顺序其实并没有太大影响。
蓝图可分离卷积(blueprint separable convolutions,BSConv),简称蓝图卷积,存在无限制蓝图卷积(unconstrained BSConv,BSConv-U)和子空间蓝图卷积(subspace BSConv,BSConv-S)两类,如图4 所示。蓝图卷积结构设计类似MobileNets 提出的深度可分离卷积,同为解耦操作,准确率较同期产品提升9.5%。
图4 BSConv-U、BSConv-S 及基础卷积Fig.4 BSConv-U,BSConv-S and basic convolution
“蓝图”提出可由一个蓝图卷积通过各种线性变换进行常规卷积替换操作,通过附加变换的微小代价进行模型中卷积数量的缩减,以达到轻量化效果。BSConv-U 将常规卷积分解为一个1×1 卷积和二维通道卷积,与深度可分离卷积操作相反,交换了DW 和PW 的顺序,先在深度方向上加权组合再卷积。BSConv-S 基于卷积核矩阵的行与行之间存在高度关联关系,将该卷积核进行矩阵分解来实现权重矩阵的低秩近似,并通过添加正交约束来减少参数之间的相互关联,结果是将一个1×1 卷积分解成两个1×1 卷积。
SqueezeNet 提出的Fire 模块同样也是解耦操作,如图5 所示,设计思想接近Inception系列。Fire模块将常规卷积解耦为由Squeeze 层和Expand 层两部分组成的分步卷积操作。Squeeze 部分采用少于上一层特征图数量的1×1 卷积,以减少特征图的维数,降低计算量。使用1×1 小尺寸卷积是1.1 节中的卷积核大小的调整,在此不过多赘述。在Expand 部分使用Concat 操作并联3×3 卷积和同样的1×1 卷积。SqueezeNet 通过Squeeze 层进行降维,在Expand 层中将单一卷积结构拆分为并行分支计算,降低了模型的计算量,且在占据模型的运算总量一定限额的卷积运算中,1×1 卷积在卷积运算中占比颇大。因为3×3 卷积的参数量是1×1 卷积的9 倍,可降低模型运算量。最终SqueezeNet 的模型参数量仅占等性能AlexNet的2.14%。
图5 Fire模块Fig.5 Fire module
蓝图卷积的解耦依据卷积内核的内部相关性,通过定量分析得出深度方面相关性更加优秀的信息,从而决定解耦后分段卷积的执行顺序。SqueezeNet的卷积解耦设计则是借鉴了MobileNets 的深度可分离卷积和Inception 的多尺度思想。借鉴深度可分离卷积,使得卷积操作在空间与通道上进行分离,导致Fire 模块拆解为Squeeze 和Expand 两部分。借鉴由大小不同卷积构成的Inception 初始模块的思想,在Expand 部分选取模型设计常用的1×1 卷积和3×3 卷积进行组合。
与标准三维卷积的区别在于,蓝图卷积将卷积拆解为由二维卷积与权重向量构成的组合卷积结构,使用分段计算后合并的方式,改善了卷积单纯的乘积运算,达到了轻量化的目的。SqueezeNet则是提出了可通过超参数微调,人为决定模型中每层卷积核的使用情况,通过大量使用计算量较少的1×1 卷积,从而达到轻量化的目的。解耦后的卷积结构通常较为复杂,网络模型越深,解耦后轻量化效果越明显。
第二种改变卷积核数量是通过卷积因式分解进行的,因式分解通过将普通正方形二维卷积拆解为非对称卷积(asymmetric convolution),在数学角度上可看作是为使模型加速而采取的逼近操作。该操作出现于InceptionV3 中。InceptionV3 尝试在空间结构上将7×7 卷积进行因式分解,拆解为1×7 和7×1 的连续卷积操作。
SqueezeNext使用Fire 的改进模块,它将Fire 模块的3×3 卷积替换为3×1+1×3 卷积,这样可以去掉冗余实现低秩滤波器,降低权值参数。SqueezeNext可达到在ImageNet 数据集上与AlexNet 相同精度,但参数量约为其0.9%的效果。而EffNet中则是对MobileNets 的深度层面分离的3×3 深度卷积进一步改进得到基础模块,如图6 所示。为降低模型参数量,使用在空间上分解为1×3 和3×1 的一维卷积核组合替换原有的3×3 卷积操作,参数由3×3=9 降低到1×3+3×1=6。
图6 EffNet基本模块Fig.6 EffNet basic module
改变卷积核数量的本质其实是通过数学方式修改运算层级。将卷积进行分步运算和因式分解虽会导致卷积核总数变化,但在数学层面上,解耦操作将加法引入原本仅有乘法存在的运算中,运算层级降级,造成了模型计算量降低的结果;因式分解使得参数量由原有的指数级降低为二倍关系,运算层级降级,实现了网络模型轻量化。但因式分解从计算量角度而言,由于乘法操作数目没变,网络的计算量基本未发生改变。而且改变卷积核数量由于使用卷积尺寸不一,在模型运行过程中需进行部分如填充等微调操作,以此来保证输出尺寸相同。
改变卷积核数量与网络宽度是在前两节的基础上,通过调整分解后的卷积结构,在维持轻量化效果的同时,一定程度上对模型性能进行提升。常规卷积在空间及通道方向进行解耦操作后,通常会使得模型中卷积数量增多。尽管卷积分段求和操作可降低模型计算量,但若串联卷积的数量过多,仍会将轻量化的优势消除。因此需要同时对卷积结构宽度进行调整,通过对卷积进行功能性划分,形成各个卷积组,且将各分组卷积并联执行,用以弥补卷积数量带来的问题。
LEDNet提出的分割-混洗-非瓶颈模块(splitshuffle-non-bottleneck,SS-nbt)除进行并联操作外,还在通道拆分和混洗两个运算间引入了跳跃连接,结构如图7(d)所示。在起始位置的SS-nbt 通过通道分割操作,将输入拆分为两个较低维分支,每个分支为一个完整的卷积功能分组,且每个分组仅占据一半的输入通道。分组中由一组专用的一维滤波器(例如1×3、3×1)代替逐点卷积进行转换构成,采用2.1 节和2.2 节中的轻量化方法,构建出满足提取需求功能的轻量化卷积分组。级联可保证通道个数不变,因此调整网络宽度是使用级联对两个分支的卷积输出进行合并。结构中跳跃连接的引入可重用子层参数,将浅层特征复制与通过卷积后的输出进行叠加,用来提升特征能力。通道混洗是用来实现两个拆分分支之间的信息通信。
图7 LEDNet网络的基础单元SS-nbtFig.7 Basic unit of LEDNet network:SS-nbt
通过采用并行分组结构的方式,降低了网络深度,在有限程度上对网络结构加宽,提升了网络运行效率,搭配提升模型准确率的跳跃连接层。每个SS-nbt单元将合并的特征通道随机混洗后加入下一个单元,可以看作是一种功能重用,在某种程度上扩大了网络容量,却未显著增加复杂性。SS-nbt的设计中采用的拆分转换合并策略受到了XNOR-Net和InceptionV3的影响,该结构的设计方法可接近大型和密集层的表示能力,但计算复杂度却低得多。最终LEDNet 在模型参数量不足1.0×10的情况下,运行速度却可达71 FPS。
卷积核进行解耦拆分后,若采用直连构成线性结构会使得网络深度加深,因此提出添加分支结构进行多卷积操作并行处理,通过采用轻量化的卷积运算对网络结构的宽度进行修改,降低模型深度,并通过多分支卷积并行运算,提升模型的运行效率,进而提升模型性能。但分支结构的数量需要进行人工控制,具体结构的设定依赖所面对的具体应用需求和所使用的硬件设备。
综上所述,卷积结构轻量化技术通过数学运算对单一卷积进行拆解,使用更利于运算的卷积进行模型计算量的削减,但该方法多次使用会导致模型中卷积使用数量骤增,使得卷积的总计算量占模型计算总量的比重增大,拉低计算量降低的优势,甚至会导致模型中卷积的结构复杂,不利于后期模型结构调整。主要的卷积结构轻量化技术的对比如表1所示。
表1 卷积结构轻量化技术对比表Table 1 Comparison of convolution lightweight technology
卷积模块是人工构建的应用编程接口(application programming interface,API),可在代码中直接使用缩写进行调用,封装包中通常包含有固定的卷积结构模块,可移植性高。在卷积模块使用过程中,具体网络架构中的卷积模块可根据需求人工进行调整,增减模块结构中的卷积结构以达成特定需求,并能防止功能模块间出现功能重叠的情况,造成资源浪费。轻量化卷积模块常指经由轻量化后的卷积操作组合构成,由于其构建使用轻量化后的卷积结构,轻量化模块较普通模块所占用计算量更小。轻量化模块中常用模块有残差模块、ResNeXt 模块、SE 模块以及注意力机制模块。
在数理统计中,残差通常用来表示实际观察值与估计值(拟合值)之间的差。在一个堆积层结构中,当输入为时,记学习到的特征为()。与原始特征()相比,差值更容易直接学习,因此残差作为差值计算学习可表示为:
由上述公式可知,当残差()=0 时,堆积层仅做了恒等映射,网络性能应保持不变。但事实上残差并不为0,因此会导致堆积层在输入特征基础上不断学习到新的特征,从而网络也会拥有更好的性能。若网络中最优输出为输入,在没有短路连接(shortcut connection)的网络中,需要将其优化成()=;而对于包含短路连接的残差单元,可将其转化为使得()=()-优化为0 的需求。因此短路连接的存在可使得卷积的结构优化更为简单。使用残差单元可极大保留梯度的空间结构,解决梯度破碎现象,提升优化方法的有效性。图8 为初始残差模块的结构图。
图8 初始残差模块Fig.8 Initial residual module
瓶颈模块作为特殊的残差结构,如图9 所示,保持原有残差结构的同时,将模块构建成了叠加的漏斗形状。通过上下各一个1×1 卷积,调整网络特征维度,将通道个数先减小后增大。该结构本质上仍是在结构优化的基础上,通过使用1×1 卷积人为控制通道数,降低模型参数量。
图9 残差结构与瓶颈结构Fig.9 Residual structure and bottleneck structure
SqueezeNext中的基本模块是在瓶颈模块的基础上进行的调整,如图10 所示。将原始瓶颈结构中的三维3×3 卷积因式分解为3×1 和1×3 这两个二维卷积运算之和,并在瓶颈结构开始前再添加一组1×1 卷积,用来降低输入通道数。
图10 SqueezeNext的基础模块Fig.10 Basic module of SqueezeNext
卷积结构中通过调整1×1 卷积个数的使用情况,可以灵活控制每层卷积操作时的通道数量,保证3×3卷积因式分解所得的两个卷积运算,始终处于低维通道运算中,降低模型计算量。基础模块最后的1×1 卷积,用来将处理好的特征恢复成与输入同样的维度。
ShuffleNet V1的基本模块同样基于瓶颈结构,如图11 所示,图(a)、(b)、(c)结构依次进化。与原始瓶颈结构不同,图(a)将普通3×3 卷积使用更为轻量化的3×3 DW 卷积来替代,降低结构的计算量。图(b)在图(a)的基础上进一步调整,使用1×1 的分组卷积替换原始的1×1 卷积,并在第一个1×1 分组卷积后增添通道混洗(channel shuffle)操作。图(c)在图(b)的基础上,将3×3的平均池化加入跳跃连接层上,并在最后使用Concat操作取代了原有的叠加(Add)操作。
图11 ShuffleNet单元模块及残差模块Fig.11 ShuffleNet unit module and residual module
由第1 章中的解释可知,3×3 的DW 卷积属于二维卷积,相较于普通3×3 卷积使用更为轻量化。而在通道数过大的情况下,多次使用1×1 卷积,轻量化效果并不十分明显,甚至当通道数过大时,使用1×1 卷积可能会造成计算量增加。因此,图11(b)将1×1 的卷积进行分组后,替换原始的1×1 卷积。分组后的卷积完美解决了通道数不可控的情况,使得1×1 卷积可以保持降低计算量的功效。在第一个1×1 分组卷积后增添channel shuffle 操作是为了克服分组后信息不流通的副作用。当stride=2 时,为了保持与卷积后结果相同的特征图大小,跳跃连接层上需要添加3×3 的平均池化操作。最后使用Concat操作取代Add操作,是因为可以将两分支尺寸相同的计算结果直接拼接,无需重复进行Add 运算,因此降低了模型的计算量。
DetNet的空间瓶颈(dilated bottleneck)模块同样是对瓶颈结构的改进,如图12 所示,图(c)为原始瓶颈单元。空间瓶颈结构使用空洞卷积(dilated convolution)替换了原有的常规3×3 卷积,图(a)与图(b)的区别在于跳跃连接层中是否存在1×1 卷积。
图12 DetNet的瓶颈模块及残差模块Fig.12 DetNet bottleneck module and residual module
空间瓶颈模块引入的空洞卷积,可以在不引入额外参数的情况下,任意扩大感受野。由于空洞卷积是通过对卷积核进行填充,特征图分辨率不会如降采样一样丢失。卷积中的感受野范围大小可通过调整超参数空洞率(dilation rate)进行人为控制。跳跃连接层中是否包含1×1 卷积,取决于卷积模块所处DetNet 骨干结构的位置。由于DetNet 骨干搭建的特殊性,含有1×1 卷积是为了进行通道加倍处理。经过实验证明,1×1 卷积跨通道信息融合可以更好地进行信息整合。空间瓶颈模块在优化模块上的轻量化作用并不明显,但该模块可大幅提升模型定位分割的能力,并同时获得视觉任务中非常重要的多尺度信息。DetNet 比同等条件的ResNet-50 所拥有的参数量少了1.0×10,且精度提升了0.8%。
MobileNet V2提出的线性瓶颈(linear bottleneck)模块,如图13 所示,保留原有瓶颈结构,仅将标准瓶颈结构中1×1 和3×3 的卷积,使用深度可分离卷积中的DW 和PW 进行替换,降低计算量。linear bottleneck 模块为防止MobileNet V1 中PW 的激活函数破坏低维空间特征,在PW 操作后MobileNet V2 使用线性激活函数对ReLU6 进行了替换。
图13 MobileNet V2 的Linear Bottleneck 模块Fig.13 Linear Bottleneck module for MobileNet V2
MobileNet V2 模块本质上是对瓶颈结构与深度可分离卷积进行融合。模块结构中DW 与第二个PW 可构成深度可分离卷积,其卷积功效与深度可分离卷积一致。而DW 卷积前添加对DW 卷积通道数具有升维作用的PW 卷积,则是将模块搭建成了标准漏斗形状的瓶颈结构。升维作用的PW 卷积解决了由于上层通道数较少影响DW 的空间特征,且DW 卷积缺少改变通道数的能力而产生的问题。如此构建的linear bottleneck 模块既有瓶颈结构的优化特征,还通过深度可分离卷积进行了卷积拆解,使用更轻量化的二维卷积,进一步降低了模型计算量。
GhostNet中按步长(stride)将单元瓶颈(ghost bottleneck)模块分为两种,如图14 所示。stride=1 的ghost bottleneck 模块结构仿照普通残差,由两块Ghost 模块构成。第一块充当扩展层,用来增加通道数量;第二块降低通道数,将通道数量恢复到与输入通道一致,并与跳跃连接层相连。stride=2 的ghost bottleneck 模块拥有标准瓶颈结构的布局,保持stride=1 时的结构特点,通过借鉴MobileNet V2 的Linear Bottleneck 模块的经验,在stride=1 结构的中间加入中间块,块中使用更为轻量化的二维DW 卷积,降低计算量。吸取了MobileNet V2 的经验,模块在设计过程中,除第二个Ghost 模块后不使用ReLU 激活函数外,其他层在每层后均应用批归一化(batch normalization,BN)和ReLU 非线性激活函数。
图14 GhostNet的Ghost BottleneckFig.14 Ghost Bottleneck of GhostNet
残差模块中瓶颈结构使用更为广泛,在残差结构的搭建过程中,通常使用更为轻量化的卷积对标准卷积进行替换操作,以达到在优化结构的基础上进一步降低计算量。但瓶颈结构的设定在一定程度上会使得模型整体结构变得复杂,不利于结构调整时的修改。
ResNeXt 模块本质上是分组卷积。AlexNet 当初迫于实验坏境,尝试将卷积操作进行拆分,因此出现了分组卷积。分组卷积介于常规卷积与深度可分离卷积之间,未曾独立赋予每个通道独立的卷积核,也不曾对输入图片使用一个卷积核。分组卷积通过将卷积分组,对通道数进行了切割,因此降低了模块的参数量,达到了轻量化的效果。
ResNeXt模块是在Inception 网络基础上融合了ResNet 的特点,与人工设计卷积细节的Inception模块不同,ResNeXt 模块的各个分支均采用完全一致的卷积拓扑结构。分组卷积的结构设计更符合GPU的硬件设计原则,因此运行速度应快于人工设计卷积细节的Inception 模块。ResNeXt 在ImageNet 数据集上实现了高于ResNet的精度,但复杂度仅占ResNet的50%。
ShuffleNet V2结构是基于ShuffleNet V1 的设计基础,V2 的模块在基本模块中添加了通道拆分模块,效果等同于分组卷积,因此使用常规1×1 卷积代替1×1 分组卷积。ShuffleNet V2 的基础模块按stride分为两种设计方案,如图15(a)、(b)所示。图(a)中模块将输入通道拆分为两部分,一部分使用恒等映射进行特征复用,另一部分则是通过首位进行分组处理后的瓶颈结构。图(b)中模块同样将输入通道分为两部分,一部分使用瓶颈结构,一部分使用深度可分离卷积。stride=2 的(b)去除了(a)中的通道拆分操作,得到了输出通道数量翻倍的效果。ShuffleNet V2以2.3 GFLOPs(floating point operations)的速度优于ShuffleNet V1,并在FLOPs 降低40%的情况下效果优于ResNet-50。
图15 ShuffleNet V2 模块Fig.15 ShuffleNet V2 module
GhostNet 中的Ghost 模块将卷积生成的结果分为两组,一组保留原始卷积的一部分不变,另一组进行优化输出特征中彼此相似的冗余特征图。Ghost模块是由简单变换后得到的结果与保持不变信息的分组拼接得到的。将训练好的网络中存在的大量冗余信息中相似的特征图看作Ghost。通过对Ghost 特征图进行简单变换后可以替换部分用卷积生成的特征图,缩减模型计算量。Ghost 模块可以通过使用简单变换代替卷积操作生成CNN 特征中大量相似的冗余特征图,实现了模型加速。GhostNet可在运行时间缩减一半的情况下,达到与ResNet相同的识别精度。
ResNeXt 模块中的分组卷积思想实际上是对参与卷积操作的通道数进行调整。通过对卷积的通道数进行分割,然后多分组并行执行,使得模型运算速度得到了明显提升。且在参数量的计算上,通道数分组也大幅降低了卷积计算量。理论上,分组越多模型计算越快,但卷积的分组个数取决于当前所使用的硬件资源配置,并且与所用的网络结构设计有关,因为分组过多会影响到模型结构的宽度。
SENet提出的SE(squeeze-excitation)模块由squeeze和excitation 两个操作构成。虽然同样基于通道分组,但不同于分组卷积与深度可分离卷积是为了达成降低计算量的目的,SE 模块对通道分组是希望模型可以自主学到不同通道间的依赖性,得到特征之间的关系,并且能通过对全局信息的把控,将通道信息进行得分排序,强调信息特征并抑制干扰特征。为了将卷积运算时的空间依赖性与通道依赖性分离,提高对信息特征的敏感度。SE 模块在squeeze部分采用1×1 的全局平均池化操作,将输入特征从三维压缩至一维,所得的一维特征可获得全局感受野,感受范围得到了极致地放大,避免了浅层网络中小的感受野无法感知上下文信息情况的出现。而excitation 部分为了获取多通道间的依赖关系,通过两个全连接层(FC)与非线性激活函数ReLU 构成瓶颈结构,在升维的FC 层和sigmoid 激活函数的升维控制下,参数化门控机制。excitation 部分通过对每个通道的重要性进行预测,得到不同通道的重要性大小后再将激励作用到之前特征图的对应通道上,使得通道拥有可以进行初选择的不同激励效果。
SE模块具有良好的可移植性,可以用最小的额外计算成本为深层架构提供显著的性能改进。ILSVRC 2017 年,以SENet为骨干的网络获得了分类赛的第一名。MobileNet V3的瓶颈模块中添加了SE 模块,因为时间损耗问题将SE 模块放在DW 卷积后,最终MobileNet V3 精度得到了进一步提升,却未增加时间损耗。GCNet提出将SE 模块中squeeze 部分的全局平均池化操作使用简化的非局部(non-local)模块替代,使得模型轻量化且可以有效对全局上下文建模。在目标检测方面,GCNet 的平均精度(average precision,AP)较SENet提升1.7%,FLOPs仅增加0.07%。
经由前文可知,SE 模块在squeeze 部分使用1×1卷积降维,并在excitation 中构成优化的瓶颈结构,降低了卷积结构的计算量。但瓶颈结构中的FC 层较为耗时,因此,在通道数较少时使用该模块可获得最佳效果。SE 模块可依据上下文对通道进行权值标定,调整通道依赖,non-local模块可通过使用聚集其他位置信息来加强此位置特征信息的功能。并且nonlocal 模块在不同位置时全局上下文信息几乎相同。SE 模块与non-local 模块功能具有辅助作用,且nonlocal模块的出现解决了SE 模块无法充分利用上下文的缺点,适合联合使用。
注意力机制模块CBAM(convolutional block attention module)是轻量级通用模块,可在通道维度和空间维度两方面进行特征聚焦,并对两方面的独立维度进行集成。基于空间维度和通道维度可分为通道注意力模块(channel attention module,CAM)和空间注意力模块(spatial attention module,SAM)两部分。
CAM 是对SE 模块结构的调整,在SE 模块的基础上,CAM 中添加了一个全局最大池化操作。CAM在空间维度上压缩特征图为一维矢量,并使用全局平均池化与全局最大池化对空间映射的特征信息进行聚合,通过共享全连接层对结果进行逐元素加和操作。双重池化操作的结构设定,可使得所提取的高层次特征内容更丰富,提供更为精细的信息。SAM是将CAM 操作后的结果基于通道进行Concat 操作,经由卷积进行单通道降维。SAM 同CAM 一样均采用双重池化操作。CBAM 与SE 模块相似,模块结构中多采用1×1 卷积进行操作,通过SAM 调整通道维度,完成对特征图的信息提取。
ThunderNet使用轻量级骨干网络与小分辨率图像输入,使得模型特征提取部分表现力有限,不能正确学习特征分布。为解决小主干和小特征图的性能退化问题,ThunderNet压缩了区域生成网络(region proposal network,RPN)和R-CNN子网,提出了上下文增强模块(context enhancement module,CEM)和空间注意力模块(SAM)两个模块。CEM 的功能与特征金字塔网络(feature pyramid networks,FPN)的多尺度思想类似,且CEM 仅采用骨干后三层数据进行操作,因此CEM 具有FPN 的功能,且拥有比FPN 更为精简的效果。SAM 使用RPN 中的得分结果对CEM的特征图进行加权,达到抑制背景区域特征的目的,与CEM 运算几乎不增加计算量相比,SAM 会增加5%的网络计算量。CEM 和SAM 的使用最终可将模型精度提升1.7%。
坐标注意力(coordinate attention,CA)模块将通过二维全局池化操作生成一维特征向量的CAM调整为经由两个一维全局池化,并在垂直和水平方向上将CAM 进行特征编码,最终得到两个含有特定方向信息的注意力图。该注意力图中分别包含输入特征图在该方向上的长距离依赖,即注意力图含有输入特征图的位置信息。CA 模块所得注意力图具有对特征图的方向和位置信息敏感的特性,增强了模型定位和划分待定区域的精准度,且CA 模块具有良好的可移植性,移植过程中几乎没有计算开销。
注意力机制模块是一种简单而有效的模块,它达到了与基础卷积同时进行端到端训练的程度。在两个独立维度上,注意力机制模块可以做到沿着不同维度分别进行注意力图推断,并在特征图提取基础上进行自适应优化。在注意力推断过程中使用轻量化的1×1 卷积进行操作,将特征提取过程中被忽略的位置信息标记于卷积通道,并通过方向与特征信息在空间维度中加强模型的定位能力。注意力机制模块在网络中常位于前馈神经网络的常规卷积层后,可忽略该模块开销将其无缝集成至任意CNN 架构,可移植性好。但由于其结构中包含FC 结构,应避免在通道数较多的层中多次使用。
综上所述,卷积模块轻量化技术通过使用轻量化卷积搭建所需的功能模块结构,在降低计算量的同时尽可能提升模型效率,但在卷积模块的设计过程中为满足具体应用需求,可能会使用提升模型性能却不利于降低计算量的设计,甚至不同功能性模块间的结构设计会相互影响,从而影响模型性能提升。因此,功能性轻量化模块具有一定提升模型性能与降低计算量作用,但需要在具体的网络结构中依据具体需求进行人为调整。主要的模块轻量化技术的对比如表2 所示。
表2 模块轻量化技术对比Table 2 Comparison of lightweight technology of modules
近年来硬件设备的发展赋予了卷积运算新的发展思路。乘法运算的卷积操作十分消耗网络资源与能量,因此模型虽可以正常运转,但乘积类运算参数量过多,使得模型可移植性较低。对乘法操作进行替换是解决模型高计算量和功耗预算的有效方式。
DeepShift网络通过执行按位移位和按位取反的操作来替换原有前向传播中的浮点乘法运算,减少模型运行过程中推理所需计算时间。按位移位操作可等价为将输入数字的基础二进制与2 的幂次方进行乘积运算,但2 的幂次方无论幂次取值为何,结果恒大于0,因此按位移位可取代常规卷积中的绝对值乘法运算。在网络中,正值和负值的滤波器均有助于网络的边缘检测,因此DeepShift 加入了取反运算,按位取反操作保证了网络训练过程中负值的乘积运算出现。在硬件电路设备中,移位和取反操作甚至比加法操作速度还快,因此使用按位移位和按位取反来替换乘积运算,可使模型运行速度更快。与二值化神经网络(binarized neural networks,BNN)这类仅可以在小型数据集上加快网络运算速度的方法不同,DeepShift 网络在ImageNet 这类大型数据集上也可正常使用,且能维持90%的精度。
在常规卷积轻量化的方法中,虽注意到可以对卷积的乘法操作进行替换,但似乎很少有人可以站在硬件资源加速的角度,使用底层算法彻底进行卷积加速,这个想法既新颖又很大胆。DeepShift 的训练方式与常规卷积训练方式相同,但参数与梯度变化需要按照固定公式进行调整。DeepShift 通过2 的幂次方进行按位移位操作,但当幂次方取值小于1时,结果分布较为密集,而当幂次方取值大于1 时,结果分布却越来越稀疏。这样的分布差距可能会随着取值范围的变化而对DeepShift 的移位运算造成越来越大的近似误差。
现阶段,对于卷积运算的替代方式严重依赖于底层硬件设备的设计,二进制运算过程中会使得幂次运算在替换过程中出现不可避免的运算方面的误差,从而导致模型在实际应用方面受限。但该替代卷积运算的新潮思想,仍能作为未来研究的一个方向。
使用更廉价的操作代替原有乘法运算已成为卷积轻量化方法的核心思想,在廉价操作替换完毕后,通过卷积间的关系以及各种辅助工具对功能性卷积进行调整,便可得到较为满意的轻量化功能性卷积结构。
本文对近几年轻量化模型进行了归类分析,所涉模型涵盖多种类别,包含目标检测、目标识别、语义分割、图像分类等实际视觉应用需求,卷积轻量化的主要途径为:
(1)优化单一卷积。普通卷积单一乘法的计算方式叠加起来所需算力惊人,不适用于算力有限的小型便携式设备。通过不同研究方向,将常规卷积完整的一次乘法运算进行拆解,使用更为低级的加法运算替换掉部分乘法运算,以此达到轻量化的目的。
(2)优化卷积间结构。卷积间结构指轻量化卷积模块。卷积模块的构建需要按照具体应用需求进行设计,设计方法有两种:第一种是直接在现有的轻量化卷积模块上按照需求进行修改;第二种是首先设计出满足要求的传统卷积模块结构,其次通过借用单一卷积得到的轻量化后的卷积,对传统卷积模块中的卷积进行替换,然后使用现有轻量化功能结构或使用激活函数之类的工具调整轻量化卷积在模块间的结构关系,最后达成轻量化卷积功能模块的效果。
(3)优化网络结构中的卷积。出于对硬件设备运行速度的考量,使用底层运算对卷积运算进行替代。通过底层运算的联合,取代卷积的高阶乘法运算,以达到轻量化的目的。
卷积作为深度学习的构成基础,将卷积轻量化可最大限度地提高网络计算效率,减少卷积间的冗余计算量,使模型在相同识别精度下,卷积在参数量或计算量上占比有所下降,使得模型便于在移动式视觉终端上使用。模型轻量化的效果如表3 所示。通过表3 数据可知,搭配工具使用了轻量化的卷积或功能模块,在降低参数量或者提升运行速度的同时,准确率均得到了一定程度的提升。
表3 模型轻量化效果对比Table 3 Comparison of model lightweight effects
表3 (续)
但当前轻量化网络模型的卷积轻量化操作还略显稚嫩,均是围绕使用廉价操作替换卷积运算展开的。按照使用底层运算提升硬件运行速度的发展来看,或许可以从底层运算入手,设计出一款基于底层运算的卷积操作。
希望本文可以帮助读者认识卷积轻量化的方法,对设计轻量化卷积结构提供启发,并能针对具体需求设计或组合出高效的轻量化模型。