CNN 模型壓縮與加速演算法綜述

qcloud發表於2019-01-02

> 本文由雲 + 社群發表

> 導語:卷積神經網路日益增長的深度和尺寸為深度學習在移動端的部署帶來了巨大的挑戰,CNN 模型壓縮與加速成為了學術界和工業界都重點關注的研究領域之一。

前言

自從 AlexNet 一舉奪得 ILSVRC 2012 ImageNet 影像分類競賽的冠軍後,卷積神經網路(CNN)的熱潮便席捲了整個計算機視覺領域。CNN 模型火速替代了傳統人工設計(hand-crafted)特徵和分類器,不僅提供了一種端到端的處理方法,還大幅度地重新整理了各個影像競賽任務的精度,更甚者超越了人眼的精度(LFW 人臉識別任務)。CNN 模型在不斷逼近計算機視覺任務的精度極限的同時,其深度和尺寸也在成倍增長。

自從 AlexNet 一舉奪得 ILSVRC 2012 ImageNet 影像分類競賽的冠軍後,卷積神經網路(CNN)的熱潮便席捲了整個計算機視覺領域。CNN 模型火速替代了傳統人工設計(hand-crafted)特徵和分類器,不僅提供了一種端到端的處理方法,還大幅度地重新整理了各個影像競賽任務的精度,更甚者超越了人眼的精度(LFW 人臉識別任務)。CNN 模型在不斷逼近計算機視覺任務的精度極限的同時,其深度和尺寸也在成倍增長。

表 1 幾種經典模型的尺寸,計算量和引數數量對比

Model Model Size(MB) MillionMult-Adds MillionParameters
AlexNet[1] >200 720 60
VGG16[2] >500 15300 138
GoogleNet[3] ~50 1550 6.8
Inception-v3[4] 90-100 5000 23.2

隨之而來的是一個很尷尬的場景:如此巨大的模型只能在有限的平臺下使用,根本無法移植到移動端和嵌入式晶片當中。就算想通過網路傳輸,但較高的頻寬佔用也讓很多使用者望而生畏。另一方面,大尺寸的模型也對裝置功耗和執行速度帶來了巨大的挑戰。因此這樣的模型距離實用還有一段距離。

在這樣的情形下,模型小型化與加速成了亟待解決的問題。其實早期就有學者提出了一系列 CNN 模型壓縮方法,包括權值剪值(prunning)和矩陣 SVD 分解等,但壓縮率和效率還遠不能令人滿意。

近年來,關於模型小型化的演算法從壓縮角度上可以大致分為兩類:從模型權重數值角度壓縮和從網路架構角度壓縮。另一方面,從兼顧計算速度方面,又可以劃分為:僅壓縮尺寸和壓縮尺寸的同時提升速度。

本文主要討論如下幾篇代表性的文章和方法,包括 SqueezeNet[5]、Deep Compression[6]、XNorNet[7]、Distilling[8]、MobileNet[9] 和 ShuffleNet[10],也可按照上述方法進行大致分類:

表 2 幾種經典壓縮方法及對比

Method Compression Approach Speed Consideration
SqueezeNet architecture No
Deep Compression weights No
XNorNet weights Yes
Distilling architecture No
MobileNet architecture Yes
ShuffleNet architecture Yes

一、SqueezeNet

1.1 設計思想

SqueezeNet 是 F. N. Iandola,S.Han 等人於 2016 年的論文《SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and < 0.5MB model size》中提出的一個小型化的網路模型結構,該網路能在保證不損失精度的同時,將原始 AlexNet 壓縮至原來的 510 倍左右(< 0.5MB)。

SqueezeNet 的核心指導思想是——在保證精度的同時使用最少的引數。

而這也是所有模型壓縮方法的一個終極目標。

基於這個思想,SqueezeNet 提出了 3 點網路結構設計策略:

策略 1.將 3x3 卷積核替換為 1x1 卷積核。

這一策略很好理解,因為 1 個 1x1 卷積核的引數是 3x3 卷積核引數的 1/9,這一改動理論上可以將模型尺寸壓縮 9 倍。

策略 2.減小輸入到 3x3 卷積核的輸入通道數。

我們知道,對於一個採用 3x3 卷積核的卷積層,該層所有卷積引數的數量(不考慮偏置)為:

img

式中,N 是卷積核的數量,也即輸出通道數,C 是輸入通道數。

因此,為了保證減小網路引數,不僅僅需要減少 3x3 卷積核的數量,還需減少輸入到 3x3 卷積核的輸入通道數量,即式中 C 的數量。

策略 3.儘可能的將降取樣放在網路後面的層中。

在卷積神經網路中,每層輸出的特徵圖(feature map)是否下采樣是由卷積層的步長或者池化層決定的。而一個重要的觀點是:解析度越大的特徵圖(延遲降取樣)可以帶來更高的分類精度,而這一觀點從直覺上也可以很好理解,因為解析度越大的輸入能夠提供的資訊就越多。

上述三個策略中,前兩個策略都是針對如何降低引數數量而設計的,最後一個旨在最大化網路精度。

1.2 網路架構

基於以上三個策略,作者提出了一個類似 inception 的網路單元結構,取名為 fire module。一個 fire module 包含一個 squeeze 卷積層(只包含 1x1 卷積核)和一個 expand 卷積層(包含 1x1 和 3x3 卷積核)。其中,squeeze 層借鑑了 inception 的思想,利用 1x1 卷積核來降低輸入到 expand 層中 3x3 卷積核的輸入通道數。如圖 1 所示。

img

圖 1 Fire module 結構示意圖 [5]

其中,定義 squeeze 層中 1x1 卷積核的數量是 s1x1,類似的,expand 層中 1x1 卷積核的數量是 e1x1, 3x3 卷積核的數量是 e3x3。令 s1x1 < e1x1+ e3x3 從而保證輸入到 3x3 的輸入通道數減小。SqueezeNet 的網路結構由若干個 fire module 組成,另外文章還給出了一些架構設計上的細節:

  • 為了保證 1x1 卷積核和 3x3 卷積核具有相同大小的輸出,3x3 卷積核採用 1 畫素的 zero-padding 和步長
  • squeeze 層和 expand 層均採用 RELU 作為啟用函式
  • 在 fire9 後採用 50% 的 dropout
  • 由於全連線層的引數數量巨大,因此借鑑 NIN[11] 的思想,去除了全連線層而改用 global average pooling。

1.3 實驗結果

表 3 不同壓縮方法在 ImageNet 上的對比實驗結果 [5]

img

上表顯示,相比傳統的壓縮方法,SqueezeNet 能在保證精度不損(甚至略有提升)的情況下,達到最大的壓縮率,將原始 AlexNet 從 240MB 壓縮至 4.8MB,而結合 Deep Compression 後更能達到 0.47MB,完全滿足了移動端的部署和低頻寬網路的傳輸。

此外,作者還借鑑 ResNet 思想,對原始網路結構做了修改,增加了旁路分支,將分類精度提升了約 3%。

1.4 速度考量

儘管文章主要以壓縮模型尺寸為目標,但毋庸置疑的一點是,SqueezeNet 在網路結構中大量採用 1x1 和 3x3 卷積核是有利於速度的提升的,對於類似 caffe 這樣的深度學習框架,在卷積層的前向計算中,採用 1x1 卷積核可避免額外的 im2col 操作,而直接利用 gemm 進行矩陣加速運算,因此對速度的優化是有一定的作用的。然而,這種提速的作用仍然是有限的,另外,SqueezeNet 採用了 9 個 fire module 和兩個卷積層,因此仍需要進行大量常規卷積操作,這也是影響速度進一步提升的瓶頸。

二、Deep Compression

Deep Compression 出自 S.Han 2016 ICLR 的一篇論文《Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding》。該文章獲得了 ICLR 2016 的最佳論文獎,同時也具有里程碑式的意義,引領了 CNN 模型小型化與加速研究方向的新狂潮,使得這一領域近兩年來湧現出了大量的優秀工作與文章。

2.1 演算法流程

與前面的 “架構壓縮派” 的 SqueezeNet 不同,Deep Compression 是屬於 “權值壓縮派” 的。而兩篇文章均出自 S.Han 團隊,因此兩種方法結合,雙劍合璧,更是能達到登峰造極的壓縮效果。這一實驗結果也在上表中得到驗證。

Deep Compression 的演算法流程包含三步,如圖 2 所示:

img

圖 2 Deep Compression Pipeline[6]

1、Pruning(權值剪枝)

剪枝的思想其實早已在早期論文中可以窺見,LeCun 等人曾經就利用剪枝來稀疏網路,減小過擬合的風險,提升網路泛化性。

圖 3 是 MNIST 上訓練得到的 LeNet conv1 卷積層中的引數分佈,可以看出,大部分權值集中在 0 處附近,對網路的貢獻較小,在剪值中,將 0 值附近的較小的權值置 0,使這些權值不被啟用,從而著重訓練剩下的非零權值,最終在保證網路精度不變的情況下達到壓縮尺寸的目的。

實驗發現模型對剪枝更敏感,因此在剪值時建議逐層迭代修剪,另外每層的剪枝比例如何自動選取仍然是一個值得深入研究的課題。

img

圖 3 LeNet conv1 層權值分佈圖

2、Quantization (權值量化)

此處的權值量化基於權值聚類,將連續分佈的權值離散化,從而減小需要儲存的權值數量。

  • 初始化聚類中心,實驗證明線性初始化效果最好;
  • 利用 k-means 演算法進行聚類,將權值劃分到不同的 cluster 中;
  • 在前向計算時,每個權值由其聚類中心表示;
  • 在後向計算時,統計每個 cluster 中的梯度和將其反傳。

img

圖 4 權值量化前向和後向計算過程 [6]

3、Huffman encoding(霍夫曼編碼)

霍夫曼編碼採用變長編碼將平均編碼長度減小,進一步壓縮模型尺寸。

2.2 模型儲存

前述的剪枝和量化都是為了實現模型的更緊緻的壓縮,以實現減小模型尺寸的目的。

  • 對於剪枝後的模型,由於每層大量引數為 0,後續只需將非零值及其下標進行儲存,文章中採用 CSR(Compressed Sparse Row)來進行儲存,這一步可以實現 9x~13x 的壓縮率。
  • 對於量化後的模型,每個權值都由其聚類中心表示(對於卷積層,聚類中心設為 256 個,對於全連線層,聚類中心設為 32 個),因此可以構造對應的碼書和下標,大大減少了需要儲存的資料量,此步能實現約 3x 的壓縮率。
  • 最後對上述壓縮後的模型進一步採用變長霍夫曼編碼,實現約 1x 的壓縮率。

2.3 實驗結果

表 4 不同網路採用 Deep Compression 後的壓縮率 [6]

img

通過 SqueezeNet+Deep Compression,可以將原始 240M 的 AlexNet 壓縮至 0.47M,實現約 510x 的壓縮率。

2.4 速度考量

可以看出,Deep Compression 的主要設計是針對網路儲存尺寸的壓縮,但在前向時,如果將儲存模型讀入展開後,並沒有帶來更大的速度提升。因此 Song H.等人專門針對壓縮後的模型設計了一套基於 FPGA 的硬體前向加速框架 EIE[12],有興趣的可以研究一下。

三、XNorNet

二值網路一直是模型壓縮和加速領域經久不衰的研究課題之一。將原始 32 位浮點型的權值壓縮到 1 位元,如何最大程度地減小效能損失就成為了研究的關鍵。

此篇論文主要有以下幾個貢獻:

  • 提出了一個 BWN(Binary-Weight-Network)和 XNOR-Network,前者只對網路引數做二值化,帶來約 32x 的儲存壓縮和 2x 的速度提升,而後者對網路輸入和引數都做了二值化,在實現 32x 儲存壓縮的同時帶了 58x 的速度提升;
  • 提出了一個新型二值化權值的演算法;
  • 第一個在大規模資料集如 ImageNet 上提交二值化網路結果的工作;
  • 無需預訓練,可實現 training from scratch。

3.1 BWN

為了訓練二值化權值網路,令

img

,其中

img

,即二值濾波器,

img

是是尺度因子。通過最小化目標函式,得到其最優解:

img

img

img

img

即最優的二值化濾波器張量 B 即為原始引數的符號函式,最優的尺度因子為每個濾波器權值的絕對值的均值。

訓練演算法如圖 5 所示,值得注意的是,只有在前向計算和後向傳播時使用二值化後的權值,在更新引數時依然使用原始引數,這是因為如果使用二值化後的引數會導致很小的梯度下降,從而使得訓練無法收斂。

3.2 XNOR-Net

在 XNOR 網路中,優化的目標是將兩個實數向量的點乘近似到兩個二值向量的點乘,即

img

式中,

img

img

類似的,有最優解如下式

img

在卷積計算中,輸入和權值均量化成了二值,因此傳統的乘法計算變成了異或操作,而非二值化資料的計算只佔了很小一部分。

XNOR-Net 中一個典型的卷積單元如圖 6 所示,與傳統單元不同,各模組的順序有了調整。為了減少二值化帶來的精度損失,對輸入資料首先進行 BN 歸一化處理,BinActiv 層用於對輸入做二值化,接著進行二值化的卷積操作,最後進行 pooling。

img

圖 5 BWN 訓練過程 [7]

img

圖 6 傳統卷積單元與 XNOR-Net 卷積單元對比 [7]

3.3 實驗結果

表 5 ImageNet 上二值網路與 AlexNet 結果對比 [7]

img

與 ALexNet 相比,BWN 網路能夠達到精度基本不變甚至略好,XNOR-Net 由於對輸入也做了二值化,效能稍降。

四、Distilling

Distilling 演算法是 Hinton 等人在論文 Distilling the Knowledge in a Neural Network 中提出的一種類似網路遷移的學習演算法。

4.1 基本思想

Distilling 直譯過來即蒸餾,其基本思想是通過一個效能好的大網路來教小網路學習,從而使得小網路能夠具備跟大網路一樣的效能,但蒸餾後的小網路引數規模遠遠小於原始大網路,從而達到壓縮網路的目的。

其中,訓練小模型 (distilled model) 的目標函式由兩部分組成

1) 與大模型 (cumbersome model) 的 softmax 輸出的交叉熵 (cross entropy),稱為軟目標 (soft target)。其中,softmax 的計算加入了超引數溫度 T,用以控制輸出,計算公式變為

img

溫度 T 越大,輸出的分佈越緩和,概率 zi/T 越小,熵越大,但若 T 過大,會導致較大熵引起的不確定性增加,增加了不可區分性。

至於為何要以 soft target 來計算損失,作者認為,在分類問題中,真值 (groundtruth) 是一個確定性的,即 one-hot vector。以手寫數字分類來說,對於一個數字 3,它的 label 是 3 的概率是 1,而是其他數值的概率是 0,而對於 soft target,它能表徵 label 是 3 的概率,假如這個數字寫的像 5,還可以給出 label 是 5 的一定概率,從而提供更多資訊,如

數字 0 1 2 3 4 5 6 7 8 9
真值 0 0 0 1 0 0 0 0 0 0
軟目標 0 0 0 0.95 0 0.048 0.002 0 0 0

2) 與真值 (groundtruth) 的交叉熵 (T=1)

訓練的損失為上述兩項損失的加權和,通常第二項要小很多。

4.2 實驗結果

作者給出了在語音識別上的實驗結果對比,如下表

表 6 蒸餾模型與原始模型精度對比 [8]

img

上表顯示,蒸餾後的模型的精確度和單字錯誤率和用於產生軟目標的 10 個模型的效能相當,小模型成功地學到了大模型的識別能力。

4.3 速度考量

Distilling 的提出原先並非針對網路加速,而最終計算的效率仍然取決於蒸餾模型的計算規模,但理論上蒸餾後的小模型相對原始大模型的計算速度在一定程度上會有提升,但速度提升的比例和效能維持的權衡是一個值得研究的方向。

五、MobileNet

MobileNet 是由 Google 提出的針對移動端部署的輕量級網路架構。考慮到移動端計算資源受限以及速度要求嚴苛,MobileNet 引入了傳統網路中原先採用的 group 思想,即限制濾波器的卷積計算只針對特定的 group 中的輸入,從而大大降低了卷積計算量,提升了移動端前向計算的速度。

5.1 卷積分解

MobileNet 借鑑 factorized convolution 的思想,將普通卷積操作分成兩部分:

  • Depthwise Convolution 每個卷積核濾波器只針對特定的輸入通道進行卷積操作,如下圖所示,其中 M 是輸入通道數,DK 是卷積核尺寸:

img

圖 7 Depthwise Convolution[9]

Depthwise convolution 的計算複雜度為 DKDKMDFDF,其中 DF 是卷積層輸出的特徵圖的大小。

  • Pointwise Convolution

採用 1x1 大小的卷積核將 depthwise convolution 層的多通道輸出進行結合,如下圖,其中 N 是輸出通道數:

img

圖 8 Pointwise Convolution[9]

Pointwise Convolution 的計算複雜度為 MNDFDF

上面兩步合稱 depthwise separable convolution

標準卷積操作的計算複雜度為 DKDKMNDFDF

因此,通過將標準卷積分解成兩層卷積操作,可以計算出理論上的計算效率提升比例:

img

對於 3x3 尺寸的卷積核來說,depthwise separable convolution 在理論上能帶來約 8~9 倍的效率提升。

5.2 模型架構

img

圖 9 普通卷積單元與 MobileNet 卷積單元對比 [9]

MobileNet 的卷積單元如上圖所示,每個卷積操作後都接著一個 BN 操作和 ReLU 操作。在 MobileNet 中,由於 3x3 卷積核只應用在 depthwise convolution 中,因此 95% 的計算量都集中在 pointwise convolution 中的 1x1 卷積中。而對於 caffe 等採用矩陣運算 GEMM 實現卷積的深度學習框架,1x1 卷積無需進行 im2col 操作,因此可以直接利用矩陣運算加速庫進行快速計算,從而提升了計算效率。

5.3 實驗結果

表 7 MobileNet 與主流大模型在 ImageNet 上精度對比 [9]

img

上表顯示,MobileNet 在保證精度不變的同時,能夠有效地減少計算操作次數和引數量,使得在移動端實時前向計算成為可能。

六、ShuffleNet

ShuffleNet 是 Face++ 今年提出了一篇用於移動端前向部署的網路架構。ShuffleNet 基於 MobileNet 的 group 思想,將卷積操作限制到特定的輸入通道。而與之不同的是,ShuffleNet 將輸入的 group 進行打散,從而保證每個卷積核的感受野能夠分散到不同 group 的輸入中,增加了模型的學習能力。

6.1 設計思想

我們知道,卷積中的 group 操作能夠大大減少卷積操作的計算次數,而這一改動帶來了速度增益和效能維持在 MobileNet 等文章中也得到了驗證。然而 group 操作所帶來的另一個問題是:特定的濾波器僅對特定通道的輸入進行作用,這就阻礙了通道之間的資訊流傳遞,group 數量越多,可以編碼的資訊就越豐富,但每個 group 的輸入通道數量減少,因此可能造成單個卷積濾波器的退化,在一定程度上削弱了網路了表達能力。

6.2 網路架構

在此篇工作中,網路架構的設計主要有以下幾個創新點:

  • 提出了一個類似於 ResNet 的 BottleNeck 單元

借鑑 ResNet 的旁路分支思想,ShuffleNet 也引入了類似的網路單元。不同的是,在 stride=2 的單元中,用 concat 操作代替了 add 操作,用 average pooling 代替了 1x1stride=2 的卷積操作,有效地減少了計算量和引數。單元結構如圖 10 所示。

  • 提出將 1x1 卷積採用 group 操作會得到更好的分類效能

在 MobileNet 中提過,1x1 卷積的操作佔據了約 95% 的計算量,所以作者將 1x1 也更改為 group 卷積,使得相比 MobileNet 的計算量大大減少。

  • 提出了核心的 shuffle 操作將不同 group 中的通道進行打散,從而保證不同輸入通道之間的資訊傳遞。

ShuffleNet 的 shuffle 操作如圖 11 所示。

img

圖 10 ShuffleNet 網路單元 [10]

img

圖 11 不同 group 間的 shuffle 操作 [10]

6.3 實驗結果

表 8 ShuffleNet 與 MobileNet 在 ImageNet 上精度對比 [10]

img

上表顯示,相對於 MobileNet,ShuffleNet 的前向計算量不僅有效地得到了減少,而且分類錯誤率也有明顯提升,驗證了網路的可行性。

6.4 速度考量

作者在 ARM 平臺上對網路效率進行了驗證,鑑於記憶體讀取和執行緒排程等因素,作者發現理論上 4x 的速度提升對應實際部署中約 2.6x。作者給出了與原始 AlexNet 的速度對比,如下表。

表 9 ShuffleNet 與 AlexNet 在 ARM 平臺上速度對比 [10]

img

結束語

近幾年來,除了學術界湧現的諸多 CNN 模型加速工作,工業界各大公司也推出了自己的移動端前向計算框架,如 Google 的 Tensorflow、Facebook 的 caffe2 以及蘋果今年剛推出的 CoreML。相信結合不斷迭代優化的網路架構和不斷髮展的硬體計算加速技術,未來深度學習在移動端的部署將不會是一個難題。

參考文獻

[1] ImageNet Classification with Deep Convolutional Neural Networks

[2] Very Deep Convolutional Networks for Large-Scale Image Recognition

[3] Going Deeper with Convolutions

[4] Rethinking the Inception Architecture for Computer Vision

[5] SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and < 0.5MB model size

[6] Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding

[7] Distilling the Knowledge in a Neural Network

[8] XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks

[9] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

[10] ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

[11] Network in Network

[12] EIE: Efficient Inference Engine on Compressed Deep Neural Network

此文已由作者授權騰訊雲 + 社群在各渠道釋出

獲取更多新鮮技術乾貨,可以關注我們騰訊雲技術社群-雲加社群官方號

更多原創文章乾貨分享,請關注公眾號
  • CNN 模型壓縮與加速演算法綜述
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章