張瑞琰 安軍社 姜秀杰
1(中國科學院國家空間科學中心復雜航天系統(tǒng)電子信息技術重點實驗室 北京 100190) 2(中國科學院大學 北京 100049)
深度卷積神經(jīng)網(wǎng)絡(DCNN)在圖像分類[1]、圖像檢測[2]和視頻跟蹤[3]等領域有著廣泛應用。然而參數(shù)冗余和計算量大的問題限制了其在嵌入式設備的部署。比如一幅227×227的圖像在AlexNet網(wǎng)絡中訓練時,參數(shù)量可達122 MB,MFLOPS高達724,其中高參數(shù)多集中于全連接層,而高計算量主要集中于卷積層。為解決高參數(shù)的問題,多采用卷積層替代全連接層的方法,因此卷積層的優(yōu)化成為網(wǎng)絡壓縮關注的熱點,這引發(fā)了本文對算法優(yōu)化的探究。
剪枝[4]作為一種簡便的網(wǎng)絡壓縮的有效方法,常用在目標檢測[5]和機器翻譯[6]等領域。一個標準化剪枝流程分為:預訓練、剪枝和微調,如圖1(a)所示。預訓練即訓練一個基準網(wǎng)絡,該網(wǎng)絡往往是參數(shù)量冗余的復雜網(wǎng)絡。網(wǎng)絡訓練完成后,其參數(shù)按照規(guī)定的某個標準進行排序,以判斷這些參數(shù)的重要性,將其中不重要的參數(shù)進行剪枝處理,得到精簡化模型,這一過程即為剪枝。而此時模型精度會有所下降,需要對模型再進行訓練達到要求的精度,稱作微調。該流程中,多次訓練十分消耗資源,因此本文更傾向于在預訓練之前實行一次性剪枝[7],獲取精簡模型,下一步只需以正常步驟訓練精簡模型即可。如此可節(jié)省大量的計算和存儲資源,同時也可以加快前向推斷速度,該流程如圖1(b)所示。

圖1 標準化剪枝流程和初始化剪枝流程
傳統(tǒng)的剪枝往往是數(shù)據(jù)驅動剪枝,根據(jù)訓練好的參數(shù)數(shù)值來進行排序。而文獻[8]指出結構化剪枝[9]的意義在于獲得一個優(yōu)化模型架構,重要的是結構而非權重的值。因此,本文試圖尋找一種適合結構化剪枝的方法,得到模型的精簡結構。同時考慮到精簡模型的結構往往是手工設計好的,譬如PFEC[9]利用敏感度分析的方法確定基準網(wǎng)絡每一層的剪枝通道數(shù),其中敏感度分析是控制其他層不變,改變某一層的輸出通道數(shù)來訓練,對于一次性全局剪枝而言,該方法并不完全適用;SFP[10]將卷積層按照相同比例進行“裁剪”(這里的“裁剪”只是將其置0)。基于此,本文認為以相同比例裁剪網(wǎng)絡有利于保存網(wǎng)絡的層間結構,輔以某種全局的權重重要性標準,可以一次性得到更好的精簡化網(wǎng)絡結構。考慮到權重的連接敏感度常用來判斷某個權重是否重要,因此可將其擴展為整個濾波器的重要性判斷標準。
綜上,本文提出了一種初始化全局剪枝的方法,綜合考慮層間結構和權重連接敏感度。剪枝基于濾波器的粗粒度方式,產(chǎn)生了一個緊湊的精簡模型,便于后續(xù)訓練和部署。
網(wǎng)絡壓縮已經(jīng)是神經(jīng)網(wǎng)絡研究中越來越重要的課題之一。人們?yōu)榱藢⑷斯ぶ悄墚a(chǎn)品(算法)落地化而不得不考慮實際需求,如計算量、資源分配、存儲等等。而在網(wǎng)絡壓縮中,較熱門的四個分支為低秩分解、量化、剪枝和輕型網(wǎng)絡。
低秩分解[11-12]是將權重矩陣分解為多個小矩陣,如奇異值分解(SVD)和CP分解等;量化主要是對權重和特征圖做量化處理,極限量化方式有二值化[13-14]和低比特[15]量化等,其缺點是需要配套的專用硬件來進行卷積運算;輕型網(wǎng)絡[16-17]即利用小卷積、分組卷積或殘差網(wǎng)絡的方式設計網(wǎng)絡結構,可大大減少運算量,其缺點是會引入新型處理層。
剪枝即為剔除網(wǎng)絡中的冗余連接,原理來源于哺乳動物的發(fā)育過程,幼兒時期神經(jīng)元個數(shù)達到巔峰,個體成熟之后不重要的神經(jīng)元逐漸退化掉。剪枝從方法上分類,可分為結構化剪枝和非結構化剪枝[18]。其中非結構化剪枝是裁剪掉權重的連接,形成稀疏化的卷積核,理論上可以提高運算速度,減少存儲空間,但需要配套的稀疏運算庫才能實際加速。結構化剪枝則不同,它將卷積的參數(shù)矩陣以輸出通道為基準劃分,每個輸出通道代表的三維參數(shù)矩陣看作一個濾波器(下文統(tǒng)稱filter)。裁剪掉的是若干個filter,因此不需要對現(xiàn)有的軟件庫和算法框架修改,可直接運行剪枝算法,本文主要討論結構化剪枝。
剪枝從裁剪過程上分類,可分為初始化剪枝、運行過程中剪枝和訓練結束后剪枝。初始化剪枝是在訓練的開始階段,根據(jù)數(shù)據(jù)集和未剪枝的網(wǎng)絡結構來進行預先剪枝,多采用自動機器學習方法(AutoML),如強化學習[19]和元學習[20]等方法;運行過程中剪枝是動態(tài)剪枝過程[21],在訓練過程中隨時剔除或添加所需結構,缺點則是運行中的運算量和存儲資源比較大;訓練結束后剪枝對訓練完的參數(shù)選擇重要的部分留下,再經(jīng)過微調達到剪枝前的準確度,現(xiàn)在很多較為成熟的方案便是訓練結束后剪枝,采用l1[9]、l2[10]范數(shù)剪枝或通道相似度[20]方式剪枝。
本文的思路和貢獻如下:為尋求對數(shù)據(jù)集來說冗余盡可能少的網(wǎng)絡結構,在數(shù)值敏感和結構敏感兩個方面對網(wǎng)絡進行裁剪。數(shù)值敏感是指根據(jù)權重值在方差縮放初始化時對損失函數(shù)的影響(即連接敏感度)的方法[22],判斷出filter中反映前景信息較為突出的特征圖,裁剪掉剩余的filter;結構敏感是指以每層特征圖通道數(shù)的一定比例為基準進行層間結構微調。以通道裁剪率為裁剪條件,提出超參數(shù)α以平衡數(shù)值敏感和結構敏感的關系,最終得到網(wǎng)絡的精簡結構。使用初始化剪枝的方式,實現(xiàn)一次性全局裁剪。在訓練和部署前向推斷時,均可減輕計算量和存儲量,同時模型分類的準確度基本保持不變。
對于一定數(shù)量(batch)大小的輸入特征圖而言,設其大小為N×C×H×W,其中:N為batch的數(shù)量;C為通道數(shù);H與W為圖像的高和寬,為空間信息。在卷積層中,每層的卷積核大小為Cout×Cin×K×K,Cout為輸出圖像通道數(shù),Cin為輸入通道數(shù),K為卷積核的尺寸,常用大小為3和1,其中Cin×K×K稱為一個filter,每個卷積層中有Cout個filter。
結構化剪枝是剪除每個卷積層的若干個filter,該過程如圖2所示。淺色部分為裁剪掉的通道數(shù),深色部分為實際參與運算的部分。由于上層剪枝的緣故,輸入特征圖部分通道被裁剪,因此卷積層的卷積核對應的輸入通道數(shù)也被裁剪,再加上本卷積層自身有部分filter被剪掉,所以輸入特征圖的對應通道數(shù)也被修剪。

圖2 結構化剪枝流程
設剪枝率為r,假設每層均裁剪同樣的比例,則對于網(wǎng)絡中第i層,裁剪完后的filter數(shù)量為Cout×(1-r),可得到輸出圖像尺度為N×Cout×(1-r)×H×W。那么對于網(wǎng)絡中第i+1層,卷積核的大小為Cout×(1-r)×Cin×(1-r)×K×K。這種情況下,設兩層的輸入圖像空間信息不變,則結構化剪枝的參數(shù)裁剪率Rparameter和運算量裁剪率Rflop。此時可保證參數(shù)量和運算量裁剪比例的一致。
(1-r)2
(1)
(1-r)2
(2)
特別地,對于ResNet殘差網(wǎng)絡,因為有shortcut層的存在,需要對剪枝的過程稍作修改。這里只考慮常規(guī)的兩層Residual block模塊,如圖3所示。引入make_layer層,代表輸出通道數(shù)相同的若干個相鄰的Residual block模塊的集合。

圖3 ResNet中Residual block模塊
其裁剪分為兩個并行過程,即weight layer 1剪枝和weight layer 2剪枝。因為剪枝只包含輸出通道數(shù)的修剪,因此weight layer 1剪枝只涉及該模塊內部改變,而不影響整個模塊的輸入輸出。而weight layer 2剪枝時,其filter個數(shù)需要和上一個Residual block模塊的weight layer 2模塊的filter個數(shù)相同,因此需要同時考慮make_layer層中的所有weight layer 2模塊,為它們求取一個共同的filter個數(shù)。
這里均只考慮卷積層。令L為損失函數(shù),l為層數(shù),X為輸入圖像,Y為分類標簽,W為原始權重,其中filter的個數(shù)為Cl(j∈Cl),W*為剪枝之后的權重,剪枝后的filter的個數(shù)為Cn(Cn≤Cl),g為激活函數(shù),S為重要性判斷函數(shù),則優(yōu)化問題為:
minL(Y,g(X;W*{0,1,…,Cn}))s.t.W*=S(W{0,1,…,j,…,Cl})
(3)
在第t次迭代更新時,第l層第i個權重的更新方式為:
(4)

(5)
可視化其特征圖也可以看出該統(tǒng)計意義的作用。在VGG16網(wǎng)絡初始化階段篩選出連接敏感度高的若干個filter,保持卷積層的參數(shù)不變,將已訓練好的網(wǎng)絡的第一層卷積層的特征圖可視化,如圖4所示。虛線左邊為剪掉的filter,右邊為連接敏感度高的filter。通過對比可得出保存的通道具備注意力(較亮的區(qū)域)集中在前景、提取的特征更豐富等特點,更便于后續(xù)的高維度特征分辨。

圖4 第一層卷積層的特征圖可視化
考慮到不同層的梯度值有層間差異,與初始化的標準差值以及每層的梯度量級遞減均有關。對VGG網(wǎng)絡,本文考慮實行層間的歸一化處理,該處理代表了層級分布的凸顯性,如式(6)所示。而對于ResNet網(wǎng)絡, shortcut層避免了梯度消失,可按需采用歸一化處理。
(6)
參照SPF的按比例剪枝的方法,既可以預防凸顯性剪枝造成的通道數(shù)為0的情況,也可以起到層間調節(jié)的輔助作用,對維持原始網(wǎng)絡結構有很大幫助。該特性記作結構維持特性,公式如下:
Struc(Fl)=Cl×r
(7)
綜合這兩個方面,本文給出最終剪枝的裁剪計量標準如下:
S(Fl,j)=α×Promi(Fl,j)+(1-α)×Struc(Fl)
(8)
式中:Promi(Fl,j)為數(shù)值參數(shù),Struc(Fl)為結構參數(shù),α為二者占比的調節(jié)超參數(shù)。
因為數(shù)據(jù)集數(shù)量的龐大,如今的訓練均采用小批量數(shù)據(jù)集batch運算的方法。而用在本算法中,如果只訓練一次(不更新各參數(shù))便得出結果,會對結果造成偏差。因此,本文采用多次訓練取平均的方法,且每個batch的構成都由每個類別內隨機采樣的數(shù)據(jù)組合得出。
本文方法簡單易操作,其基本流程為:先采用如算法1所示的步驟訓練出精簡模型所需要的網(wǎng)絡結構,按照這種結構對原始網(wǎng)絡稍作改變,之后采用與原始訓練方式相同的步驟訓練,即初始化參數(shù),確定學習率、動量和迭代次數(shù)等超參數(shù),開始訓練直至網(wǎng)絡收斂。
算法1獲取精簡網(wǎng)絡結構的剪枝算法
輸入:訓練數(shù)據(jù)X,裁剪率P,卷積層層數(shù)l,模型參數(shù)W={W(j),0≤j≤l},訓練次數(shù)epochmax。
輸出:精簡網(wǎng)絡的cfg和cfg_con(若存在)。
初始化模型參數(shù)W,據(jù)P確定保留的filter總數(shù)目
for epoch in range(0,epochmax):
根據(jù)訓練數(shù)據(jù)X獲取模型參數(shù)W的梯度值
forjin range(0,l):
據(jù)式(5)記錄每個filter梯度的l1范數(shù)
據(jù)式(6)做歸一化處理
記錄本卷積層的初始filter數(shù)目
end
據(jù)式(8)計算后排序獲取cfg和cfg_con(若存在)
更新cfg和cfg_con(若存在)
不更新優(yōu)化器和模型參數(shù)
end
算法1的目的是得到網(wǎng)絡的各卷積層filter的個數(shù),用列表cfg表示。對于ResNet,還需要確定weight layer 2剪枝的結果,用列表cfg_con表示。首先確定訓練次數(shù)epochmax;之后進行各filter的敏感度排序,確定精簡模型的網(wǎng)絡結構,即可得到cfg和cfg_con。
本文在兩個數(shù)據(jù)集上驗證了該方法的有效性,實驗采用Pytorch架構,使用公開的訓練數(shù)據(jù)集來訓練。
3.1.1CIFAR-10
CIFAR-10數(shù)據(jù)集由10個類的60 000個32×32彩色圖像組成,每個類有6 000幅圖像,共50 000幅訓練圖像和10 000幅測試圖像。數(shù)據(jù)集分為五個訓練批次和一個測試批次,每個批次有10 000幅圖像。測試批次包含來自每個類別的恰好1 000幅隨機選擇的圖像。
3.1.2IMAGENET-300
IMAGENET數(shù)據(jù)集包含120萬幅訓練圖片和5萬幅驗證圖片,共有1 000個類。因為硬件的限制,本文只訓練其中隨機挑選的300類來進行實驗說明,并計算這300類的均值和標準差來進行預訓練處理。
3.2.1CIFAR對應網(wǎng)絡
本文主要采用的基準網(wǎng)絡架構為簡化版的VGG16和ResNet系列網(wǎng)絡,這個簡化版本是正常版本的一種變異形式[9]。其中,簡化版VGG16最后只采用了兩層全連接層,因為輸入圖像的空間尺寸較小,因此最后的平均池化層參數(shù)不是7,而是2。對于ResNet而言,shortcut層會涉及到卷積步長大于1或輸入輸出通道不匹配的問題,標準的ResNet使用的1×1的卷積核來做變換,這里簡化版的ResNet只是通過補0或置0來使輸出通道適應輸入通道,不引入多余參數(shù)和計算量。同時只有3個make_layer層,即每個殘差模塊的輸出通道數(shù)都一樣,每個make_layer層的第一個殘差網(wǎng)絡可能會進行通道變換或者特征圖尺度放縮。綜上,這些簡化版本更適合于小尺寸的輸入圖像。
3.2.2IMAGENET對應網(wǎng)絡
IMAGENET數(shù)據(jù)集的圖像較大,不適宜再采用簡化版的網(wǎng)絡,因此直接采用標準化的ResNet網(wǎng)絡。采用上述的Residual block兩部分剪枝, shortcut層沿用標準化的1×1卷積核運算。
CIFAR數(shù)據(jù)集中,采用簡化版VGG16、ResNet20、ResNet56和ResNet110網(wǎng)絡,優(yōu)化器為SGD,初始學習率0.1,均在總迭代數(shù)的0.5和0.75處進行學習率縮小十倍的操作,動量值設置為0.9,權重衰減率設置為1e-4。CIFAR10數(shù)據(jù)集的預處理包括周圍4像素外填充padding,隨機裁剪之后隨機水平翻轉,其余設置均未改變。batch的數(shù)量取128,訓練硬件為GPU GTX 1080。
IMAGENET數(shù)據(jù)集中,采用ResNet18和ResNet34網(wǎng)絡,分別在總迭代數(shù)的1/3處學習率變?yōu)橹暗?.1。其余設置與CIFAR10數(shù)據(jù)集相同。
為保證訓練結果的公平性,未剪枝模型的計算量應保證和精簡網(wǎng)絡的計算量保持一致[8]:
epochbase×FLOPbase=epochprune×FLOPprune
(9)
式中:epoch代表訓練迭代次數(shù);FLOP代表模型計算量;下標base和prune分別代表基準網(wǎng)絡和裁剪后的網(wǎng)絡。
3.4.1總體實驗結果
在數(shù)據(jù)集CIFAR10上,驗證集結果如表1所示。采用的網(wǎng)絡框架為簡化版VGG16、ResNet20、ResNet56和ResNet110。表格括號內前者為通道裁剪率,后者為超參數(shù)α的取值,ACC為訓練的分類準確度,F(xiàn)LOPS為前向訓練時的計算量,Para為參數(shù)量,Pruned為計算量裁剪和參數(shù)量裁剪的百分比。

表1 CIFAR驗證集結果
在VGG16基準網(wǎng)絡下,baseline為不裁剪的訓練結果。考慮到VGG網(wǎng)絡較為冗余,本文將通道裁剪率設置為60%和70%,可以看出分類準確度與PFEC和baseline結果相比無降低,且部分略有提升,同時實驗的參數(shù)量裁剪率在80%以上,計算量裁剪率在40%左右。在ResNet基準網(wǎng)絡下,在分類準確度基本維持不變時,本文實驗的計算量裁剪率和參數(shù)裁剪率均比對照組高。特別地,ResNet110網(wǎng)絡在計算量及參數(shù)量均裁剪掉50%以上時,模型分類的準確度依然維持較高水平。
在數(shù)據(jù)集IMAGENET300上,驗證集結果如表2所示,采用的網(wǎng)絡框架為Resnet18和Resnet34。表中均為通道剪枝率30%下的結果,與不裁剪的訓練結果baseline相比,準確度略微降低,且降低率在0.4%以內。此時,計算量裁剪率可達到30%左右,參數(shù)裁剪率為50%左右。

表2 IMAGENET驗證集結果
3.4.2α系數(shù)的影響
以ResNet20為例的cfg結果如圖5所示。可以看出α的大小控制著不同層的通道均衡程度。α趨于0時,意味著結構參數(shù)控制較大,各層裁剪通道數(shù)與原始輸出參數(shù)成比例;而α為1時,代表只有數(shù)值參數(shù)參與判斷,圖線波動較大,抖動很大,同時在shortcut層處的敏感度很高,因此保留的通道數(shù)較大。圖6為ResNet56各卷積層的通道數(shù)實例。

圖5 ResNet20的cfg結果
對于VGG網(wǎng)絡而言,只需要做層間歸一化,同時使用層間因子調節(jié)一下輸出通道數(shù)不為0即可,因此一般使α取趨向1的值。而對于簡化版的ResNet,考慮到shortcut層和make_layer層,為了保證shortcut層不引入多余的參數(shù),本文將每個make_layer層看作一個整體而得出一個統(tǒng)一的輸出通道數(shù),因此各個殘差模塊的中間輸出通道數(shù)的差距不應過大,所以α值取值比VGG網(wǎng)絡稍小。

圖6 ResNet56的cfg結果
3.4.3預訓練模型與初始化模型的cfg對比
使用本文方法分析預訓練模型的參數(shù)剪枝后能否恢復精度。實驗一使用初始化模型訓練出網(wǎng)絡結構列表cfg,之后對預訓練模型進行連接敏感度排序,每層只保留排序靠前的cfg中規(guī)定數(shù)目的通道數(shù),之后進行40次的微調;實驗二使用預訓練模型直接進行全局連接敏感度排序及訓練cfg,剪枝后微調相同次數(shù)。
在VGG16上進行測試,將初始化參數(shù)固定。pre_cfg是采用實驗二得到的網(wǎng)絡結構列表cfg;initial_cfg是實驗一初始化階段得到的cfg。經(jīng)過同樣的迭代次數(shù)之后,結果如表3所示。二者訓練出的通道數(shù)列表如圖7所示。實驗結果表明,前者的效果要比后者提高約0.7%。這說明了該方法只適應于初始化剪枝的方法,在已經(jīng)訓練好的模型上效果并不理想。

表3 預訓練模型與初始化模型訓練結果對比

圖7 預訓練模型與初始化模型的cfg對比
本文認為損失函數(shù)對權重的影響隨著訓練是會發(fā)生變化的。在剛開始時所有的權重都是需要訓練的,而在訓練多次之后,有些權重被認為已達到穩(wěn)定值,此時損失函數(shù)對權重的影響是很小的。對于預訓練網(wǎng)絡,權重梯度的統(tǒng)計值更傾向于隨著網(wǎng)絡深度加速而逐級遞減的趨勢,此時如果按照當前權重梯度的l1范數(shù)進行裁剪,會對分類準確度造成較大損失。這說明本文的方法更適合于初始化模型剪枝,同時也側面印證了文獻[8]觀點的正確性,結構化剪枝最終得到的是網(wǎng)絡結構,而不是網(wǎng)絡參數(shù)。
本文提出一種卷積層的初始化剪枝方式,無須更新訓練中參數(shù)便可得出精簡模型的網(wǎng)絡結構,操作簡單,較易實現(xiàn),且后續(xù)精簡模型訓練與正常訓練相同,而計算量和參數(shù)量有了大幅度減少,對通用的前向推斷硬件十分友好。
經(jīng)過在不同數(shù)據(jù)集和不同架構上的測試,對比原始網(wǎng)絡分類訓練的結果,本文方法分類準確度基本不會下降,部分有所提升,其中ResNet110網(wǎng)絡在計算量及參數(shù)量均裁剪掉50%以上時,模型分類的準確度基本保持不變。
未來將研究對于輕小型網(wǎng)絡的剪枝優(yōu)化算法,同時結合網(wǎng)絡量化的相關內容,進一步減少深度卷積神經(jīng)網(wǎng)絡的計算量和參數(shù)量,便于其在嵌入式設備中的部署和應用。