馬金林,張 裕,馬自萍,毛凱績
1.北方民族大學 計算機科學與工程學院,銀川750021
2.圖像圖形智能處理國家民委重點實驗室,銀川750021
3.北方民族大學 數(shù)學與信息科學學院,銀川750021
在近幾年中,輕量化神經(jīng)網(wǎng)絡成為一個非常重要且十分活躍的研究領域,許多學者在網(wǎng)絡結(jié)構(gòu)和卷積方面對輕量化方法進行了研究,并取得了大量成果,誕生了很多貼合實際應用需求的優(yōu)秀輕量化神經(jīng)網(wǎng)絡模型。2012 年AlexNet的驚艷亮相為神經(jīng)網(wǎng)絡發(fā)展提供了改進思路,使得ZF-Net、VGG-Nets、GoogleNet、ResNet以及DenseNet等眾多網(wǎng)絡模型可以采用加深網(wǎng)絡和增強卷積功能的方式來提升網(wǎng)絡識別準確率。該方式使得模型性能有了顯著提升,但網(wǎng)絡結(jié)構(gòu)較之前更為復雜,使得所需計算量和內(nèi)存大大增加。
上述模型以提升準確率為主要目的,與其不同的是,2016 年最早公開的輕量化網(wǎng)絡SqueezeNet在ImageNet 數(shù)據(jù)集上可達到近似AlexNet 的效果,但參數(shù)量僅為AlexNet 的2%,若同時結(jié)合模型壓縮(deep compression)技術(shù),SqueezeNet 的參數(shù)量則會進一步降低為AlexNet參數(shù)量的約0.2%。
輕量化神經(jīng)網(wǎng)絡模型(lightweight neural network model)是基于原有卷積神經(jīng)網(wǎng)絡(convolutional neural network,CNN)的發(fā)展進行改進的,目的是為了能更好地將神經(jīng)網(wǎng)絡進行移動普及應用,可以說是專為嵌入式移動設備視覺終端設計的模型。與原有網(wǎng)絡模型相比,輕量化模型具有結(jié)構(gòu)輕便、計算簡單、可移植性強的優(yōu)點。目前,輕量化模型應用已涉及自然語言處理、數(shù)據(jù)挖掘、醫(yī)學圖像處理等領域,在確保模型精度不降低的前提下,最大程度地提高運算速度。
在輕量化神經(jīng)網(wǎng)絡中,大多使用人工設計的卷積進行網(wǎng)絡構(gòu)建。由于設計思路的局限性,模型中可能存在大量卷積冗余。若想進一步提升網(wǎng)絡運行速度,則可以選擇對網(wǎng)絡中的基礎構(gòu)建功能塊之一“卷積”進行輕量化設計。通過對卷積的空間維度和通道維度進行調(diào)整,可有效降低卷積冗余度,提升卷積計算速度,達到輕量化目的。卷積的輕量化主要分為卷積結(jié)構(gòu)輕量化、卷積模塊輕量化以及卷積運算輕量化三方面。卷積結(jié)構(gòu)輕量化主要調(diào)整單一卷積核的數(shù)量、大小及其計算方式。卷積模塊輕量化主要調(diào)整各卷積間的結(jié)構(gòu)組成。卷積運算輕量化主要調(diào)整網(wǎng)絡中的卷積運算方式。
卷積是輕量化神經(jīng)網(wǎng)絡中的核心組成部分,用于提取圖像特征。對卷積進行調(diào)整以達到輕量化目的,是大多數(shù)神經(jīng)網(wǎng)絡進行修改操作的優(yōu)先選擇。單一卷積結(jié)構(gòu)的輕量化可通過調(diào)整所使用的卷積核大小,改變使用的卷積核總數(shù),同時改變卷積核的數(shù)量并結(jié)合網(wǎng)絡寬度的方式進行實現(xiàn)。
卷積核尺寸的選取決定了網(wǎng)絡中感受野(receptive field)的范圍大小。卷積核的尺寸越大,感受野也越大。感受野是指在卷積操作過程中所看到的圖片信息,因此看到得越多,特征的提取效果越好。AlexNet 的網(wǎng)絡設計中使用11×11 的卷積核,并在2012 年的ImageNet 分類競賽中獲得了冠軍,證明了其網(wǎng)絡設計的優(yōu)越性。因此,當時的人們普遍認為模型設計時,卷積核的尺寸越大越好。于是,在早期的神經(jīng)網(wǎng)絡模型中為保證提取效果,網(wǎng)絡中大多使用尺寸較大的卷積核進行特征提取。
但是后續(xù)大量模型的實驗效果證明了使用大尺寸卷積核在特征提取效果優(yōu)越的同時也存在著隱患。大卷積核會使得模型出現(xiàn)計算量驟增、無法自如調(diào)整深度、性能受限等問題,因此近年的神經(jīng)網(wǎng)絡構(gòu)建中已經(jīng)很少直接使用如11×11 等較大尺寸的卷積核。
神經(jīng)網(wǎng)絡中常用的卷積核尺寸有11×11、7×7、5×5、3×3、1×1 這五種類型。卷積核尺寸的調(diào)整可分為使用小卷積替換大卷積和使用特殊卷積“1×1 卷積”調(diào)整網(wǎng)絡兩個方向。
卷積替換的思路源于InceptionV3,通過對不同尺寸卷積核所需計算量進行分析比較后,InceptionV3 提出可對大尺寸卷積核進行拆分操作。在InceptionV3 的卷積結(jié)構(gòu)中,原有卷積層中的5×5 卷積被兩個3×3 卷積進行替換。與原始的5×5 卷積的模型參數(shù)量相比,使用兩個3×3 卷積替換后,參數(shù)量降低了27.8%,且卷積分解前后,感受野較之前未發(fā)生變化。
如圖1 所示,5×5 的輸入特征圖經(jīng)由一個5×5 卷積和兩個3×3 卷積后,所得的輸出特征圖尺寸均為1×1,且所得感受野大小均為5。

圖1 卷積感受野對比Fig.1 Convolution receptive field comparison
PVANet也如同Inception 一樣對圖像中的目標進行捕獲,甚至為了提升網(wǎng)絡性能還搭配了跳躍連接(skip connrection)進行基礎網(wǎng)絡的特征提取,最終在圖形處理器(graphics processing unit,GPU)上達到21.7 FPS(frames per second)的運行速度。PeleeNet的2-way Dense(原Dense 結(jié)構(gòu)的改進)結(jié)構(gòu)受Inception 多尺度思想的影響,將5×5 的卷積核拆分為兩個3×3的卷積核后,與一個3×3卷積核并行,如圖2所示。PeleeNet 的計算成本較經(jīng)典輕量化模型MobileNets減少11%,準確率較MobileNets提升0.6%。

圖2 PeleeNet中2-way Dense LayerFig.2 2-way Dense Layer in PeleeNet
在八鄰域像素內(nèi),3×3 卷積是能夠捕捉信息的最小奇數(shù)卷積核尺寸,因此各類輕量化模型常使用3×3 卷積進行卷積替換操作,以此來降低模型計算量。3×3 卷積核單獨使用可提取目標圖片中小尺度的目標信息,大卷積核的拆分可以在保留與大卷積相同的特征學習能力的同時降低模型計算量。因此PeleeNet 的2-way Dense 結(jié)構(gòu)進行并行處理可在降低計算量的同時獲得準確率的提升。5×5 卷積使用3×3卷積替換的實質(zhì)是將一次5×5 操作拆解為兩個3×3的結(jié)果之和,使用簡單的加法運算對復雜的乘法運算進行替換,降低了計算量,維持了感受野,提升了運行速度。
除使用3×3 的常規(guī)卷積降低網(wǎng)絡參數(shù)量外,也可以使用1×1 的卷積達到相同目的。1×1 卷積由于尺寸原因,無需考慮與周圍其他像素的關系。1×1 卷積操作僅可以對特征圖的通道個數(shù)進行調(diào)整,升維或降維的功效取決于所采用1×1 卷積的個數(shù)。如圖3所示,若采用兩個1×1 卷積,特征圖的深度將由3 變?yōu)?;若采用四個1×1 卷積,特征圖的深度將由3 變?yōu)?。當1×1 卷積進行降維時,產(chǎn)生的特征圖減少,參數(shù)量下降,因而達到了輕量化的目的。

圖3 1×1 卷積的作用Fig.3 Role of 1×1 convolution
MobileNets 里由深度卷積(depthwise convolution,DW)和逐點卷積(pointwise convolution,PW)兩部分構(gòu)成的深度可分離卷積(depthwise separable convolution,DSC)中,逐點卷積便是通過1×1 卷積計算調(diào)整深度卷積輸出的線性組合,從而得到新的特征。與標準的3×3 卷積相比,3×3 的深度可分離卷積在精度略有下降的情況下,將計算量在原有基礎上降低了11.1%至12.5%。CornerNet-Lite中CornerNet-Squeeze結(jié)構(gòu)借鑒了MobileNets 的思想,將3×3 的普通卷積替換為MobileNets 的3×3 深度可分離卷積,將部分3×3常規(guī)卷積替換為1×1 卷積,并且削減3×3 卷積的輸入通道數(shù),盡可能加速推理過程,提高網(wǎng)絡效率。
兩種卷積核尺寸的縮減雖在設計結(jié)構(gòu)中存在差異,但其本質(zhì)都是通過降低乘法過程中的操作數(shù)大小來實現(xiàn),在數(shù)學意義上將標準單次乘法操作進行拆解,使用底層機器更為青睞的加法運算替代部分乘法操作,以達到提升模型運行速度的效果。
不同于調(diào)整卷積核大小策略中通過采用小型卷積來降低運算量的方式,改變卷積核數(shù)量選擇將常規(guī)卷積在空間維度與通道維度上進行拆解,并分步驟進行,使得所用卷積數(shù)量較原始卷積數(shù)量有所變化。常規(guī)卷積操作涉及空間結(jié)構(gòu)與通道兩方面,可認為標準卷積操作是同時對空間卷積與線性通道進行了操作。并且眾所周知,卷積操作是乘法運算。對于底層設備而言,乘法運算的計算難度遠高于加法運算。綜上所述,為降低卷積計算量,卷積核數(shù)量的改變可分為兩種方法,一種是將標準卷積在空間結(jié)構(gòu)與通道方面進行解耦,另一種是對卷積的乘積運算在空間結(jié)構(gòu)上進行因式分解,通過拆解完整乘積運算為分段式運算的總和來達到目的。兩種方式在運算上均采用分段運算,因卷積步驟拆解,所以會導致所使用的卷積核數(shù)量較原始卷積發(fā)生變化,通常拆解卷積會較之前使用更多的小尺寸卷積,卷積數(shù)量增多,卷積結(jié)構(gòu)更為復雜。
MobileNets 提出的深度可分離卷積便是解耦操作。深度可分離卷積將常規(guī)三維卷積分解為二維空間的深度卷積和修改通道個數(shù)的逐點卷積,將三維輸入特征變成獨立的二維平面特征和通道維度。卷積過程中為每個通道分配一個卷積核,并將卷積后的特征圖維度作為輸入通道數(shù),利用單個卷積濾波器實施;然后將特征圖串聯(lián)(Concat)起來進行逐點卷積,通過逐點卷積計算輸入通道的線性組合來構(gòu)建新特征。在模型參數(shù)量占比中除完全連接層(fully connected layer,F(xiàn)C)占據(jù)的24.33%外,逐點卷積占據(jù)模型總參數(shù)量的74.59%。解耦操作產(chǎn)生的分段計算大大降低了網(wǎng)絡計算量,達到了輕量化的目的。Xception中的extreme Inception 模塊效果與深度可分離卷積類似,區(qū)別僅在于DW 和PW 的運行順序,但模塊在整體網(wǎng)絡結(jié)構(gòu)中都是相連的,順序其實并沒有太大影響。
藍圖可分離卷積(blueprint separable convolutions,BSConv),簡稱藍圖卷積,存在無限制藍圖卷積(unconstrained BSConv,BSConv-U)和子空間藍圖卷積(subspace BSConv,BSConv-S)兩類,如圖4 所示。藍圖卷積結(jié)構(gòu)設計類似MobileNets 提出的深度可分離卷積,同為解耦操作,準確率較同期產(chǎn)品提升9.5%。

圖4 BSConv-U、BSConv-S 及基礎卷積Fig.4 BSConv-U,BSConv-S and basic convolution
“藍圖”提出可由一個藍圖卷積通過各種線性變換進行常規(guī)卷積替換操作,通過附加變換的微小代價進行模型中卷積數(shù)量的縮減,以達到輕量化效果。BSConv-U 將常規(guī)卷積分解為一個1×1 卷積和二維通道卷積,與深度可分離卷積操作相反,交換了DW 和PW 的順序,先在深度方向上加權(quán)組合再卷積。BSConv-S 基于卷積核矩陣的行與行之間存在高度關聯(lián)關系,將該卷積核進行矩陣分解來實現(xiàn)權(quán)重矩陣的低秩近似,并通過添加正交約束來減少參數(shù)之間的相互關聯(lián),結(jié)果是將一個1×1 卷積分解成兩個1×1 卷積。
SqueezeNet 提出的Fire 模塊同樣也是解耦操作,如圖5 所示,設計思想接近Inception系列。Fire模塊將常規(guī)卷積解耦為由Squeeze 層和Expand 層兩部分組成的分步卷積操作。Squeeze 部分采用少于上一層特征圖數(shù)量的1×1 卷積,以減少特征圖的維數(shù),降低計算量。使用1×1 小尺寸卷積是1.1 節(jié)中的卷積核大小的調(diào)整,在此不過多贅述。在Expand 部分使用Concat 操作并聯(lián)3×3 卷積和同樣的1×1 卷積。SqueezeNet 通過Squeeze 層進行降維,在Expand 層中將單一卷積結(jié)構(gòu)拆分為并行分支計算,降低了模型的計算量,且在占據(jù)模型的運算總量一定限額的卷積運算中,1×1 卷積在卷積運算中占比頗大。因為3×3 卷積的參數(shù)量是1×1 卷積的9 倍,可降低模型運算量。最終SqueezeNet 的模型參數(shù)量僅占等性能AlexNet的2.14%。

圖5 Fire模塊Fig.5 Fire module
藍圖卷積的解耦依據(jù)卷積內(nèi)核的內(nèi)部相關性,通過定量分析得出深度方面相關性更加優(yōu)秀的信息,從而決定解耦后分段卷積的執(zhí)行順序。SqueezeNet的卷積解耦設計則是借鑒了MobileNets 的深度可分離卷積和Inception 的多尺度思想。借鑒深度可分離卷積,使得卷積操作在空間與通道上進行分離,導致Fire 模塊拆解為Squeeze 和Expand 兩部分。借鑒由大小不同卷積構(gòu)成的Inception 初始模塊的思想,在Expand 部分選取模型設計常用的1×1 卷積和3×3 卷積進行組合。
與標準三維卷積的區(qū)別在于,藍圖卷積將卷積拆解為由二維卷積與權(quán)重向量構(gòu)成的組合卷積結(jié)構(gòu),使用分段計算后合并的方式,改善了卷積單純的乘積運算,達到了輕量化的目的。SqueezeNet則是提出了可通過超參數(shù)微調(diào),人為決定模型中每層卷積核的使用情況,通過大量使用計算量較少的1×1 卷積,從而達到輕量化的目的。解耦后的卷積結(jié)構(gòu)通常較為復雜,網(wǎng)絡模型越深,解耦后輕量化效果越明顯。
第二種改變卷積核數(shù)量是通過卷積因式分解進行的,因式分解通過將普通正方形二維卷積拆解為非對稱卷積(asymmetric convolution),在數(shù)學角度上可看作是為使模型加速而采取的逼近操作。該操作出現(xiàn)于InceptionV3 中。InceptionV3 嘗試在空間結(jié)構(gòu)上將7×7 卷積進行因式分解,拆解為1×7 和7×1 的連續(xù)卷積操作。
SqueezeNext使用Fire 的改進模塊,它將Fire 模塊的3×3 卷積替換為3×1+1×3 卷積,這樣可以去掉冗余實現(xiàn)低秩濾波器,降低權(quán)值參數(shù)。SqueezeNext可達到在ImageNet 數(shù)據(jù)集上與AlexNet 相同精度,但參數(shù)量約為其0.9%的效果。而EffNet中則是對MobileNets 的深度層面分離的3×3 深度卷積進一步改進得到基礎模塊,如圖6 所示。為降低模型參數(shù)量,使用在空間上分解為1×3 和3×1 的一維卷積核組合替換原有的3×3 卷積操作,參數(shù)由3×3=9 降低到1×3+3×1=6。

圖6 EffNet基本模塊Fig.6 EffNet basic module
改變卷積核數(shù)量的本質(zhì)其實是通過數(shù)學方式修改運算層級。將卷積進行分步運算和因式分解雖會導致卷積核總數(shù)變化,但在數(shù)學層面上,解耦操作將加法引入原本僅有乘法存在的運算中,運算層級降級,造成了模型計算量降低的結(jié)果;因式分解使得參數(shù)量由原有的指數(shù)級降低為二倍關系,運算層級降級,實現(xiàn)了網(wǎng)絡模型輕量化。但因式分解從計算量角度而言,由于乘法操作數(shù)目沒變,網(wǎng)絡的計算量基本未發(fā)生改變。而且改變卷積核數(shù)量由于使用卷積尺寸不一,在模型運行過程中需進行部分如填充等微調(diào)操作,以此來保證輸出尺寸相同。
改變卷積核數(shù)量與網(wǎng)絡寬度是在前兩節(jié)的基礎上,通過調(diào)整分解后的卷積結(jié)構(gòu),在維持輕量化效果的同時,一定程度上對模型性能進行提升。常規(guī)卷積在空間及通道方向進行解耦操作后,通常會使得模型中卷積數(shù)量增多。盡管卷積分段求和操作可降低模型計算量,但若串聯(lián)卷積的數(shù)量過多,仍會將輕量化的優(yōu)勢消除。因此需要同時對卷積結(jié)構(gòu)寬度進行調(diào)整,通過對卷積進行功能性劃分,形成各個卷積組,且將各分組卷積并聯(lián)執(zhí)行,用以彌補卷積數(shù)量帶來的問題。
LEDNet提出的分割-混洗-非瓶頸模塊(splitshuffle-non-bottleneck,SS-nbt)除進行并聯(lián)操作外,還在通道拆分和混洗兩個運算間引入了跳躍連接,結(jié)構(gòu)如圖7(d)所示。在起始位置的SS-nbt 通過通道分割操作,將輸入拆分為兩個較低維分支,每個分支為一個完整的卷積功能分組,且每個分組僅占據(jù)一半的輸入通道。分組中由一組專用的一維濾波器(例如1×3、3×1)代替逐點卷積進行轉(zhuǎn)換構(gòu)成,采用2.1 節(jié)和2.2 節(jié)中的輕量化方法,構(gòu)建出滿足提取需求功能的輕量化卷積分組。級聯(lián)可保證通道個數(shù)不變,因此調(diào)整網(wǎng)絡寬度是使用級聯(lián)對兩個分支的卷積輸出進行合并。結(jié)構(gòu)中跳躍連接的引入可重用子層參數(shù),將淺層特征復制與通過卷積后的輸出進行疊加,用來提升特征能力。通道混洗是用來實現(xiàn)兩個拆分分支之間的信息通信。

圖7 LEDNet網(wǎng)絡的基礎單元SS-nbtFig.7 Basic unit of LEDNet network:SS-nbt
通過采用并行分組結(jié)構(gòu)的方式,降低了網(wǎng)絡深度,在有限程度上對網(wǎng)絡結(jié)構(gòu)加寬,提升了網(wǎng)絡運行效率,搭配提升模型準確率的跳躍連接層。每個SS-nbt單元將合并的特征通道隨機混洗后加入下一個單元,可以看作是一種功能重用,在某種程度上擴大了網(wǎng)絡容量,卻未顯著增加復雜性。SS-nbt的設計中采用的拆分轉(zhuǎn)換合并策略受到了XNOR-Net和InceptionV3的影響,該結(jié)構(gòu)的設計方法可接近大型和密集層的表示能力,但計算復雜度卻低得多。最終LEDNet 在模型參數(shù)量不足1.0×10的情況下,運行速度卻可達71 FPS。
卷積核進行解耦拆分后,若采用直連構(gòu)成線性結(jié)構(gòu)會使得網(wǎng)絡深度加深,因此提出添加分支結(jié)構(gòu)進行多卷積操作并行處理,通過采用輕量化的卷積運算對網(wǎng)絡結(jié)構(gòu)的寬度進行修改,降低模型深度,并通過多分支卷積并行運算,提升模型的運行效率,進而提升模型性能。但分支結(jié)構(gòu)的數(shù)量需要進行人工控制,具體結(jié)構(gòu)的設定依賴所面對的具體應用需求和所使用的硬件設備。
綜上所述,卷積結(jié)構(gòu)輕量化技術(shù)通過數(shù)學運算對單一卷積進行拆解,使用更利于運算的卷積進行模型計算量的削減,但該方法多次使用會導致模型中卷積使用數(shù)量驟增,使得卷積的總計算量占模型計算總量的比重增大,拉低計算量降低的優(yōu)勢,甚至會導致模型中卷積的結(jié)構(gòu)復雜,不利于后期模型結(jié)構(gòu)調(diào)整。主要的卷積結(jié)構(gòu)輕量化技術(shù)的對比如表1所示。

表1 卷積結(jié)構(gòu)輕量化技術(shù)對比表Table 1 Comparison of convolution lightweight technology
卷積模塊是人工構(gòu)建的應用編程接口(application programming interface,API),可在代碼中直接使用縮寫進行調(diào)用,封裝包中通常包含有固定的卷積結(jié)構(gòu)模塊,可移植性高。在卷積模塊使用過程中,具體網(wǎng)絡架構(gòu)中的卷積模塊可根據(jù)需求人工進行調(diào)整,增減模塊結(jié)構(gòu)中的卷積結(jié)構(gòu)以達成特定需求,并能防止功能模塊間出現(xiàn)功能重疊的情況,造成資源浪費。輕量化卷積模塊常指經(jīng)由輕量化后的卷積操作組合構(gòu)成,由于其構(gòu)建使用輕量化后的卷積結(jié)構(gòu),輕量化模塊較普通模塊所占用計算量更小。輕量化模塊中常用模塊有殘差模塊、ResNeXt 模塊、SE 模塊以及注意力機制模塊。
在數(shù)理統(tǒng)計中,殘差通常用來表示實際觀察值與估計值(擬合值)之間的差。在一個堆積層結(jié)構(gòu)中,當輸入為時,記學習到的特征為()。與原始特征()相比,差值更容易直接學習,因此殘差作為差值計算學習可表示為:

由上述公式可知,當殘差()=0 時,堆積層僅做了恒等映射,網(wǎng)絡性能應保持不變。但事實上殘差并不為0,因此會導致堆積層在輸入特征基礎上不斷學習到新的特征,從而網(wǎng)絡也會擁有更好的性能。若網(wǎng)絡中最優(yōu)輸出為輸入,在沒有短路連接(shortcut connection)的網(wǎng)絡中,需要將其優(yōu)化成()=;而對于包含短路連接的殘差單元,可將其轉(zhuǎn)化為使得()=()-優(yōu)化為0 的需求。因此短路連接的存在可使得卷積的結(jié)構(gòu)優(yōu)化更為簡單。使用殘差單元可極大保留梯度的空間結(jié)構(gòu),解決梯度破碎現(xiàn)象,提升優(yōu)化方法的有效性。圖8 為初始殘差模塊的結(jié)構(gòu)圖。

圖8 初始殘差模塊Fig.8 Initial residual module
瓶頸模塊作為特殊的殘差結(jié)構(gòu),如圖9 所示,保持原有殘差結(jié)構(gòu)的同時,將模塊構(gòu)建成了疊加的漏斗形狀。通過上下各一個1×1 卷積,調(diào)整網(wǎng)絡特征維度,將通道個數(shù)先減小后增大。該結(jié)構(gòu)本質(zhì)上仍是在結(jié)構(gòu)優(yōu)化的基礎上,通過使用1×1 卷積人為控制通道數(shù),降低模型參數(shù)量。

圖9 殘差結(jié)構(gòu)與瓶頸結(jié)構(gòu)Fig.9 Residual structure and bottleneck structure
SqueezeNext中的基本模塊是在瓶頸模塊的基礎上進行的調(diào)整,如圖10 所示。將原始瓶頸結(jié)構(gòu)中的三維3×3 卷積因式分解為3×1 和1×3 這兩個二維卷積運算之和,并在瓶頸結(jié)構(gòu)開始前再添加一組1×1 卷積,用來降低輸入通道數(shù)。

圖10 SqueezeNext的基礎模塊Fig.10 Basic module of SqueezeNext
卷積結(jié)構(gòu)中通過調(diào)整1×1 卷積個數(shù)的使用情況,可以靈活控制每層卷積操作時的通道數(shù)量,保證3×3卷積因式分解所得的兩個卷積運算,始終處于低維通道運算中,降低模型計算量。基礎模塊最后的1×1 卷積,用來將處理好的特征恢復成與輸入同樣的維度。
ShuffleNet V1的基本模塊同樣基于瓶頸結(jié)構(gòu),如圖11 所示,圖(a)、(b)、(c)結(jié)構(gòu)依次進化。與原始瓶頸結(jié)構(gòu)不同,圖(a)將普通3×3 卷積使用更為輕量化的3×3 DW 卷積來替代,降低結(jié)構(gòu)的計算量。圖(b)在圖(a)的基礎上進一步調(diào)整,使用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 卷積使用更為輕量化。而在通道數(shù)過大的情況下,多次使用1×1 卷積,輕量化效果并不十分明顯,甚至當通道數(shù)過大時,使用1×1 卷積可能會造成計算量增加。因此,圖11(b)將1×1 的卷積進行分組后,替換原始的1×1 卷積。分組后的卷積完美解決了通道數(shù)不可控的情況,使得1×1 卷積可以保持降低計算量的功效。在第一個1×1 分組卷積后增添channel shuffle 操作是為了克服分組后信息不流通的副作用。當stride=2 時,為了保持與卷積后結(jié)果相同的特征圖大小,跳躍連接層上需要添加3×3 的平均池化操作。最后使用Concat操作取代Add操作,是因為可以將兩分支尺寸相同的計算結(jié)果直接拼接,無需重復進行Add 運算,因此降低了模型的計算量。
DetNet的空間瓶頸(dilated bottleneck)模塊同樣是對瓶頸結(jié)構(gòu)的改進,如圖12 所示,圖(c)為原始瓶頸單元。空間瓶頸結(jié)構(gòu)使用空洞卷積(dilated convolution)替換了原有的常規(guī)3×3 卷積,圖(a)與圖(b)的區(qū)別在于跳躍連接層中是否存在1×1 卷積。

圖12 DetNet的瓶頸模塊及殘差模塊Fig.12 DetNet bottleneck module and residual module
空間瓶頸模塊引入的空洞卷積,可以在不引入額外參數(shù)的情況下,任意擴大感受野。由于空洞卷積是通過對卷積核進行填充,特征圖分辨率不會如降采樣一樣丟失。卷積中的感受野范圍大小可通過調(diào)整超參數(shù)空洞率(dilation rate)進行人為控制。跳躍連接層中是否包含1×1 卷積,取決于卷積模塊所處DetNet 骨干結(jié)構(gòu)的位置。由于DetNet 骨干搭建的特殊性,含有1×1 卷積是為了進行通道加倍處理。經(jīng)過實驗證明,1×1 卷積跨通道信息融合可以更好地進行信息整合??臻g瓶頸模塊在優(yōu)化模塊上的輕量化作用并不明顯,但該模塊可大幅提升模型定位分割的能力,并同時獲得視覺任務中非常重要的多尺度信息。DetNet 比同等條件的ResNet-50 所擁有的參數(shù)量少了1.0×10,且精度提升了0.8%。
MobileNet V2提出的線性瓶頸(linear bottleneck)模塊,如圖13 所示,保留原有瓶頸結(jié)構(gòu),僅將標準瓶頸結(jié)構(gòu)中1×1 和3×3 的卷積,使用深度可分離卷積中的DW 和PW 進行替換,降低計算量。linear bottleneck 模塊為防止MobileNet V1 中PW 的激活函數(shù)破壞低維空間特征,在PW 操作后MobileNet V2 使用線性激活函數(shù)對ReLU6 進行了替換。

圖13 MobileNet V2 的Linear Bottleneck 模塊Fig.13 Linear Bottleneck module for MobileNet V2
MobileNet V2 模塊本質(zhì)上是對瓶頸結(jié)構(gòu)與深度可分離卷積進行融合。模塊結(jié)構(gòu)中DW 與第二個PW 可構(gòu)成深度可分離卷積,其卷積功效與深度可分離卷積一致。而DW 卷積前添加對DW 卷積通道數(shù)具有升維作用的PW 卷積,則是將模塊搭建成了標準漏斗形狀的瓶頸結(jié)構(gòu)。升維作用的PW 卷積解決了由于上層通道數(shù)較少影響DW 的空間特征,且DW 卷積缺少改變通道數(shù)的能力而產(chǎn)生的問題。如此構(gòu)建的linear bottleneck 模塊既有瓶頸結(jié)構(gòu)的優(yōu)化特征,還通過深度可分離卷積進行了卷積拆解,使用更輕量化的二維卷積,進一步降低了模型計算量。
GhostNet中按步長(stride)將單元瓶頸(ghost bottleneck)模塊分為兩種,如圖14 所示。stride=1 的ghost bottleneck 模塊結(jié)構(gòu)仿照普通殘差,由兩塊Ghost 模塊構(gòu)成。第一塊充當擴展層,用來增加通道數(shù)量;第二塊降低通道數(shù),將通道數(shù)量恢復到與輸入通道一致,并與跳躍連接層相連。stride=2 的ghost bottleneck 模塊擁有標準瓶頸結(jié)構(gòu)的布局,保持stride=1 時的結(jié)構(gòu)特點,通過借鑒MobileNet V2 的Linear Bottleneck 模塊的經(jīng)驗,在stride=1 結(jié)構(gòu)的中間加入中間塊,塊中使用更為輕量化的二維DW 卷積,降低計算量。吸取了MobileNet V2 的經(jīng)驗,模塊在設計過程中,除第二個Ghost 模塊后不使用ReLU 激活函數(shù)外,其他層在每層后均應用批歸一化(batch normalization,BN)和ReLU 非線性激活函數(shù)。

圖14 GhostNet的Ghost BottleneckFig.14 Ghost Bottleneck of GhostNet
殘差模塊中瓶頸結(jié)構(gòu)使用更為廣泛,在殘差結(jié)構(gòu)的搭建過程中,通常使用更為輕量化的卷積對標準卷積進行替換操作,以達到在優(yōu)化結(jié)構(gòu)的基礎上進一步降低計算量。但瓶頸結(jié)構(gòu)的設定在一定程度上會使得模型整體結(jié)構(gòu)變得復雜,不利于結(jié)構(gòu)調(diào)整時的修改。
ResNeXt 模塊本質(zhì)上是分組卷積。AlexNet 當初迫于實驗壞境,嘗試將卷積操作進行拆分,因此出現(xiàn)了分組卷積。分組卷積介于常規(guī)卷積與深度可分離卷積之間,未曾獨立賦予每個通道獨立的卷積核,也不曾對輸入圖片使用一個卷積核。分組卷積通過將卷積分組,對通道數(shù)進行了切割,因此降低了模塊的參數(shù)量,達到了輕量化的效果。
ResNeXt模塊是在Inception 網(wǎng)絡基礎上融合了ResNet 的特點,與人工設計卷積細節(jié)的Inception模塊不同,ResNeXt 模塊的各個分支均采用完全一致的卷積拓撲結(jié)構(gòu)。分組卷積的結(jié)構(gòu)設計更符合GPU的硬件設計原則,因此運行速度應快于人工設計卷積細節(jié)的Inception 模塊。ResNeXt 在ImageNet 數(shù)據(jù)集上實現(xiàn)了高于ResNet的精度,但復雜度僅占ResNet的50%。
ShuffleNet V2結(jié)構(gòu)是基于ShuffleNet V1 的設計基礎,V2 的模塊在基本模塊中添加了通道拆分模塊,效果等同于分組卷積,因此使用常規(guī)1×1 卷積代替1×1 分組卷積。ShuffleNet V2 的基礎模塊按stride分為兩種設計方案,如圖15(a)、(b)所示。圖(a)中模塊將輸入通道拆分為兩部分,一部分使用恒等映射進行特征復用,另一部分則是通過首位進行分組處理后的瓶頸結(jié)構(gòu)。圖(b)中模塊同樣將輸入通道分為兩部分,一部分使用瓶頸結(jié)構(gòu),一部分使用深度可分離卷積。stride=2 的(b)去除了(a)中的通道拆分操作,得到了輸出通道數(shù)量翻倍的效果。ShuffleNet V2以2.3 GFLOPs(floating point operations)的速度優(yōu)于ShuffleNet V1,并在FLOPs 降低40%的情況下效果優(yōu)于ResNet-50。

圖15 ShuffleNet V2 模塊Fig.15 ShuffleNet V2 module
GhostNet 中的Ghost 模塊將卷積生成的結(jié)果分為兩組,一組保留原始卷積的一部分不變,另一組進行優(yōu)化輸出特征中彼此相似的冗余特征圖。Ghost模塊是由簡單變換后得到的結(jié)果與保持不變信息的分組拼接得到的。將訓練好的網(wǎng)絡中存在的大量冗余信息中相似的特征圖看作Ghost。通過對Ghost 特征圖進行簡單變換后可以替換部分用卷積生成的特征圖,縮減模型計算量。Ghost 模塊可以通過使用簡單變換代替卷積操作生成CNN 特征中大量相似的冗余特征圖,實現(xiàn)了模型加速。GhostNet可在運行時間縮減一半的情況下,達到與ResNet相同的識別精度。
ResNeXt 模塊中的分組卷積思想實際上是對參與卷積操作的通道數(shù)進行調(diào)整。通過對卷積的通道數(shù)進行分割,然后多分組并行執(zhí)行,使得模型運算速度得到了明顯提升。且在參數(shù)量的計算上,通道數(shù)分組也大幅降低了卷積計算量。理論上,分組越多模型計算越快,但卷積的分組個數(shù)取決于當前所使用的硬件資源配置,并且與所用的網(wǎng)絡結(jié)構(gòu)設計有關,因為分組過多會影響到模型結(jié)構(gòu)的寬度。
SENet提出的SE(squeeze-excitation)模塊由squeeze和excitation 兩個操作構(gòu)成。雖然同樣基于通道分組,但不同于分組卷積與深度可分離卷積是為了達成降低計算量的目的,SE 模塊對通道分組是希望模型可以自主學到不同通道間的依賴性,得到特征之間的關系,并且能通過對全局信息的把控,將通道信息進行得分排序,強調(diào)信息特征并抑制干擾特征。為了將卷積運算時的空間依賴性與通道依賴性分離,提高對信息特征的敏感度。SE 模塊在squeeze部分采用1×1 的全局平均池化操作,將輸入特征從三維壓縮至一維,所得的一維特征可獲得全局感受野,感受范圍得到了極致地放大,避免了淺層網(wǎng)絡中小的感受野無法感知上下文信息情況的出現(xiàn)。而excitation 部分為了獲取多通道間的依賴關系,通過兩個全連接層(FC)與非線性激活函數(shù)ReLU 構(gòu)成瓶頸結(jié)構(gòu),在升維的FC 層和sigmoid 激活函數(shù)的升維控制下,參數(shù)化門控機制。excitation 部分通過對每個通道的重要性進行預測,得到不同通道的重要性大小后再將激勵作用到之前特征圖的對應通道上,使得通道擁有可以進行初選擇的不同激勵效果。
SE模塊具有良好的可移植性,可以用最小的額外計算成本為深層架構(gòu)提供顯著的性能改進。ILSVRC 2017 年,以SENet為骨干的網(wǎng)絡獲得了分類賽的第一名。MobileNet V3的瓶頸模塊中添加了SE 模塊,因為時間損耗問題將SE 模塊放在DW 卷積后,最終MobileNet V3 精度得到了進一步提升,卻未增加時間損耗。GCNet提出將SE 模塊中squeeze 部分的全局平均池化操作使用簡化的非局部(non-local)模塊替代,使得模型輕量化且可以有效對全局上下文建模。在目標檢測方面,GCNet 的平均精度(average precision,AP)較SENet提升1.7%,F(xiàn)LOPs僅增加0.07%。
經(jīng)由前文可知,SE 模塊在squeeze 部分使用1×1卷積降維,并在excitation 中構(gòu)成優(yōu)化的瓶頸結(jié)構(gòu),降低了卷積結(jié)構(gòu)的計算量。但瓶頸結(jié)構(gòu)中的FC 層較為耗時,因此,在通道數(shù)較少時使用該模塊可獲得最佳效果。SE 模塊可依據(jù)上下文對通道進行權(quán)值標定,調(diào)整通道依賴,non-local模塊可通過使用聚集其他位置信息來加強此位置特征信息的功能。并且nonlocal 模塊在不同位置時全局上下文信息幾乎相同。SE 模塊與non-local 模塊功能具有輔助作用,且nonlocal模塊的出現(xiàn)解決了SE 模塊無法充分利用上下文的缺點,適合聯(lián)合使用。
注意力機制模塊CBAM(convolutional block attention module)是輕量級通用模塊,可在通道維度和空間維度兩方面進行特征聚焦,并對兩方面的獨立維度進行集成?;诳臻g維度和通道維度可分為通道注意力模塊(channel attention module,CAM)和空間注意力模塊(spatial attention module,SAM)兩部分。
CAM 是對SE 模塊結(jié)構(gòu)的調(diào)整,在SE 模塊的基礎上,CAM 中添加了一個全局最大池化操作。CAM在空間維度上壓縮特征圖為一維矢量,并使用全局平均池化與全局最大池化對空間映射的特征信息進行聚合,通過共享全連接層對結(jié)果進行逐元素加和操作。雙重池化操作的結(jié)構(gòu)設定,可使得所提取的高層次特征內(nèi)容更豐富,提供更為精細的信息。SAM是將CAM 操作后的結(jié)果基于通道進行Concat 操作,經(jīng)由卷積進行單通道降維。SAM 同CAM 一樣均采用雙重池化操作。CBAM 與SE 模塊相似,模塊結(jié)構(gòu)中多采用1×1 卷積進行操作,通過SAM 調(diào)整通道維度,完成對特征圖的信息提取。
ThunderNet使用輕量級骨干網(wǎng)絡與小分辨率圖像輸入,使得模型特征提取部分表現(xiàn)力有限,不能正確學習特征分布。為解決小主干和小特征圖的性能退化問題,ThunderNet壓縮了區(qū)域生成網(wǎng)絡(region proposal network,RPN)和R-CNN子網(wǎng),提出了上下文增強模塊(context enhancement module,CEM)和空間注意力模塊(SAM)兩個模塊。CEM 的功能與特征金字塔網(wǎng)絡(feature pyramid networks,F(xiàn)PN)的多尺度思想類似,且CEM 僅采用骨干后三層數(shù)據(jù)進行操作,因此CEM 具有FPN 的功能,且擁有比FPN 更為精簡的效果。SAM 使用RPN 中的得分結(jié)果對CEM的特征圖進行加權(quán),達到抑制背景區(qū)域特征的目的,與CEM 運算幾乎不增加計算量相比,SAM 會增加5%的網(wǎng)絡計算量。CEM 和SAM 的使用最終可將模型精度提升1.7%。
坐標注意力(coordinate attention,CA)模塊將通過二維全局池化操作生成一維特征向量的CAM調(diào)整為經(jīng)由兩個一維全局池化,并在垂直和水平方向上將CAM 進行特征編碼,最終得到兩個含有特定方向信息的注意力圖。該注意力圖中分別包含輸入特征圖在該方向上的長距離依賴,即注意力圖含有輸入特征圖的位置信息。CA 模塊所得注意力圖具有對特征圖的方向和位置信息敏感的特性,增強了模型定位和劃分待定區(qū)域的精準度,且CA 模塊具有良好的可移植性,移植過程中幾乎沒有計算開銷。
注意力機制模塊是一種簡單而有效的模塊,它達到了與基礎卷積同時進行端到端訓練的程度。在兩個獨立維度上,注意力機制模塊可以做到沿著不同維度分別進行注意力圖推斷,并在特征圖提取基礎上進行自適應優(yōu)化。在注意力推斷過程中使用輕量化的1×1 卷積進行操作,將特征提取過程中被忽略的位置信息標記于卷積通道,并通過方向與特征信息在空間維度中加強模型的定位能力。注意力機制模塊在網(wǎng)絡中常位于前饋神經(jīng)網(wǎng)絡的常規(guī)卷積層后,可忽略該模塊開銷將其無縫集成至任意CNN 架構(gòu),可移植性好。但由于其結(jié)構(gòu)中包含F(xiàn)C 結(jié)構(gòu),應避免在通道數(shù)較多的層中多次使用。
綜上所述,卷積模塊輕量化技術(shù)通過使用輕量化卷積搭建所需的功能模塊結(jié)構(gòu),在降低計算量的同時盡可能提升模型效率,但在卷積模塊的設計過程中為滿足具體應用需求,可能會使用提升模型性能卻不利于降低計算量的設計,甚至不同功能性模塊間的結(jié)構(gòu)設計會相互影響,從而影響模型性能提升。因此,功能性輕量化模塊具有一定提升模型性能與降低計算量作用,但需要在具體的網(wǎng)絡結(jié)構(gòu)中依據(jù)具體需求進行人為調(diào)整。主要的模塊輕量化技術(shù)的對比如表2 所示。

表2 模塊輕量化技術(shù)對比Table 2 Comparison of lightweight technology of modules
近年來硬件設備的發(fā)展賦予了卷積運算新的發(fā)展思路。乘法運算的卷積操作十分消耗網(wǎng)絡資源與能量,因此模型雖可以正常運轉(zhuǎn),但乘積類運算參數(shù)量過多,使得模型可移植性較低。對乘法操作進行替換是解決模型高計算量和功耗預算的有效方式。
DeepShift網(wǎng)絡通過執(zhí)行按位移位和按位取反的操作來替換原有前向傳播中的浮點乘法運算,減少模型運行過程中推理所需計算時間。按位移位操作可等價為將輸入數(shù)字的基礎二進制與2 的冪次方進行乘積運算,但2 的冪次方無論冪次取值為何,結(jié)果恒大于0,因此按位移位可取代常規(guī)卷積中的絕對值乘法運算。在網(wǎng)絡中,正值和負值的濾波器均有助于網(wǎng)絡的邊緣檢測,因此DeepShift 加入了取反運算,按位取反操作保證了網(wǎng)絡訓練過程中負值的乘積運算出現(xiàn)。在硬件電路設備中,移位和取反操作甚至比加法操作速度還快,因此使用按位移位和按位取反來替換乘積運算,可使模型運行速度更快。與二值化神經(jīng)網(wǎng)絡(binarized neural networks,BNN)這類僅可以在小型數(shù)據(jù)集上加快網(wǎng)絡運算速度的方法不同,DeepShift 網(wǎng)絡在ImageNet 這類大型數(shù)據(jù)集上也可正常使用,且能維持90%的精度。
在常規(guī)卷積輕量化的方法中,雖注意到可以對卷積的乘法操作進行替換,但似乎很少有人可以站在硬件資源加速的角度,使用底層算法徹底進行卷積加速,這個想法既新穎又很大膽。DeepShift 的訓練方式與常規(guī)卷積訓練方式相同,但參數(shù)與梯度變化需要按照固定公式進行調(diào)整。DeepShift 通過2 的冪次方進行按位移位操作,但當冪次方取值小于1時,結(jié)果分布較為密集,而當冪次方取值大于1 時,結(jié)果分布卻越來越稀疏。這樣的分布差距可能會隨著取值范圍的變化而對DeepShift 的移位運算造成越來越大的近似誤差。
現(xiàn)階段,對于卷積運算的替代方式嚴重依賴于底層硬件設備的設計,二進制運算過程中會使得冪次運算在替換過程中出現(xiàn)不可避免的運算方面的誤差,從而導致模型在實際應用方面受限。但該替代卷積運算的新潮思想,仍能作為未來研究的一個方向。
使用更廉價的操作代替原有乘法運算已成為卷積輕量化方法的核心思想,在廉價操作替換完畢后,通過卷積間的關系以及各種輔助工具對功能性卷積進行調(diào)整,便可得到較為滿意的輕量化功能性卷積結(jié)構(gòu)。
本文對近幾年輕量化模型進行了歸類分析,所涉模型涵蓋多種類別,包含目標檢測、目標識別、語義分割、圖像分類等實際視覺應用需求,卷積輕量化的主要途徑為:
(1)優(yōu)化單一卷積。普通卷積單一乘法的計算方式疊加起來所需算力驚人,不適用于算力有限的小型便攜式設備。通過不同研究方向,將常規(guī)卷積完整的一次乘法運算進行拆解,使用更為低級的加法運算替換掉部分乘法運算,以此達到輕量化的目的。
(2)優(yōu)化卷積間結(jié)構(gòu)。卷積間結(jié)構(gòu)指輕量化卷積模塊。卷積模塊的構(gòu)建需要按照具體應用需求進行設計,設計方法有兩種:第一種是直接在現(xiàn)有的輕量化卷積模塊上按照需求進行修改;第二種是首先設計出滿足要求的傳統(tǒng)卷積模塊結(jié)構(gòu),其次通過借用單一卷積得到的輕量化后的卷積,對傳統(tǒng)卷積模塊中的卷積進行替換,然后使用現(xiàn)有輕量化功能結(jié)構(gòu)或使用激活函數(shù)之類的工具調(diào)整輕量化卷積在模塊間的結(jié)構(gòu)關系,最后達成輕量化卷積功能模塊的效果。
(3)優(yōu)化網(wǎng)絡結(jié)構(gòu)中的卷積。出于對硬件設備運行速度的考量,使用底層運算對卷積運算進行替代。通過底層運算的聯(lián)合,取代卷積的高階乘法運算,以達到輕量化的目的。
卷積作為深度學習的構(gòu)成基礎,將卷積輕量化可最大限度地提高網(wǎng)絡計算效率,減少卷積間的冗余計算量,使模型在相同識別精度下,卷積在參數(shù)量或計算量上占比有所下降,使得模型便于在移動式視覺終端上使用。模型輕量化的效果如表3 所示。通過表3 數(shù)據(jù)可知,搭配工具使用了輕量化的卷積或功能模塊,在降低參數(shù)量或者提升運行速度的同時,準確率均得到了一定程度的提升。

表3 模型輕量化效果對比Table 3 Comparison of model lightweight effects

表3 (續(xù))
但當前輕量化網(wǎng)絡模型的卷積輕量化操作還略顯稚嫩,均是圍繞使用廉價操作替換卷積運算展開的。按照使用底層運算提升硬件運行速度的發(fā)展來看,或許可以從底層運算入手,設計出一款基于底層運算的卷積操作。
希望本文可以幫助讀者認識卷積輕量化的方法,對設計輕量化卷積結(jié)構(gòu)提供啟發(fā),并能針對具體需求設計或組合出高效的輕量化模型。