王國棟,葉 劍,2,謝 縈,2,錢躍良,2
(1.臨沂中科人工智能創新研究院,山東 臨沂 276000;2.中國科學院計算技術研究所 泛在計算系統研究中心,北京 100190)
深度神經網絡的發展使圖像分類、目標檢測等計算機視覺任務得到了巨大的性能提升。隨著計算機視覺處理任務日趨復雜,研究人員所設計的神經網絡規模也逐步增大。神經網絡的規模能夠代表其學習能力,模型的參數量越多,模型容量越大,學習能力也越強。然而,針對不同的任務進行網絡設計時很難確定神經網絡的寬度和深度,通常研究者設計一個過參數化網絡來保證學習能力,同時保證模型訓練階段能夠收斂到一個比較好的局部最優點[1-2]。但復雜的網絡模型需要高額的存儲空間和計算資源,在邊緣設備的實際應用中,設備的計算性能和存儲資源很難滿足過參數化網絡的性能需求。針對上述問題,可對模型進行壓縮,以有效減少計算空間和時間消耗,提高模型的運行效率。神經網絡的壓縮方法主要有低秩分解、剪枝、量化、知識蒸餾、緊湊的網絡設計等,其中剪枝方法簡單有效,是目前的研究熱點。
模型剪枝應設計可保證模型精度不損失的有效壓縮模型,關鍵問題在于如何評價神經元的重要性和怎樣移除神經元。剪枝算法可分為非結構化剪枝和結構化剪枝兩種方式。非結構化剪枝是一種細粒度的剪枝方式,其直接針對模型中的參數進行剪枝,通常會根據權值、梯度等不同的方面衡量參數的重要性,不重要的參數會被剪除。非結構化剪枝能夠有效地壓縮模型,但是得到的稀疏權重矩陣需要特殊的硬件設備支持。結構化剪枝是對模型中的濾波器、通道等結構進行剪枝,通過在損失函數中加入卷積核中權值L1、L2 正則項的方法評價卷積核的重要性[3]。結構化剪枝方式對于網絡每一層都需要設定超參數,并且在進行剪枝時網絡需要迭代多次才能收斂。除了在損失函數中對卷積核權重加入正則化的方式評價卷積核的重要性之外,也有研究利用Batch Normalization 中的γ參數來評價特征圖的重要性[4],通過卷積核與上層特征圖卷積得到本層特征圖,通過γ參數評價特征圖間接實現對卷積核的評價。結構化剪枝算法實現簡單且不需要硬件設備支持,但是評價濾波器重要性時也同樣從卷積核、通道等結構出發,無法對單個神經元的重要性進行評價。
模型的梯度信息與損失函數直接相關,利用梯度信息能夠剔除影響模型收斂的冗余參數,在保證壓縮參數量和計算量的同時提高模型性能。直接利用訓練好的模型梯度信息相比加入懲罰因子、利用Batch Normalization 中的γ參數等學習化的方法更簡單有效。為了最大限度剔除神經網絡中的冗余參數,本文采用權重梯度的絕對值對卷積核中的神經元進行量化,設置不同閾值,利用網格搜索的方式獲取剪枝前后剩余參數量差值,通過計算參數量差值曲線的曲率最大值,確定參數量不發生明顯變化時網絡層的剪枝權重閾值。本文算法只需要對網絡進行一次剪枝即能重新訓練恢復模型精度,而無需經歷多次剪枝-重訓練的重復循環過程。
利用模型參數的絕對值大小評估神經元重要性是模型剪枝操作中用來剔除不重要神經元最直接的評價方式。文獻[5]提出以模型中權重的大小表征其重要程度,并將模型中權值低于某個閾值的權重參數置為0,然后通過重新訓練的方式恢復模型精度。這種將某個權重直接歸零的方式屬于非結構化剪枝方法,此類方法能夠有效地壓縮模型,但是需要特殊的硬件設備支持。文獻[3]計算一個卷積核內所有權值絕對值之和來表征每層中該卷積核的重要性,根據權重絕對值之和對卷積核進行排序,剔除權重絕對值之和最小的卷積核。在CIFAR10 數據集上,該方法可使VGG-16 的推理成本相比剪枝前降低34%,ResNet-110 最高可降低38%,其通過在損失函數中加入L1、L2 正則項的方法評價卷積核的重要程度,對于每一層都需要設定超參數,并且進行剪枝時網絡需要迭代多次才能收斂。也有研究[6]以group Lasso 的方式獲取稀疏化權重,將濾波器的權重分成多個組,通過對每個組的權重值進行L1 正則化獲取稀疏權重,實現對模型的壓縮。
除了采用權值的方式之外,也有研究[7-9]結合梯度值與模型權重進行剪枝。文獻[7]將模型剪枝視作優化問題,通過泰勒展開式評價卷積核參數全部為0 時對損失函數的影響,最終得到參數值與其梯度值的乘積來評價神經元的重要性。但該方法每完成一個卷積核的剪枝過程就需要重新訓練一次網絡恢復模型精度。文獻[8]提出在深度模型訓練之前多次采樣部分訓練數據,利用損失函數關于權重連接的梯度決定不同權重連接的重要性。該方法只需要一次剪枝操作即可實現權重重要性評價,避免了剪枝-微調的迭代過程。文獻[9]通過計算數據的反向傳播梯度得到損失變化的估計值,使用權重對應的梯度值量化所有權重元素的重要性,并將權重按梯度絕對值升序排序,去除不重要的權重。上述3 種方法都屬于結構化剪枝方式,通常會對濾波器、通道等結構進行重要性評估,然后去除不重要的濾波器和通道。
除了基于度量標準的方法判斷神經元的重要性之外,還有采用參數的熵值[10-11]、最小化特征輸出重建誤差[12-13]等方法。這些方法以神經網絡的卷積核或通道為最小單位進行量化,通過度量剪枝前后信息傳遞的完整性對模型進行剪枝,但都與結構化剪枝的方法類似,在剪枝過程中需要對網絡進行多次訓練,耗費了大量時間。非結構化剪枝方法雖然在剪枝過程中無需多次訓練并且對神經網絡的單個神經元進行了細粒度評價,能夠取得很好的壓縮效果,但是壓縮后的模型需要專用硬件和算法庫的支持,不具備通用性。
本文算法根據反向傳播的梯度絕對值來衡量神經元的重要性,利用多次搜索到的參數閾值自適應確定不同網絡層的剪枝閾值,通過剪枝閾值調整卷積核個數,從而對模型進行壓縮。在此過程中,網絡執行一次數據迭代即可完成模型壓縮,對壓縮模型進行重新訓練即可恢復模型精度。
本文算法采用梯度絕對值作為評判濾波器中權重重要性的依據,統計模型中梯度絕對值的最大值GMl,在(0,GMl)范圍內設置間隔值,利用梯度間隔值以網格搜索的方式獲取2 次剪枝后剩余參數量的差值,根據剩余參數量的差值求取曲率,據此確定濾波器的剪枝閾值。在算法自適應獲取到剪枝閾值后,將濾波器中小于梯度閾值的權重設置為0,統計每個濾波器中非零權重的數量,將小于a×Nmax的濾波器剪去(0 <a<1),保留剩下的濾波器個數,最后通過修改卷積核進而決定下一層產生的通道數。本文算法流程如圖1 所示,具體步驟如下:

圖1 本文剪枝算法流程Fig.1 Procedure of the proposed pruning algorithm
步驟1載入利用圖像和標注實例訓練完成的基線模型,選擇需要剪枝的網絡層。
步驟2統計基線模型第l層濾波器中所有卷積核個數,其中,l表示當前網絡層數,l=1,2,…。
步驟3計算第l層、第t個卷積核中的參數Plt、所有梯度值Glt及所有參數量。


步驟9重復步驟2~步驟8 完成所有層的卷積核個數計算。
步驟10獲取待剪枝的所有層卷積核個數后,對網絡模型進行卷積核個數調整。
步驟11進行重新訓練。
本文算法中的自適應閾值是在每層網絡中設置不同的剪枝參數量,通過網格搜索的方式查找神經網絡中不同網絡層的卷積核所對應的剪枝閾值,根據每次搜索后的剩余參數量確定不同卷積層中卷積核內置零的冗余參數。對于剪枝算法流程中的閾值,先通過求取剩余參數量的曲率半徑,再根據最大曲率半徑對應的剩余參數量得到不同卷積層對應的剪枝閾值。現有神經網絡設計多呈金字塔型,網絡層數越深,網絡的卷積核個數越多,參數量越大。針對不同網絡層的參數量,計算每個網絡層中權重參數對應的梯度絕對值的最大值,根據設置的搜索步數上限和最大絕對值梯度確定該網絡層的多個搜索閾值,通常搜索步數上限設置為100。利用梯度絕對值衡量權值重要性,在設置不同梯度閾值時,剩余參數量的變化如圖2 所示。

圖2 VGG16 第1、4、8、12 層網絡參數搜索閾值Fig.2 Parameter searching thresholds of the 1st,4th,8th and 12th layer network for VGG16
由圖2 可以看出,當網格搜索達到20~50 步時,剩余參數量會明顯減少,表明大量不重要參數需要被減除,通常達到50 步以后剩余參數量趨于穩定。根據不同的梯度閾值能夠獲取所有網格搜索閾值下的剩余參數量,對所有離散點進行數據平滑后,通過求取剩余參數量的最大曲率半徑,對不同濾波器自適應地獲取梯度閾值。如圖2 所示,不同網絡層的閾值基本上在兩次間隔搜索的參數差值即將不發生變化之前確定。根據閾值確定不同濾波器所用的剪枝步數mi,最終由可得每個卷積核中剪枝的參數梯度閾值,將卷積核中梯度值小于的參數值置零,再統計所有濾波器中卷積核的非零個數,對數量小于的卷積核進行裁剪,具體如圖3 所示。整個剪枝過程通過自適應搜索得到的梯度閾值確定置零的參數在每個卷積核中的占比,超參數a控制每層的剪枝比例。根據不同剪枝比例,一般設置a為0.1、0.2、0.3、0.4、0.5,a的值越大,剪枝比例越大。

圖3 卷積核個數調整Fig.3 Adjustment of the number of convolution kernels
對殘差網絡完成剪枝后,會存在通道不匹配的問題。ResNet50 的殘差結構如圖4(a)所示,其中:殘差分支包含3 層卷積核用來改變濾波器核的尺寸和個數;捷徑分支上有一個1×1 的卷積層。如果對Conv1 和Conv2 進行剪枝只會影響到后一層的輸入,如果對Conv3 進行剪枝會影響主分支和捷徑分支最后的相加操作。針對剪枝過程中殘差結構內部殘差分支和捷徑分支通道變化的情況,采取改變捷徑分支濾波器個數和殘差分支最后一層濾波器個數的方式進行通道匹配,如圖4(b)所示。如果對Conv3 進行剪枝,則要將殘差分支最后一層濾波器的個數和捷徑通道的濾波器個數設置為剪枝結果給出的M。

圖4 ResNet50 殘差結構剪枝處理Fig.4 Pruning treatment of ResNet50 residual structure
針對本文提出的結構化剪枝算法,分別在VGGNet[14]、ResNet[15]等分類模型和SSD[16]、Yolov4[17]、MaskRCNN[18]等目標檢測模型上進行模型壓縮,所有的實驗均基于PyTorch 框架。
對于分類模型,在深度學習領域常用的圖片數據集Cifar10 上進行剪枝實驗。Cifar10 數據集包含10 個不同類別,每個類別有6 000 張彩色圖片,每張圖片大小為32×32像素。Cifar10的訓練集有50 000張圖片,測試集有10 000 張圖片。
對于目標檢測模型,分別在公開的EgoHands 數據集和安全頭盔佩戴數據集SHWD 上進行剪枝實驗。EgoHands 數據集有4 800 張彩色圖片,其中包含超過15 000 多只手的圖片,每張圖片大小為720×1 280 像素,3 874 張圖片用于訓練,431張圖片用于驗證,479張圖片用于測試。SHWD 數據集有7 581張彩色圖片,其中包含9 044 個佩戴安全頭盔對象和111 514 個未佩戴安全帽對象,圖像尺寸大小不一致,5 457 張圖片用于訓練,607 張圖片用于驗證,1 517 張圖片用于測試。
將本文提出的剪枝算法與PF[3]、SFP[19]、Rethinking[20]等算法進行性能對比,評價指標為分類準確率(目標檢測中用mAP 衡量)、模型參數量和浮點運算數(Floating Point Operations,FLOPs)。其中:分類準確率表示分類模型的分類正確率;模型參數量表示神經網絡模型在計算機中內存的占用量,決定模型文件的大小;FLOPs 表示神經網絡模型的計算量,用于衡量模型的復雜度。
3.3.1 分類模型剪枝實驗
對分類模型VGG16、ResNet50 和resnet56 采 用如下超參數設置訓練:Epoch 設置為200,初始學習率設置為0.1。優化方法采用隨機梯度下降法,其中,momentum 設置為0.9,weight_decay 設置為0.000 5。學習率衰減策略采用余弦退火學習方法。表1 為利用不同算法對這兩種分類模型剪枝后的實驗結果對比,表中粗體表示最優結果,“—”表示文獻中缺少對應數據,對比算法的實驗結果直接使用文獻[3,19-21]中的數據。

表1 不同剪枝算法對分類模型的剪枝實驗結果Table 1 Pruning experiment results of different pruning algorithms on classification models %
由表1 可知,當設置不同超參數a時,本文算法較其他算法使VGG16、ResNet50 參數量減少了92%以上,計算量分別減少了70.96%和96.92%,網絡參數量和計算量的壓縮比例遠高于其他算法。在VGG16 的剪枝實驗中,設置a=0.5 時剪枝效率最高,剪枝后模型精度相比原模型并沒有明顯下降,設置a=0.4 時精度損失最小。在ResNet50 的剪枝實驗中,網絡的參數量和計算量最高分別壓縮了98.60%和96.92%,壓縮后的模型參數量僅為327.06 Kb,對比Winning Ticket 和Random Init 算法,本文算法在保證模型精度的同時能夠大幅減少模型的參數量和計算量。在resnet56 的剪枝實驗中,原始模型參數量和計算量分別為853.02 Kb 和0.13 GMac,遠小于其他兩種模型,對resnet56 模型完成50%以上的參數量剪枝后模型更小,恢復精度訓練更加困難。在權衡模型容量和精度損失后,resnet56 設置超參數a=0.2 時達到最優剪枝效果,最終剪枝后模型分類準確率能達到92.18%。
3.3.2 目標檢測模型剪枝實驗
目前,目標檢測模型剪枝實驗相對較少,并且所用數據集和算法并不統一。本文使用EgoHands 和SHWD 這兩個公開數據集對本文提出的剪枝算法進行測試,選擇經典的目標檢測模型進行剪枝實驗,直接采用文獻[22-26]中的數據進行對比,分別對比Faster RCNN[22]、SSD[23]、Yolo 系列[24-26]等目標檢測模型采用不同剪枝算法的剪枝效果。訓練模型的硬件設備設置為處理器Xeon Silver 4216、GPU 顯卡RTX 3070 8 GB;操作系統為Ubuntu18.0.4,python 環境為3.6.10。在不同數據集上的訓練超參數如表2所示,其中,學習率衰減策略中的等間隔調整學習率gamma 設置為0.91,剪枝前模型訓練step_size 設置為1,迭代次數設置為200,剪枝后的網絡模型相對較小,恢復精度需要迭代更多的次數,通常將模型訓練step_size 設置為3,迭代次數設置為300。CSPdarknet53 的網絡設計相對輕量化,在達到同樣參數壓縮比例的情況下影響了模型的特征提取能力。CSPdarknet53 模型壓縮后恢復精度訓練容易出現梯度爆炸的情況,損失函數會出現NaN 的問題。為了防止CSPdarknet53 出現梯度爆炸,加速網絡收斂,先凍結全部的骨干網絡迭代10 次,再解凍訓練全部參數恢復模型精度。

表2 不同目標檢測模型的訓練超參數設置Table 2 Training hyperparameters setting of different target detection models
利用本文算法和文獻[22-26]算法對3 種模型剪枝前后的實驗結果對比如表3 所示,其中,“—”表示文獻中缺少對應數據。表中給出了不同剪枝算法實驗所用數據集,在不同剪枝算法對比上主要分析模型壓縮比率和精度損失情況。由表3 可以看出:利用文獻[22]算法對骨干網絡為ResNet50 的FasterRCNN 模型壓縮后精度下降1.6%,但是模型參數量只壓縮了26.21%;利用文獻[23]算法對骨干網絡為VGG16 的SSD 檢測模型進行壓縮,模型參數量壓縮超過60%,但模型精度下降10.48%;文獻[24]算法采用權值、激活值、梯度3 種方式衡量神經元的重要性,最終Yolov3 模型參數量壓縮80.38%,精度下降5.2%。文獻[22-24]實驗數據都采用Pascal VOC數據集,該數據集中目標相對明顯但是需要檢測的物體種類較多,對模型過度壓縮會影響模型精度。Drones 和Deer 數據集中目標種類相比Pascal VOC類別要少,但是目標像素占比相對較小,并且目標數量較多。利用文獻[25-26]算法分別對Yolov4 和Yolov3 進行模型壓縮,雖然能夠達到較高的模型壓縮比率,但是精度損失相對較大。
模型壓縮多針對特定數據集進行壓縮,以方便模型在邊緣設備上部署。本實驗采用EgoHands 和SHWD 兩種數據集對3 種算法進行測試。EgoHands數據集相對比較簡單,3 種原始檢測模型精度相對比較高。實驗結果表明,采用本文算法剪枝前后模型的參數量減少都超過80%,計算量減少都超過65%。SHWD數據集相比EgoHands較為復雜,相比EgoHands數據集上的實驗,模型精度相對較低。為了保證剪枝以后模型精度不受太大影響,對模型壓縮比例進行限制,在表3 中給出在兩種數據集實驗中權衡剪枝比率和模型精度最優的超參數a。
3 種模型的骨干網絡不同,SSD 采用VGG16 作為骨干網絡,VGG16 整體結構比較簡單,采用堆疊規整的卷積塊結構進行特征提取,提取特征的能力有限。對SSD 過度壓縮容易影響模型精度,SSD 在兩個數據集上的壓縮比率都超過了75%,在3 種模型中SSD 壓縮比率最小。ResNet50 采用殘差模塊解決訓練退化問題,增強了深度網絡的特征提取能力。從表3 的實驗結果也可以發現,MaskRCNN 的參數量壓縮比例在SHWD 數據集上達到81.57%,在EgoHands 數據集上達到91.33%,而MaskRCNN 的精度損失也最小,這充分證明了ResNet50 相比其他兩種骨干網絡特征提取能力更強。CSPdarknet53 同樣采用了殘差結構,但是相比其他兩種骨干網絡更輕量化,對應的模型容量也更小,在達到其他兩種模型相當的壓縮比例情況下會影響模型的精度。對比本文算法與其他算法的實驗結果可以發現,在模型達到同樣壓縮比例的前提下,本文算法精度損失更小。

表3 不同算法對目標檢測模型的剪枝實驗結果Table 3 Pruning experiment results of different algorithms on target detection models %
為了細粒度地評價卷積核中每個神經元的重要性,本文提出采用權重的梯度絕對值來衡量卷積核中每個權重的影響,采用網格搜索的方式獲取剪枝前后剩余參數量差值,通過計算剩余參數量差值的曲率大小獲取不同網絡層的剪枝權重閾值,利用超參數a控制最終的剪枝比例。在Cifar10 數據集上對3 種模型的超參數a設置進行實驗分析,在2 種數據集上對常用的目標檢測模型進行剪枝實驗。實驗結果表明,與Rethinking、PF 等剪枝算法相比,本文算法能夠在高壓縮比例的情況下保證模型的精度,在常用目標檢測模型上能夠在保證模型精度的同時有效減少模型的參數量和計算量。后續將對知識蒸餾進行研究,通過多種網絡壓縮方法相融合的方式進一步提高壓縮比例,同時使算法能夠學習原網絡的知識,保證壓縮后的模型精度。