張 良,張 增 ,舒?zhèn)トA,梅魁志
1.武漢數(shù)字工程研究所,武漢 430074
2.西安交通大學(xué) 電子與信息工程學(xué)部,西安 710049
3.中國航發(fā)南方工業(yè)有限公司,湖南 株洲 412002
卷積神經(jīng)網(wǎng)絡(luò)是深度學(xué)習(xí)[1]中重要的算法,在模式識(shí)別、圖像處理、自動(dòng)控制和智能機(jī)器人等方面有著廣泛的應(yīng)用。隨著研究中對(duì)精度、數(shù)據(jù)集要求提高,卷積神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)層數(shù)、計(jì)算復(fù)雜度也隨之增加。
目前,卷積神經(jīng)網(wǎng)絡(luò)主要在GPU(Graphics Processing Unit)或高性能 CPU(Central Processing Unit)上面運(yùn)行,可以達(dá)到很流暢的運(yùn)行效果,但是在各類移動(dòng)設(shè)備、嵌入式設(shè)備中,會(huì)面臨功耗、體積、計(jì)算速度等限制。如何在保證卷積神經(jīng)網(wǎng)絡(luò)精度不下降的情況下,降低網(wǎng)絡(luò)計(jì)算量,削減網(wǎng)絡(luò)模型存儲(chǔ)空間,使之能在資源受限的設(shè)備上高效運(yùn)行是亟需解決的問題。本文中提出的結(jié)構(gòu)化剪枝就是一種對(duì)卷積神經(jīng)網(wǎng)絡(luò)壓縮和優(yōu)化的方法。網(wǎng)絡(luò)剪枝能夠通過去除模型中的部分連接加速卷積神經(jīng)網(wǎng)絡(luò)。剪枝的主要步驟是:訓(xùn)練原始網(wǎng)絡(luò),更新網(wǎng)絡(luò)中各個(gè)參數(shù)的權(quán)值;對(duì)網(wǎng)絡(luò)中權(quán)重較低的參數(shù)進(jìn)行修剪;重新訓(xùn)練網(wǎng)絡(luò),恢復(fù)神經(jīng)網(wǎng)絡(luò)精度[2]。
剪枝可以分為結(jié)構(gòu)化剪枝和非結(jié)構(gòu)化剪枝兩類。結(jié)構(gòu)化剪枝相對(duì)非結(jié)構(gòu)化剪枝的最明顯特點(diǎn)是它產(chǎn)生的稀疏矩陣是有規(guī)則的,剪枝后網(wǎng)絡(luò)加速需要的運(yùn)算量更少[3]。
結(jié)構(gòu)化剪枝按照剪枝依據(jù)可分為基于重要性和基于正則化的剪枝方法,本文采用的是基于重要性的剪枝方法[4]。結(jié)構(gòu)化剪枝按照被剪枝單元可分為向量級(jí)、核級(jí)[5]、組級(jí)和通道級(jí)剪枝[6]四種。本文選擇的是卷積核級(jí)的結(jié)構(gòu)化剪枝方案。
對(duì)YOLOv3模型的研究很多,在汲取其中精華思想后[7-10],本文對(duì)YOLOv3[11-12]結(jié)構(gòu)化剪枝的方法是:單層一種卷積過濾器,設(shè)計(jì)公式計(jì)算每層重要性得分,并給出了一種可靠簡易的稀疏值分配策略,更快速、準(zhǔn)確地給每層分配合適的稀疏值以及卷積過濾器。
結(jié)構(gòu)化剪枝是在犧牲極限壓縮率的前提下,用以彌補(bǔ)非結(jié)構(gòu)化剪枝在硬件實(shí)現(xiàn)、在線推理內(nèi)存訪問效率不高的缺陷。
將7×7的卷積核剪枝成5×7或更小的卷積核,對(duì)應(yīng)到參數(shù)矩陣,即刪掉若干行。雖然輸入矩陣的列數(shù)需要減少,但是這樣剪枝并沒有改變通道個(gè)數(shù),不僅有著絕對(duì)的壓縮效果,而且在進(jìn)行im2col[13](重排圖像塊為矩陣列)操作(修改步長等參數(shù))后,對(duì)輸入特征圖和輸出矩陣沒有任何影響。
對(duì)YOLOv3卷積層參數(shù)壓縮方法研究與設(shè)計(jì)如圖1所示,中間部分為模型結(jié)構(gòu)化剪枝的主流程,左邊虛線框內(nèi)為計(jì)算層重要性得分的具體過程,右邊虛線框內(nèi)為稀疏值配置的具體過程。通過對(duì)模型的權(quán)值參數(shù)計(jì)算得到每個(gè)可結(jié)構(gòu)化剪枝卷積層的重要性得分,根據(jù)重要性得分以及稀疏值分配策略,給每個(gè)可結(jié)構(gòu)化剪枝的卷積層匹配合適的稀疏值并選擇適當(dāng)?shù)木矸e過濾器。在結(jié)構(gòu)化剪枝壓縮優(yōu)化之后,還能加入定點(diǎn)化壓縮優(yōu)化過程,定點(diǎn)化壓縮優(yōu)化效果需要在合適的硬件平臺(tái)上才能得到更好的展示。
ANWAR 等人[14]在論文中使用N個(gè)卷積過濾器對(duì)相應(yīng)的N個(gè)輸入數(shù)據(jù)矩陣進(jìn)行的剪枝操作如圖2[14]所示。這種剪枝操作因?yàn)槊繉佑卸喾N卷積算子,導(dǎo)致剪枝過程非常耗時(shí),故本文只使用很小的驗(yàn)證數(shù)據(jù)集,用于卷積層單元打分,測試算法的性能。
在此基礎(chǔ)上進(jìn)行的主要改進(jìn)是:每層只使用一種單元過濾器;通過對(duì)各層重要性評(píng)估來決定每層使用的單元過濾器,而不需要耗時(shí)的訓(xùn)練;改進(jìn)每個(gè)卷積對(duì)于整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)重要性公式。
本文結(jié)構(gòu)化剪枝原理如圖3 所示。對(duì)于每一層只使用一種卷積過濾器,對(duì)于一張輸入數(shù)據(jù)矩陣,因?yàn)槊恳粚又皇褂靡环N卷積過濾器,所以經(jīng)過im2col操作選取的數(shù)據(jù)區(qū)域也是完全一樣的。根據(jù)卷積運(yùn)算原理可知,上一層的輸出矩陣(即該層的輸入矩陣),需要與多組卷積核進(jìn)行卷積計(jì)算,每一個(gè)輸入數(shù)據(jù)矩陣只需要經(jīng)過一次比原始矩陣小的im2col 變化,就能反復(fù)地被其他的卷積核利用,這樣做可以節(jié)省大量的存儲(chǔ)資源和運(yùn)算資源。
接下來需要解決的問題為:確定符合結(jié)構(gòu)化剪枝的卷積過濾器;確定待剪枝卷積層相應(yīng)的卷積過濾器;確定合適的模型調(diào)整策略,保證模型性能不變的同時(shí)得到最大模型壓縮效果。
圖1 YOLOv3模型結(jié)構(gòu)化剪枝流程圖
圖2 Anwar等人卷積核級(jí)別結(jié)構(gòu)化剪枝示意圖
圖3 本文結(jié)構(gòu)化剪枝原理示意圖
通過前面對(duì)YOLOv3 模型網(wǎng)絡(luò)結(jié)構(gòu)的研究發(fā)現(xiàn),YOLOv3 模型的卷積層只有3×3 和1×1 兩種尺寸(當(dāng)前模型優(yōu)化趨勢,且類似5×5、7×7等大卷積核可以優(yōu)化為由多個(gè)3×3卷積核替代)。由于1×1尺寸的卷積層的權(quán)值參數(shù)相對(duì)較少并且不適合本文的結(jié)構(gòu)化剪枝方法,于是只對(duì)3×3的卷積層進(jìn)行剪枝壓縮操作,后續(xù)可以做相關(guān)實(shí)驗(yàn)評(píng)估1×1 層卷積核參數(shù)對(duì)YOLOv3 整個(gè)網(wǎng)絡(luò)性能的影響。
為了制作3×3 卷積算子結(jié)構(gòu)化剪枝所需單元過濾器,引入三個(gè)參數(shù):Kp_stride 為剪枝(或保留)步長,Kp_offset=i為剪去的第一個(gè)值的位置編號(hào)為i,Kp_keepset=j為保留的第一個(gè)值的位置編號(hào)為j。0~8 為3×3 卷積算子9 個(gè)數(shù)據(jù)的編號(hào)。如圖2 所示,原始卷積核的參數(shù)為1~9,剪枝后用0代替,現(xiàn)在列舉幾組不同參數(shù)的卷積算子剪枝情況。
枚舉出四種離散的結(jié)構(gòu)規(guī)范的卷積過濾器如圖4~圖7 所示。每種稀疏值有一種或者多種不同的卷積過濾器形狀,其中“1”表示保留卷積核算子的相應(yīng)位置數(shù)值,“0”表示剪枝掉卷積核算子的相應(yīng)位置數(shù)值。當(dāng)確定一個(gè)卷積層的稀疏值后,可以選擇該稀疏值中任何一種卷積過濾器形狀,然后對(duì)網(wǎng)絡(luò)中的3×3的卷積核進(jìn)行規(guī)則的結(jié)構(gòu)化剪枝操作。
圖4 稀疏值為1/3(0.33)
圖5 稀疏值為4/9(0.44)
圖6 稀疏值為5/9(0.56)
圖7 稀疏值為2/3(0.67)
卷積神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)需要依托深度學(xué)習(xí)框架。本文中采用的深度學(xué)習(xí)框架是Caffe[15],它是一個(gè)簡約高效、應(yīng)用廣泛的開源深度學(xué)習(xí)框架。
前期使用自制小數(shù)據(jù)集進(jìn)行了相關(guān)測試,實(shí)驗(yàn)結(jié)果表現(xiàn)良好。為了理論的證實(shí)更加科學(xué),這里使用的數(shù)據(jù)集是Pascal VOC 2012 數(shù)據(jù)集(http://host.robots.ox.ac.uk/pascal/VOC),訓(xùn)練集包括11 540張圖片,測試集包括4 952 張圖片(VOC 2007 數(shù)據(jù)集測試集部分)。訓(xùn)練集與測試集的圖片數(shù)量比例為1∶2,屬于規(guī)范數(shù)據(jù)集。
本文對(duì) YOLOv3 中卷積算子尺寸為 3×3 的 38 個(gè)卷積層進(jìn)行結(jié)構(gòu)化剪枝。同時(shí)對(duì)多個(gè)卷積層進(jìn)行結(jié)構(gòu)化剪枝,最大的問題在于如何分配每層的稀疏值。改進(jìn)Liu等人[16]提出的冗余度度量公式(1)用于實(shí)驗(yàn)。
第l層的第n個(gè)卷積核Sl(n) 的稀疏性公式如公式(2)所示:
式中,Ml為所有卷積核權(quán)值絕對(duì)值的平均值;l為指定層序號(hào);kl,nchw為卷積核權(quán)值;N為輸入通道數(shù);C為輸出通道數(shù);H、W為卷積核的高和寬;Sl(n)為卷積核稀疏性;n,c,h,w為正整數(shù)且n∈[1,N],c∈[1,C],h∈[1,H],w∈[1,W]。
簡而言之,如果卷積核有幾個(gè)系數(shù)小于該層的平均值,則Sl(n)接近1,這意味著該卷積核比其他卷積核的參數(shù)更冗余。
借鑒公式(1)與(2)的思路,提出層重要性得分Ml*(即在全局網(wǎng)絡(luò)中貢獻(xiàn)度),計(jì)算方法如公式(3):
對(duì)YOLOv3的38個(gè)待剪枝卷積層進(jìn)行重要度定量評(píng)估,并通過每層的分配各層的稀疏率。將38個(gè)層的Ml*累加得到,每個(gè)層在全局網(wǎng)絡(luò)中重要性程度為,具體分布情況如圖8所示。
對(duì)各層稀疏值的分配,遵循重要度和稀疏值成正相關(guān)(即重要性越大,分配的稀疏值越大),并且對(duì)重要度不同的層分配具有梯度的稀疏值,為了簡化實(shí)驗(yàn)步驟,擬將相近重要度卷積層分配相同的稀疏值。
圖8 38個(gè)可剪枝層重要度全局網(wǎng)絡(luò)占比情況
根據(jù)圖9所示的稀疏值分配與調(diào)整策略對(duì)YOLOv3的38個(gè)可結(jié)構(gòu)化剪枝的卷積層進(jìn)行合理的稀疏值分配與調(diào)整。
圖9 稀疏值分配與調(diào)整策略示意圖
圖8 的縱坐標(biāo)為單層重要性程度Dl,按照從小到大對(duì)Dl進(jìn)行排序,根據(jù)Dl最大、最小值進(jìn)行等間距區(qū)間分段,遵循每一個(gè)區(qū)段使用一種稀疏值,區(qū)間數(shù)量需要通過觀察Dl數(shù)據(jù)規(guī)律結(jié)合經(jīng)驗(yàn)給出,保證總段數(shù)不超過層總數(shù)的一半,盡量區(qū)分開各卷積層。每改變一次稀疏值進(jìn)行一次再訓(xùn)練操作,若模型性能保持良好,繼續(xù)增大稀疏值,直至模型性能有較大的損失,用此次試驗(yàn)上一次的稀疏值為最終值。
模型性能的評(píng)價(jià)標(biāo)準(zhǔn)為準(zhǔn)確率或者目標(biāo)識(shí)別網(wǎng)絡(luò)中的mAP 值;若保持準(zhǔn)確率或者mAP 值不下降則為模型性能保持良好,若下降超過預(yù)設(shè)閾值則表示模型性能有較大的損失。然后,在前面基礎(chǔ)上對(duì)下一個(gè)重要性得分區(qū)間的卷積層重復(fù)上述工作,直至完成對(duì)最后一個(gè)區(qū)間的卷積層稀疏值配置工作,得到全可剪枝卷積層的稀疏值初始配置。
最后,可以修改少數(shù)卷積層的稀疏值進(jìn)行再訓(xùn)練微調(diào),得到最終稀疏值配置;以上步驟按重要性同時(shí)將一個(gè)或者幾個(gè)卷積層稀疏值設(shè)置為相同的值,導(dǎo)致靠近重要性區(qū)段兩端的卷積層稀疏值分配準(zhǔn)確度不高,需要對(duì)這些靠近重要性區(qū)段兩端的一些卷積層進(jìn)行如下微調(diào):數(shù)值小的一端稀疏值變大、數(shù)值大的一端稀疏值變小,遵循改變一次立即進(jìn)行再訓(xùn)練操作,比較模型性能前后的變化,得到最終全可剪枝卷積層的稀疏值配置,模型性能的評(píng)判依據(jù)準(zhǔn)確率或者目標(biāo)識(shí)別中的mAP值。
YOLOv3 模型各層重要性得分、全局占比、層參數(shù)量等參數(shù)如表1所示。
表1 YOLOv3模型Mj 值、全局占比及層參數(shù)量
依據(jù)重要性得分公式(3)計(jì)算出每個(gè)可結(jié)構(gòu)化剪枝卷積層的得分Mj值,然后將38個(gè)層的重要性累加得到;每個(gè)層重要性全局占比為最后根據(jù)稀疏值配置策略,得到了全部38 層卷積層結(jié)構(gòu)化剪枝的三個(gè)參數(shù) kp_stride、kp_offset、kp_keepset。除去第一層重要性得分過大不做結(jié)構(gòu)化剪枝操作,其他37個(gè)層都分配了合適的稀疏值以及選擇適當(dāng)?shù)木矸e過濾器。
最終調(diào)試完成后確定的各層稀疏值,以及個(gè)卷積層結(jié)構(gòu)化剪枝使用的卷積過濾器的3 個(gè)參數(shù)kp_stride、kp_offset、kp_keepset如表2所示。
表2 每層稀疏率及卷積過濾器參數(shù)
表2 中的 1~80、88~92、100~104 與表1 中的層相對(duì)應(yīng),包含上下界限;stride、offset、keepset即為卷積層結(jié)構(gòu)化剪枝的三個(gè)參數(shù)kp_stride、kp_offset、kp_keepset。
根據(jù)表1 中對(duì)每個(gè)可結(jié)構(gòu)化剪枝卷積層的參數(shù)設(shè)置,進(jìn)行了結(jié)構(gòu)化剪枝壓縮訓(xùn)練,并測得相應(yīng)的mAP值,整理如表3所示。
表3 結(jié)構(gòu)化剪枝前后mAP及模型文件大小比較
從表3 中可以得到剪枝后的模型mAP 值下降了0.054 45 左右(與原始模型相比,mAP 值下降5.5%),雖然模型精度在數(shù)值上下降了,但是模型對(duì)目標(biāo)物體的識(shí)別實(shí)際情況沒有影響。隨機(jī)抽取圖像進(jìn)行目標(biāo)物體檢測,并將剪枝前后的模型對(duì)圖像中物體的識(shí)別框標(biāo)注情況以及識(shí)別的概率值進(jìn)行比較。隨機(jī)選取三張圖片對(duì)比結(jié)構(gòu)化剪枝前后目標(biāo)識(shí)別概率,如圖10~圖12所示。
圖10 結(jié)構(gòu)化剪枝目標(biāo)檢測對(duì)比結(jié)果一
圖11 結(jié)構(gòu)化剪枝目標(biāo)檢測對(duì)比結(jié)果二
圖12 結(jié)構(gòu)化剪枝目標(biāo)檢測對(duì)比結(jié)果三
圖10 中,3 個(gè)比較完整的目標(biāo) person1、person2、horse1 在剪枝后識(shí)別概率值仍為100%,不完整且比較靠后的目標(biāo)Person3、Person4、Horse2、Horse3 剪枝后識(shí)別概率有少許下降,但是對(duì)物體的識(shí)別準(zhǔn)確率(top-1)沒有變化,圖中每個(gè)目標(biāo)都可以被準(zhǔn)確無誤的識(shí)別,對(duì)于實(shí)驗(yàn)結(jié)論不會(huì)產(chǎn)生影響。通過觀察,剪枝前后,識(shí)別框無明顯差別(數(shù)量與位置,說明識(shí)別概率較高),并且識(shí)別準(zhǔn)確率無明顯下降。
目前算法更加注重于理論的建立,新方法的提出;本文只對(duì)3×3的算子進(jìn)行結(jié)構(gòu)化剪枝,下一步會(huì)在其他卷積神經(jīng)網(wǎng)絡(luò)模型中對(duì)其他諸如7×7、5×5 的卷積核進(jìn)行結(jié)構(gòu)化剪枝,使得算法在識(shí)別所有目標(biāo)時(shí)都能達(dá)到更高的識(shí)別概率,并在實(shí)際的工程應(yīng)用中有更好的表現(xiàn)。
從這三幅圖的測試對(duì)比結(jié)果可以看出,剪枝前后的模型都能檢測出所有物體,只是剪枝后模型在物體分類識(shí)別準(zhǔn)確率方面要稍遜于剪枝前模型。
接下來,從計(jì)算資源使用角度對(duì)結(jié)構(gòu)化剪枝后的YOLOv3模型進(jìn)行評(píng)估,使用的模型為YOLOv3-416模型;參考數(shù)值為YOLOv3官方網(wǎng)站的數(shù)據(jù)。
使用FLOPS(Floating-point Operations Per Second,每秒浮點(diǎn)運(yùn)算次數(shù))來評(píng)估YOLOv3 運(yùn)算資源占用情況。FLOPS 的計(jì)算方法為:假設(shè)有m×k的矩陣A和k×n的矩陣B相乘,最終得到m×n的矩陣C,總的運(yùn)算量為m×k×n次乘加,將一次乘加看成兩次運(yùn)算,則最終需要2×m×k×n次運(yùn)算。
根據(jù)表1、依據(jù)重要性得分公式(3)計(jì)算出每個(gè)可結(jié)構(gòu)化剪枝卷積層的得分Mj值,然后將38 個(gè)層的重要性累加得到;每個(gè)層重要性全局占比為Dl=,最后根據(jù)稀疏值配置策略,得到了全部38層卷積層結(jié)構(gòu)化剪枝的3個(gè)參數(shù)kp_stride、kp_offset、kp_keepset。除去第一層重要性得分過大不做結(jié)構(gòu)化剪枝操作,其他37 個(gè)層都分配了合適的稀疏值以及選擇適當(dāng)?shù)木矸e過濾器。
最終調(diào)試完成后確定的各層稀疏值,以及個(gè)卷積層結(jié)構(gòu)化剪枝使用的卷積過濾器的3 個(gè)參數(shù)kp_stride、kp_offset、kp_keepset 如表2 所示。表中的輸入、輸出數(shù)據(jù)以及卷積過濾器信息結(jié)合圖4、圖5、圖6、圖7卷積過濾器結(jié)構(gòu),可以得到卷積運(yùn)算過程中im2col操作后得到的矩陣相關(guān)長寬信息,繼而使用上述的計(jì)算方法得到剪枝后YOLOv3 模型預(yù)測一次需要的總浮點(diǎn)運(yùn)算量,如表4所示。
表4 YOLOv3預(yù)測一次總浮點(diǎn)運(yùn)算量
可以得到剪枝后,模型預(yù)測一次需要的總浮點(diǎn)運(yùn)算量減少了46%左右,再加上接下來全部卷積層定點(diǎn)化壓縮優(yōu)化操作,理論上經(jīng)過本文壓縮優(yōu)化后的YOLOv3模型在硬件上平臺(tái)上能獲得非常高效的性能。
在Darknet上實(shí)現(xiàn)YOLOv3卷積層結(jié)構(gòu)化剪枝的參數(shù)壓縮方法。通過單層剪枝實(shí)驗(yàn)得到的YOLOv3 模型參數(shù)具有冗余性,根據(jù)YOLOv3 具有卷積層多、卷積核尺寸大小單一等特點(diǎn),提出了一種針對(duì)卷積層每層只使用一種卷積過濾器的結(jié)構(gòu)化剪枝方法。設(shè)計(jì)評(píng)估卷積層相對(duì)整個(gè)網(wǎng)絡(luò)重要性的公式,計(jì)算得分并排序,然后對(duì)卷積層分配稀疏值以及卷積過濾器,最后在結(jié)構(gòu)化剪枝的基礎(chǔ)上增加定點(diǎn)化操作,使得模型能在硬件平臺(tái)上穩(wěn)定運(yùn)行。