A Survey of Model Compression and Acceleration for Deep Neural Networks
一、研究背景
在神經網絡方面,早在上個世紀末,Yann LeCun等人已經使用神經網絡成功識別了郵件上的手寫郵編。至於深度學習的概念是由Geoffrey Hinton等人首次提出,而在2012年,Krizhevsky等人采用深度學習算法,以超過第二名以傳統人工設計特征方法准確率10%的巨大領先取得了ImageNet圖像分類比賽冠軍。
此后的計算機視覺比賽已經被各種深度學習模型所承包。這些模型依賴於具有數百甚至數十億參數的深度網絡,傳統CPU對如此龐大的網絡一籌莫展,只有具有高計算能力的GPU才能讓網絡得以相對快速訓練。如上文中比賽用模型使用了1個包含5個卷積層和3個完全連接層的6000萬參數的網絡。通常情況下,即使使用當時性能頂級的GPU NVIDIA K40來訓練整個模型仍需要花費兩到三天時間。對於使用全連接的大規模網絡,其參數規模甚至可以達到數十億量級。當然,為了解決全連接層參數規模的問題,人們轉而考慮增加卷積層,使全連接參數降低。隨之帶來的負面影響便是大大增長了計算時間與能耗。

對於具有更多層和節點的更大的神經網絡,減少其存儲和計算成本變得至關重要,特別是對於一些實時應用,如在線學習、增量學習以及自動駕駛。在深度學習的另一端,即更貼近人們生活的移動端,如何讓深度模型在移動設備上運行,也是模型壓縮加速的一大重要目標。Krizhevsky在2014年的文章中,提出了兩點觀察結論:卷積層占據了大約90-95%的計算時間和參數規模,有較大的值;全連接層占據了大約5-10%的計算時間,95%的參數規模,並且值較小。這為后來的研究深度模型的壓縮與加速提供了統計依據。一個典型的例子是具有50個卷積層的ResNet-50需要超過95MB的存儲器以及38億次浮點運算。在丟棄了一些冗余的權重后,網絡仍照常工作,但節省了超過75%的參數和50%的計算時間。當然,網絡模型的壓縮和加速的最終實現需要多學科的聯合解決方案,除了壓縮算法,數據結構、計算機體系結構和硬件設計等也起到了很大作用。本文將着重介紹不同的深度模型壓縮方法,並進行對比。
二、研究現狀
綜合現有的深度模型壓縮方法,它們主要分為四類:
- 參數修剪和共享(parameter pruning and sharing)
- 低秩因子分解(low-rank factorization)
- 轉移/緊湊卷積濾波器(transferred/compact convolutional filters)
- 知識蒸餾(knowledge distillation)
基於參數修剪和共享的方法針對模型參數的冗余性,試圖去除冗余和不重要的項。基於低秩因子分解的技術使用矩陣/張量分解來估計深度學習模型的信息參數。基於傳輸/緊湊卷積濾波器的方法設計了特殊的結構卷積濾波器來降低存儲和計算復雜度。知識蒸餾方法通過學習一個蒸餾模型,訓練一個更緊湊的神經網絡來重現一個更大的網絡的輸出。
一般來說,參數修剪和共享,低秩分解和知識蒸餾方法可以用於全連接層和卷積層的CNN,但另一方面,使用轉移/緊湊型卷積核的方法僅支持卷積層。低秩因子分解和基於轉換/緊湊型卷積核的方法提供了一個端到端的流水線,可以很容易地在CPU/GPU環境中實現。相反參數修剪和共享使用不同的方法,如矢量量化,二進制編碼和稀疏約束來執行任務,這導致常需要幾個步驟才能達到目標。
| 方法名稱 | 描述 | 應用場景 | 方法細節 |
|---|---|---|---|
| 剪枝和共享 | 刪除對准確率影響不大的參數 | 卷積層和全連接層 | 對不同設置具有魯棒性,可以達到較好效果,支持從零訓練和預訓練 |
| 低秩分解 | 使用矩陣對參數進行分解估計 | 卷積層和全連接層 | 標准化的途徑,很容易實施,支持從零訓練和預訓練 |
| 轉移、緊湊卷積核 | 設計特別的卷積核來保存參數 | 只有卷積層 | 算法依賴於應用程序,通常可以取得好的表現,只能從零開始訓練 |
| 知識蒸餾 | 訓練一個更緊湊的神經網絡來從大的模型蒸餾知識 | 卷積層和全連接層 | 模型表現對應用程序和網絡結構較為敏感,只能從零開始訓練 |
關於訓練協議,基於參數修剪/共享、低秩分解的模型可以從預訓練模型或者從頭開始訓練,因此靈活而有效。然而轉移/緊湊的卷積核和知識蒸餾模型只能支持從零開始訓練。這些方法是獨立設計和相輔相成的。例如,轉移層和參數修剪和共享可以一起使用,並且模型量化和二值化可以與低秩近似一起使用以實現進一步的加速。不同模型的簡要對比,如表1所示。下文針對這些方法做一簡單介紹與討論。
三、參數修剪和共享
根據減少冗余(信息冗余或參數空間冗余)的方式,這些參數修剪和共享可以進一步分為三類:模型量化和二進制化、參數共享和結構化矩陣(structural matrix)。
3.1 量化和二進制化

網絡量化通過減少表示每個權重所需的比特數來壓縮原始網絡。Gong et al. 對參數值使用K-Means量化。Vanhoucke et al. 使用了 8 比特參數量化可以在准確率損失極小的同時實現大幅加速。Han S提出一套完整的深度網絡的壓縮流程:首先修剪不重要的連接,重新訓練稀疏連接的網絡。然后使用權重共享量化連接的權重,再對量化后的權重和碼本進行霍夫曼編碼,以進一步降低壓縮率。如圖2所示,包含了三階段的壓縮方法:修剪、量化(quantization)和霍夫曼編碼。修剪減少了需要編碼的權重數量,量化和霍夫曼編碼減少了用於對每個權重編碼的比特數。對於大部分元素為0的矩陣可以使用稀疏表示,進一步降低空間冗余,且這種壓縮機制不會帶來任何准確率損失。這篇論文獲得了ICLR2016 的Best Paper。
在量化級較多的情況下准確率能夠較好保持,但對於二值量化網絡的准確率在處理大型CNN網絡,如GoogleNet時會大大降低。另一個缺陷是現有的二進制化方法都基於簡單的矩陣近似,忽視了二進制化對准確率損失的影響。
3.2 剪枝和共享
網絡剪枝和共享起初是解決過擬合問題的,現在更多得被用於降低網絡復雜度。早期所應用的剪枝方法稱為偏差權重衰減(Biased Weight Decay),其中最優腦損傷(Optimal Brain Damage)和最優腦手術(Optimal Brain Surgeon)方法,是基於損失函數的Hessian矩陣來減少連接的數量。他們的研究表明這種剪枝方法的精確度比基於重要性的剪枝方法(比如Weight Decay方法)更高。這個方向最近的一個趨勢是在預先訓練的CNN模型中修剪冗余的、非信息量的權重。 在稀疏性限制的情況下培訓緊湊的CNN也越來越流行,這些稀疏約束通常作為l_0或l_1范數調節器在優化問題中引入。
剪枝和共享方法存在一些潛在的問題。首先,若使用了l_0或l_1正則化,則剪枝方法需要更多的迭代次數才能收斂,此外,所有的剪枝方法都需要手動設置層的超參數,在某些應用中會顯得很復雜。
3.3 設計結構化矩陣
該方法的原理很簡單:如果一個m×n階矩陣只需要少於m×n個參數來描述,就是一個結構化矩陣(structured matrix)。通常這樣的結構不僅能減少內存消耗,還能通過快速的矩陣-向量乘法和梯度計算顯著加快推理和訓練的速度。
這種方法的一個潛在的問題是結構約束會導致精確度的損失,因為約束可能會給模型帶來偏差。另一方面,如何找到一個合適的結構矩陣是困難的。沒有理論的方法來推導出來。因而該方法沒有廣泛推廣。
四、低秩分解和稀疏性
一個典型的 CNN 卷積核是一個 4D 張量,而全連接層也可以當成一個 2D 矩陣,低秩分解同樣可行。這些張量中可能存在大量的冗余。所有近似過程都是逐層進行的,在一個層經過低秩濾波器近似之后,該層的參數就被固定了,而之前的層已經用一種重構誤差標准(reconstruction error criterion)微調過。這是壓縮2D卷積層的典型低秩方法,如圖4所示。

使用低階濾波器加速卷積的時間已經很長了,例如,高維DCT(離散余弦變換)和使用張量積的小波系統分別由1D DCT變換和1D小波構成。學習可分離的1D濾波器由Rigamonti等人提出,遵循字典學習的想法。Jaderberg的工作提出了使用不同的張量分解方案,在文本識別准確率下降1%的情況下實現了4.5倍加速。一種flatten結構將原始三維卷積轉換為3個一維卷積,參數復雜度由$O(XYC)O(XYC)$降低到$O(X+Y+C)O(X+Y+C)$,運算復雜度由$O(mnCXY)O(mnCXY)$降低到$O(mn(X+Y+C))O(mn(X+Y+C))$。
低階逼近是逐層完成的。完成一層的參數確定后,根據重建誤差准則對上述層進行微調。這些是壓縮二維卷積層的典型低秩方法,如圖2所示。按照這個方向,Lebedev提出了核張量的典型多項式(CP)分解,使用非線性最小二乘法來計算。Tai提出了一種新的從頭開始訓練低秩約束CNN的低秩張量分解算法。它使用批量標准化(BN)來轉換內部隱藏單元的激活。一般來說, CP和BN分解方案都可以用來從頭開始訓練CNN。
低秩方法很適合模型壓縮和加速,但是低秩方法的實現並不容易,因為它涉及計算成本高昂的分解操作。另一個問題是目前的方法都是逐層執行低秩近似,無法執行全局參數壓縮,因為不同的層具備不同的信息。最后,分解需要大量的重新訓練來達到收斂。
五、遷移/壓縮卷積濾波器
雖然目前缺乏強有力的理論,但大量的實證證據支持平移不變性和卷積權重共享對於良好預測性能的重要性。使用遷移卷積層對CNN模型進行壓縮受到Cohen的等變群論(equivariant group theory)的啟發。使$x$作為輸入,$\Phi ( \cdot )$作為網絡或層,$T(\cdot)$作為變換矩陣。則等變概念可以定義為:
$$ T’\Phi (x)=\Phi (Tx) $$
即使用變換矩陣$T(\cdot)$轉換輸入$x$,然后將其傳送至網絡或層$\Phi(\cdot)$,其結果和先將$x$映射到網絡再變換映射后的表征結果一致。注意$T$和$T’$在作用到不同對象時可能會有不同的操作。根據這個理論,將變換應用到層次或濾波器$\Phi(\cdot)$來壓縮整個網絡模型是合理的。使用緊湊的卷積濾波器可以直接降低計算成本。在Inception結構中使用了將3×3卷積分解成兩個1×1的卷積;SqueezeNet提出用1×1卷積來代替3×3卷積,與AlexNet相比,SqueezeNet創建了一個緊湊的神經網絡,參數少了50倍,准確度相當。
這種方法仍有一些小問題解決。首先,這些方法擅長處理廣泛/平坦的體系結構(如VGGNet)網絡,而不是狹窄的/特殊的(如GoogleNet,ResidualNet)。其次,轉移的假設有時過於強大,不足以指導算法,導致某些數據集的結果不穩定。
六、知識蒸餾
利用知識轉移(knowledge transfer)來壓縮模型最早是由Caruana等人提出的。他們訓練了帶有偽數據標記的強分類器的壓縮/集成模型,並復制了原始大型網絡的輸出,但是,這項工作僅限於淺模型。后來改進為知識蒸餾,將深度和寬度的網絡壓縮成較淺的網絡,其中壓縮模型模擬復雜模型所學習的功能,主要思想是通過學習通過softmax獲得的類分布輸出,將知識從一個大的模型轉移到一個小的模型。
Hinton的工作引入了知識蒸餾壓縮框架,即通過遵循“學生-教師”的范式減少深度網絡的訓練量,這種“學生-教師”的范式,即通過軟化“教師”的輸出而懲罰“學生”。為了完成這一點,學生學要訓練以預測教師的輸出,即真實的分類標簽。這種方法十分簡單,但它同樣在各種圖像分類任務中表現出較好的結果。
基於知識蒸餾的方法能令更深的模型變得更加淺而顯著地降低計算成本。但是也有一些缺點,例如只能用於具有Softmax損失函數分類任務,這阻礙了其應用。另一個缺點是模型的假設有時太嚴格,其性能有時比不上其它方法。
討論與挑戰
深度模型的壓縮和加速技術還處在早期階段,目前還存在以下挑戰:
- 大多數目前的頂尖方法都建立在設計完善的 CNN 模型的基礎上,這限制了改變配置的自由度(例如,網絡結構和超參數)。為了處理更加復雜的任務,還需要更加可靠的模型壓縮方法。
- 剪枝是一種壓縮和加速 CNN 的有效方式。目前大多數的剪枝技術都是以減少神經元之間的連接設計的。另一方面,對通道進行剪枝可以直接減小特征映射的寬度並壓縮模型。這很有效,但也存在挑戰,因為減少通道會顯著地改變下一層的輸入。確定這類問題的解決方式同樣很重要。
- 正如之前所提到的,結構化矩陣和遷移卷積濾波器方法必須使模型具有人類先驗知識,這對模型的性能和穩定性有顯著的影響。研究如何控制強加先驗知識的影響是很重要的。
- 知識精煉(knowledge distillation/KD)方法有很多益處比如不需要特定的硬件或實現就能直接加速模型。開發基於 KD 的方法並探索如何提升性能仍然值得一試。
- 多種小型平台(例如,移動設備、機器人、自動駕駛汽車)的硬件限制仍然是阻礙深層 CNN 擴展的主要問題。如何全面利用有限的可用計算資源以及如何為這些平台設計特定的壓縮方法仍然是個挑戰。
轉自博文:http://yanjoy.win/2017/11/30/net-compression-survey/
