本文由雲+社區發表導語:卷積神經網絡日益增加的深度和尺寸爲深度學習在移動端的部署帶來了巨大的挑戰,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 |
隨之而來的是一個很尷尬的場景:如此巨大的模型只能在有限的平臺下使用,根本沒法移植到移動端和嵌入式芯片當中。就算想經過網絡傳輸,但較高的帶寬佔用也讓不少用戶望而生畏。另外一方面,大尺寸的模型也對設備功耗和運行速度帶來了巨大的挑戰。所以這樣的模型距離實用還有一段距離。ide
在這樣的情形下,模型小型化與加速成了亟待解決的問題。其實早期就有學者提出了一系列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是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卷積核的卷積層,該層全部卷積參數的數量(不考慮偏置)爲:
式中,N是卷積核的數量,也即輸出通道數,C是輸入通道數。
所以,爲了保證減少網絡參數,不只僅須要減小3x3卷積核的數量,還需減小輸入到3x3卷積核的輸入通道數量,即式中C的數量。
策略 3.儘量的將降採樣放在網絡後面的層中。
在卷積神經網絡中,每層輸出的特徵圖(feature map)是否下采樣是由卷積層的步長或者池化層決定的。而一個重要的觀點是:分辨率越大的特徵圖(延遲降採樣)能夠帶來更高的分類精度,而這一觀點從直覺上也能夠很好理解,由於分辨率越大的輸入可以提供的信息就越多。
上述三個策略中,前兩個策略都是針對如何下降參數數量而設計的,最後一個旨在最大化網絡精度。
基於以上三個策略,做者提出了一個相似inception的網絡單元結構,取名爲fire module。一個fire module 包含一個squeeze 卷積層(只包含1x1卷積核)和一個expand卷積層(包含1x1和3x3卷積核)。其中,squeeze層借鑑了inception的思想,利用1x1卷積核來下降輸入到expand層中3x3卷積核的輸入通道數。如圖1所示。
圖1 Fire module結構示意圖[5]
其中,定義squeeze層中1x1卷積核的數量是s1x1,相似的,expand層中1x1卷積核的數量是e1x1, 3x3卷積核的數量是e3x3。令s1x1 < e1x1+ e3x3從而保證輸入到3x3的輸入通道數減少。SqueezeNet的網絡結構由若干個 fire module 組成,另外文章還給出了一些架構設計上的細節:
表3 不一樣壓縮方法在ImageNet上的對比實驗結果[5]
上表顯示,相比傳統的壓縮方法,SqueezeNet能在保證精度不損(甚至略有提高)的狀況下,達到最大的壓縮率,將原始AlexNet從240MB壓縮至4.8MB,而結合Deep Compression後更能達到0.47MB,徹底知足了移動端的部署和低帶寬網絡的傳輸。
此外,做者還借鑑ResNet思想,對原始網絡結構作了修改,增長了旁路分支,將分類精度提高了約3%。
儘管文章主要以壓縮模型尺寸爲目標,但毋庸置疑的一點是,SqueezeNet在網絡結構中大量採用1x1和3x3卷積核是有利於速度的提高的,對於相似caffe這樣的深度學習框架,在卷積層的前向計算中,採用1x1卷積核可避免額外的im2col操做,而直接利用gemm進行矩陣加速運算,所以對速度的優化是有必定的做用的。然而,這種提速的做用仍然是有限的,另外,SqueezeNet採用了9個fire module和兩個卷積層,所以仍須要進行大量常規卷積操做,這也是影響速度進一步提高的瓶頸。
Deep Compression出自S.Han 2016 ICLR的一篇論文《Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding》。該文章得到了ICLR 2016的最佳論文獎,同時也具備里程碑式的意義,引領了CNN模型小型化與加速研究方向的新狂潮,使得這一領域近兩年來涌現出了大量的優秀工做與文章。
與前面的「架構壓縮派」的SqueezeNet不一樣,Deep Compression是屬於「權值壓縮派」的。而兩篇文章均出自S.Han團隊,所以兩種方法結合,雙劍合璧,更是能達到登峯造極的壓縮效果。這一實驗結果也在上表中獲得驗證。
Deep Compression的算法流程包含三步,如圖2所示:
圖2 Deep Compression Pipeline[6]
一、Pruning(權值剪枝)
剪枝的思想其實早已在早期論文中能夠窺見,LeCun等人曾經就利用剪枝來稀疏網絡,減少過擬合的風險,提高網絡泛化性。
圖3是MNIST上訓練獲得的LeNet conv1卷積層中的參數分佈,能夠看出,大部分權值集中在0處附近,對網絡的貢獻較小,在剪值中,將0值附近的較小的權值置0,使這些權值不被激活,從而着重訓練剩下的非零權值,最終在保證網絡精度不變的狀況下達到壓縮尺寸的目的。
實驗發現模型對剪枝更敏感,所以在剪值時建議逐層迭代修剪,另外每層的剪枝比例如何自動選取仍然是一個值得深刻研究的課題。
圖3 LeNet conv1層權值分佈圖
二、Quantization (權值量化)
此處的權值量化基於權值聚類,將連續分佈的權值離散化,從而減少須要存儲的權值數量。
圖4 權值量化前向和後向計算過程[6]
三、Huffman encoding(霍夫曼編碼)
霍夫曼編碼採用變長編碼將平均編碼長度減少,進一步壓縮模型尺寸。
前述的剪枝和量化都是爲了實現模型的更緊緻的壓縮,以實現減少模型尺寸的目的。
表4 不一樣網絡採用Deep Compression後的壓縮率[6]
經過SqueezeNet+Deep Compression,能夠將原始240M的AlexNet壓縮至0.47M,實現約510x的壓縮率。
能夠看出,Deep Compression的主要設計是針對網絡存儲尺寸的壓縮,但在前向時,若是將存儲模型讀入展開後,並無帶來更大的速度提高。所以Song H.等人專門針對壓縮後的模型設計了一套基於FPGA的硬件前向加速框架EIE[12],有興趣的能夠研究一下。
二值網絡一直是模型壓縮和加速領域經久不衰的研究課題之一。將原始32位浮點型的權值壓縮到1比特,如何最大程度地減少性能損失就成爲了研究的關鍵。
此篇論文主要有如下幾個貢獻:
爲了訓練二值化權值網絡,令
,其中
,即二值濾波器,
是是尺度因子。經過最小化目標函數,獲得其最優解:
即最優的二值化濾波器張量B即爲原始參數的符號函數,最優的尺度因子爲每一個濾波器權值的絕對值的均值。
訓練算法如圖5所示,值得注意的是,只有在前向計算和後向傳播時使用二值化後的權值,在更新參數時依然使用原始參數,這是由於若是使用二值化後的參數會致使很小的梯度降低,從而使得訓練沒法收斂。
在XNOR網絡中,優化的目標是將兩個實數向量的點乘近似到兩個二值向量的點乘,即
式中,
,
相似的,有最優解以下式
在卷積計算中,輸入和權值均量化成了二值,所以傳統的乘法計算變成了異或操做,而非二值化數據的計算只佔了很小一部分。
XNOR-Net中一個典型的卷積單元如圖6所示,與傳統單元不一樣,各模塊的順序有了調整。爲了減小二值化帶來的精度損失,對輸入數據首先進行BN歸一化處理,BinActiv層用於對輸入作二值化,接着進行二值化的卷積操做,最後進行pooling。
圖5 BWN訓練過程[7]
圖6 傳統卷積單元與XNOR-Net卷積單元對比[7]
表5 ImageNet上二值網絡與AlexNet結果對比[7]
與ALexNet相比,BWN網絡可以達到精度基本不變甚至略好,XNOR-Net因爲對輸入也作了二值化,性能稍降。
Distilling算法是Hinton等人在論文Distilling the Knowledge in a Neural Network中提出的一種相似網絡遷移的學習算法。
Distilling直譯過來即蒸餾,其基本思想是經過一個性能好的大網絡來教小網絡學習,從而使得小網絡可以具有跟大網絡同樣的性能,但蒸餾後的小網絡參數規模遠遠小於原始大網絡,從而達到壓縮網絡的目的。
其中,訓練小模型(distilled model)的目標函數由兩部分組成
1) 與大模型(cumbersome model)的softmax輸出的交叉熵(cross entropy),稱爲軟目標(soft target)。其中,softmax的計算加入了超參數溫度T,用以控制輸出,計算公式變爲
溫度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)
訓練的損失爲上述兩項損失的加權和,一般第二項要小不少。
做者給出了在語音識別上的實驗結果對比,以下表
表6 蒸餾模型與原始模型精度對比[8]
上表顯示,蒸餾後的模型的精確度和單字錯誤率和用於產生軟目標的10個模型的性能至關,小模型成功地學到了大模型的識別能力。
Distilling的提出原先並不是針對網絡加速,而最終計算的效率仍然取決於蒸餾模型的計算規模,但理論上蒸餾後的小模型相對原始大模型的計算速度在必定程度上會有提高,但速度提高的比例和性能維持的權衡是一個值得研究的方向。
MobileNet是由Google提出的針對移動端部署的輕量級網絡架構。考慮到移動端計算資源受限以及速度要求嚴苛,MobileNet引入了傳統網絡中原先採用的group思想,即限制濾波器的卷積計算只針對特定的group中的輸入,從而大大下降了卷積計算量,提高了移動端前向計算的速度。
MobileNet借鑑factorized convolution的思想,將普通卷積操做分紅兩部分:
圖7 Depthwise Convolution[9]
Depthwise convolution的計算複雜度爲 DKDKMDFDF,其中DF是卷積層輸出的特徵圖的大小。
採用1x1大小的卷積核將depthwise convolution層的多通道輸出進行結合,以下圖,其中N是輸出通道數:
圖8 Pointwise Convolution[9]
Pointwise Convolution的計算複雜度爲 MNDFDF
上面兩步合稱depthwise separable convolution
標準卷積操做的計算複雜度爲DKDKMNDFDF
所以,經過將標準卷積分解成兩層卷積操做,能夠計算出理論上的計算效率提高比例:
對於3x3尺寸的卷積核來講,depthwise separable convolution在理論上能帶來約8~9倍的效率提高。
圖9 普通卷積單元與MobileNet 卷積單元對比[9]
MobileNet的卷積單元如上圖所示,每一個卷積操做後都接着一個BN操做和ReLU操做。在MobileNet中,因爲3x3卷積核只應用在depthwise convolution中,所以95%的計算量都集中在pointwise convolution 中的1x1卷積中。而對於caffe等採用矩陣運算GEMM實現卷積的深度學習框架,1x1卷積無需進行im2col操做,所以能夠直接利用矩陣運算加速庫進行快速計算,從而提高了計算效率。
表7 MobileNet與主流大模型在ImageNet上精度對比[9]
上表顯示,MobileNet在保證精度不變的同時,可以有效地減小計算操做次數和參數量,使得在移動端實時前向計算成爲可能。
ShuffleNet是Face++今年提出了一篇用於移動端前向部署的網絡架構。ShuffleNet基於MobileNet的group思想,將卷積操做限制到特定的輸入通道。而與之不一樣的是,ShuffleNet將輸入的group進行打散,從而保證每一個卷積核的感覺野可以分散到不一樣group的輸入中,增長了模型的學習能力。
咱們知道,卷積中的group操做可以大大減小卷積操做的計算次數,而這一改動帶來了速度增益和性能維持在MobileNet等文章中也獲得了驗證。然而group操做所帶來的另外一個問題是:特定的濾波器僅對特定通道的輸入進行做用,這就阻礙了通道之間的信息流傳遞,group數量越多,能夠編碼的信息就越豐富,但每一個group的輸入通道數量減小,所以可能形成單個卷積濾波器的退化,在必定程度上削弱了網絡了表達能力。
在此篇工做中,網絡架構的設計主要有如下幾個創新點:
借鑑ResNet的旁路分支思想,ShuffleNet也引入了相似的網絡單元。不一樣的是,在stride=2的單元中,用concat操做代替了add操做,用average pooling代替了1x1stride=2的卷積操做,有效地減小了計算量和參數。單元結構如圖10所示。
在MobileNet中提過,1x1卷積的操做佔據了約95%的計算量,因此做者將1x1也更改成group卷積,使得相比MobileNet的計算量大大減小。
ShuffleNet的shuffle操做如圖11所示。
圖10 ShuffleNet網絡單元[10]
圖11 不一樣group間的shuffle操做[10]
表8 ShuffleNet與MobileNet在ImageNet上精度對比 [10]
上表顯示,相對於MobileNet,ShuffleNet的前向計算量不只有效地獲得了減小,並且分類錯誤率也有明顯提高,驗證了網絡的可行性。
做者在ARM平臺上對網絡效率進行了驗證,鑑於內存讀取和線程調度等因素,做者發現理論上4x的速度提高對應實際部署中約2.6x。做者給出了與原始AlexNet的速度對比,以下表。
表9 ShuffleNet與AlexNet在ARM平臺上速度對比 [10]
近幾年來,除了學術界涌現的諸多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
此文已由做者受權騰訊雲+社區在各渠道發佈
獲取更多新鮮技術乾貨,能夠關注咱們騰訊雲技術社區-雲加社區官方號