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%的計算時間。固然,網絡模型的壓縮和加速的最終實現須要多學科的聯合解決方案,除了壓縮算法,數據結構、計算機體系結構和硬件設計等也起到了很大做用。本文將着重介紹不一樣的深度模型壓縮方法,並進行對比。框架
綜合現有的深度模型壓縮方法,它們主要分爲四類:函數
基於參數修剪和共享的方法針對模型參數的冗餘性,試圖去除冗餘和不重要的項。基於低秩因子分解的技術使用矩陣/張量分解來估計深度學習模型的信息參數。基於傳輸/緊湊卷積濾波器的方法設計了特殊的結構卷積濾波器來下降存儲和計算複雜度。知識蒸餾方法經過學習一個蒸餾模型,訓練一個更緊湊的神經網絡來重現一個更大的網絡的輸出。性能
通常來講,參數修剪和共享,低秩分解和知識蒸餾方法能夠用於全鏈接層和卷積層的CNN,但另外一方面,使用轉移/緊湊型卷積核的方法僅支持卷積層。低秩因子分解和基於轉換/緊湊型卷積核的方法提供了一個端到端的流水線,能夠很容易地在CPU/GPU環境中實現。相反參數修剪和共享使用不一樣的方法,如矢量量化,二進制編碼和稀疏約束來執行任務,這致使常須要幾個步驟才能達到目標。學習
方法名稱 | 描述 | 應用場景 | 方法細節 |
---|---|---|---|
剪枝和共享 | 刪除對準確率影響不大的參數 | 卷積層和全鏈接層 | 對不一樣設置具備魯棒性,能夠達到較好效果,支持從零訓練和預訓練 |
低秩分解 | 使用矩陣對參數進行分解估計 | 卷積層和全鏈接層 | 標準化的途徑,很容易實施,支持從零訓練和預訓練 |
轉移、緊湊卷積核 | 設計特別的卷積核來保存參數 | 只有卷積層 | 算法依賴於應用程序,一般能夠取得好的表現,只能從零開始訓練 |
知識蒸餾 | 訓練一個更緊湊的神經網絡來從大的模型蒸餾知識 | 卷積層和全鏈接層 | 模型表現對應用程序和網絡結構較爲敏感,只能從零開始訓練 |
關於訓練協議,基於參數修剪/共享、低秩分解的模型能夠從預訓練模型或者從頭開始訓練,所以靈活而有效。然而轉移/緊湊的卷積核和知識蒸餾模型只能支持從零開始訓練。這些方法是獨立設計和相輔相成的。例如,轉移層和參數修剪和共享能夠一塊兒使用,而且模型量化和二值化能夠與低秩近似一塊兒使用以實現進一步的加速。不一樣模型的簡要對比,如表1所示。下文針對這些方法作一簡單介紹與討論。優化
根據減小冗餘(信息冗餘或參數空間冗餘)的方式,這些參數修剪和共享能夠進一步分爲三類:模型量化和二進制化、參數共享和結構化矩陣(structural matrix)。ui
網絡量化經過減小表示每一個權重所需的比特數來壓縮原始網絡。Gong et al. 對參數值使用K-Means量化。Vanhoucke et al. 使用了 8 比特參數量化能夠在準確率損失極小的同時實現大幅加速。Han S提出一套完整的深度網絡的壓縮流程:首先修剪不重要的鏈接,從新訓練稀疏鏈接的網絡。而後使用權重共享量化鏈接的權重,再對量化後的權重和碼本進行霍夫曼編碼,以進一步下降壓縮率。如圖2所示,包含了三階段的壓縮方法:修剪、量化(quantization)和霍夫曼編碼。修剪減小了須要編碼的權重數量,量化和霍夫曼編碼減小了用於對每一個權重編碼的比特數。對於大部分元素爲0的矩陣可使用稀疏表示,進一步下降空間冗餘,且這種壓縮機制不會帶來任何準確率損失。這篇論文得到了ICLR2016 的Best Paper。編碼
在量化級較多的狀況下準確率可以較好保持,但對於二值量化網絡的準確率在處理大型CNN網絡,如GoogleNet時會大大下降。另外一個缺陷是現有的二進制化方法都基於簡單的矩陣近似,忽視了二進制化對準確率損失的影響。
網絡剪枝和共享起初是解決過擬合問題的,如今更多得被用於下降網絡複雜度。早期所應用的剪枝方法稱爲誤差權重衰減(Biased Weight Decay),其中最優腦損傷(Optimal Brain Damage)和最優腦手術(Optimal Brain Surgeon)方法,是基於損失函數的Hessian矩陣來減小鏈接的數量。他們的研究代表這種剪枝方法的精確度比基於重要性的剪枝方法(好比Weight Decay方法)更高。這個方向最近的一個趨勢是在預先訓練的CNN模型中修剪冗餘的、非信息量的權重。 在稀疏性限制的狀況下培訓緊湊的CNN也愈來愈流行,這些稀疏約束一般做爲l_0或l_1範數調節器在優化問題中引入。
剪枝和共享方法存在一些潛在的問題。首先,若使用了l_0或l_1正則化,則剪枝方法須要更多的迭代次數才能收斂,此外,全部的剪枝方法都須要手動設置層的超參數,在某些應用中會顯得很複雜。
該方法的原理很簡單:若是一個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損失函數分類任務,這阻礙了其應用。另外一個缺點是模型的假設有時太嚴格,其性能有時比不上其它方法。
深度模型的壓縮和加速技術還處在早期階段,目前還存在如下挑戰:
轉自博文:http://yanjoy.win/2017/11/30/net-compression-survey/