自從AlexNet一舉奪得ILSVRC 2012 ImageNet圖像分類競賽的冠軍后,卷積神經(jīng)網(wǎng)絡(luò)(CNN)的熱潮便席卷了整個計算機視覺領(lǐng)域。CNN模型火速替代了傳統(tǒng)人工設(shè)計(hand-crafted)特征和分類器,不僅提供了一種端到端的處理方法,還大幅度地刷新了各個圖像競賽任務(wù)的精度,更甚者超越了人眼的精度(LFW人臉識別任務(wù))。CNN模型在不斷逼近計算機視覺任務(wù)的精度極限的同時,其深度和尺寸也在成倍增長。
?
表1 幾種經(jīng)典模型的尺寸,計算量和參數(shù)數(shù)量對比
Model Model Size(MB) Million
Mult-Adds Million
Parameters
AlexNet[1]?>200?720?60?
VGG16[2]?>500?15300?138?
GoogleNet[3]?~50?1550?6.8?
Inception-v3[4]?90-100?5000?23.2
隨之而來的是一個很尷尬的場景:如此巨大的模型只能在有限的平臺下使用,根本無法移植到移動端和嵌入式芯片當中。就算想通過網(wǎng)絡(luò)傳輸,但較高的帶寬占用也讓很多用戶望而生畏。另一方面,大尺寸的模型也對設(shè)備功耗和運行速度帶來了巨大的挑戰(zhàn)。因此這樣的模型距離實用還有一段距離。
在這樣的情形下,模型小型化與加速成了亟待解決的問題。其實早期就有學(xué)者提出了一系列CNN模型壓縮方法,包括權(quán)值剪值(prunning)和矩陣SVD分解等,但壓縮率和效率還遠不能令人滿意。
近年來,關(guān)于模型小型化的算法從壓縮角度上可以大致分為兩類:從模型權(quán)重數(shù)值角度壓縮和從網(wǎng)絡(luò)架構(gòu)角度壓縮。另一方面,從兼顧計算速度方面,又可以劃分為:僅壓縮尺寸和壓縮尺寸的同時提升速度。
本文主要討論如下幾篇代表性的文章和方法,包括SqueezeNet[5]、Deep Compression[6]、XNorNet[7]、Distilling[8]、MobileNet[9]和ShuffleNet[10],也可按照上述方法進行大致分類:
表2 幾種經(jīng)典壓縮方法及對比
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 設(shè)計思想
SqueezeNet是F. N. Iandola,S.Han等人于2016年的論文《SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and < 0.5MB model size》中提出的一個小型化的網(wǎng)絡(luò)模型結(jié)構(gòu),該網(wǎng)絡(luò)能在保證不損失精度的同時,將原始AlexNet壓縮至原來的510倍左右(< 0.5MB)。
SqueezeNet的核心指導(dǎo)思想是——在保證精度的同時使用最少的參數(shù)。
而這也是所有模型壓縮方法的一個終極目標。
基于這個思想,SqueezeNet提出了3點網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計策略:
策略 1.將3x3卷積核替換為1x1卷積核。
這一策略很好理解,因為1個1x1卷積核的參數(shù)是3x3卷積核參數(shù)的1/9,這一改動理論上可以將模型尺寸壓縮9倍。
策略 2.減小輸入到3x3卷積核的輸入通道數(shù)。
我們知道,對于一個采用3x3卷積核的卷積層,該層所有卷積參數(shù)的數(shù)量(不考慮偏置)為:
式中,N是卷積核的數(shù)量,也即輸出通道數(shù),C是輸入通道數(shù)。
因此,為了保證減小網(wǎng)絡(luò)參數(shù),不僅僅需要減少3x3卷積核的數(shù)量,還需減少輸入到3x3卷積核的輸入通道數(shù)量,即式中C的數(shù)量。
策略 3.盡可能的將降采樣放在網(wǎng)絡(luò)后面的層中。
在卷積神經(jīng)網(wǎng)絡(luò)中,每層輸出的特征圖(feature map)是否下采樣是由卷積層的步長或者池化層決定的。而一個重要的觀點是:分辨率越大的特征圖(延遲降采樣)可以帶來更高的分類精度,而這一觀點從直覺上也可以很好理解,因為分辨率越大的輸入能夠提供的信息就越多。
上述三個策略中,前兩個策略都是針對如何降低參數(shù)數(shù)量而設(shè)計的,最后一個旨在最大化網(wǎng)絡(luò)精度。
1.2 網(wǎng)絡(luò)架構(gòu)
基于以上三個策略,作者提出了一個類似inception的網(wǎng)絡(luò)單元結(jié)構(gòu),取名為fire module。一個fire module 包含一個squeeze 卷積層(只包含1x1卷積核)和一個expand卷積層(包含1x1和3x3卷積核)。其中,squeeze層借鑒了inception的思想,利用1x1卷積核來降低輸入到expand層中3x3卷積核的輸入通道數(shù)。如圖1所示。
圖1 Fire module結(jié)構(gòu)示意圖
其中,定義squeeze層中1x1卷積核的數(shù)量是s1x1,類似的,expand層中1x1卷積核的數(shù)量是e1x1, 3x3卷積核的數(shù)量是e3x3。令s1x1 < e1x1+ e3x3從而保證輸入到3x3的輸入通道數(shù)減小。SqueezeNet的網(wǎng)絡(luò)結(jié)構(gòu)由若干個 fire module 組成,另外文章還給出了一些架構(gòu)設(shè)計上的細節(jié):
為了保證1x1卷積核和3x3卷積核具有相同大小的輸出,3x3卷積核采用1像素的zero-padding和步長
squeeze層和expand層均采用RELU作為激活函數(shù)
在fire9后采用50%的dropout
由于全連接層的參數(shù)數(shù)量巨大,因此借鑒NIN[11]的思想,去除了全連接層而改用global average pooling。
1.3 實驗結(jié)果
表3 不同壓縮方法在ImageNet上的對比實驗結(jié)果[5]
上表顯示,相比傳統(tǒng)的壓縮方法,SqueezeNet能在保證精度不損(甚至略有提升)的情況下,達到最大的壓縮率,將原始AlexNet從240MB壓縮至4.8MB,而結(jié)合Deep Compression后更能達到0.47MB,完全滿足了移動端的部署和低帶寬網(wǎng)絡(luò)的傳輸。
此外,作者還借鑒ResNet思想,對原始網(wǎng)絡(luò)結(jié)構(gòu)做了修改,增加了旁路分支,將分類精度提升了約3%。
1.4 速度考量
盡管文章主要以壓縮模型尺寸為目標,但毋庸置疑的一點是,SqueezeNet在網(wǎng)絡(luò)結(jié)構(gòu)中大量采用1x1和3x3卷積核是有利于速度的提升的,對于類似caffe這樣的深度學(xué)習(xí)框架,在卷積層的前向計算中,采用1x1卷積核可避免額外的im2col操作,而直接利用gemm進行矩陣加速運算,因此對速度的優(yōu)化是有一定的作用的。然而,這種提速的作用仍然是有限的,另外,SqueezeNet采用了9個fire module和兩個卷積層,因此仍需要進行大量常規(guī)卷積操作,這也是影響速度進一步提升的瓶頸。
二、Deep Compression
Deep Compression出自S.Han 2016 ICLR的一篇論文《Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding》。該文章獲得了ICLR 2016的最佳論文獎,同時也具有里程碑式的意義,引領(lǐng)了CNN模型小型化與加速研究方向的新狂潮,使得這一領(lǐng)域近兩年來涌現(xiàn)出了大量的優(yōu)秀工作與文章。
2.1 算法流程
與前面的“架構(gòu)壓縮派”的SqueezeNet不同,Deep Compression是屬于“權(quán)值壓縮派”的。而兩篇文章均出自S.Han團隊,因此兩種方法結(jié)合,雙劍合璧,更是能達到登峰造極的壓縮效果。這一實驗結(jié)果也在上表中得到驗證。
Deep Compression的算法流程包含三步,如圖2所示:
圖2 Deep Compression Pipeline
1、Pruning(權(quán)值剪枝)
剪枝的思想其實早已在早期論文中可以窺見,LeCun等人曾經(jīng)就利用剪枝來稀疏網(wǎng)絡(luò),減小過擬合的風(fēng)險,提升網(wǎng)絡(luò)泛化性。
圖3是MNIST上訓(xùn)練得到的LeNet conv1卷積層中的參數(shù)分布,可以看出,大部分權(quán)值集中在0處附近,對網(wǎng)絡(luò)的貢獻較小,在剪值中,將0值附近的較小的權(quán)值置0,使這些權(quán)值不被激活,從而著重訓(xùn)練剩下的非零權(quán)值,最終在保證網(wǎng)絡(luò)精度不變的情況下達到壓縮尺寸的目的。
實驗發(fā)現(xiàn)模型對剪枝更敏感,因此在剪值時建議逐層迭代修剪,另外每層的剪枝比例如何自動選取仍然是一個值得深入研究的課題。
圖3 LeNet conv1層權(quán)值分布圖
2、Quantization (權(quán)值量化)
此處的權(quán)值量化基于權(quán)值聚類,將連續(xù)分布的權(quán)值離散化,從而減小需要存儲的權(quán)值數(shù)量。
初始化聚類中心,實驗證明線性初始化效果最好;
利用k-means算法進行聚類,將權(quán)值劃分到不同的cluster中;
在前向計算時,每個權(quán)值由其聚類中心表示;
在后向計算時,統(tǒng)計每個cluster中的梯度和將其反傳。
圖4 權(quán)值量化前向和后向計算過程
3、Huffman encoding(霍夫曼編碼)
霍夫曼編碼采用變長編碼將平均編碼長度減小,進一步壓縮模型尺寸。
2.2 模型存儲
前述的剪枝和量化都是為了實現(xiàn)模型的更緊致的壓縮,以實現(xiàn)減小模型尺寸的目的。
對于剪枝后的模型,由于每層大量參數(shù)為0,后續(xù)只需將非零值及其下標進行存儲,文章中采用CSR(Compressed Sparse Row)來進行存儲,這一步可以實現(xiàn)9x~13x的壓縮率。
對于量化后的模型,每個權(quán)值都由其聚類中心表示(對于卷積層,聚類中心設(shè)為256個,對于全連接層,聚類中心設(shè)為32個),因此可以構(gòu)造對應(yīng)的碼書和下標,大大減少了需要存儲的數(shù)據(jù)量,此步能實現(xiàn)約3x的壓縮率。
最后對上述壓縮后的模型進一步采用變長霍夫曼編碼,實現(xiàn)約1x的壓縮率。
2.3 實驗結(jié)果
表4 不同網(wǎng)絡(luò)采用Deep Compression后的壓縮率
通過SqueezeNet+Deep Compression,可以將原始240M的AlexNet壓縮至0.47M,實現(xiàn)約510x的壓縮率。
2.4 速度考量
可以看出,Deep Compression的主要設(shè)計是針對網(wǎng)絡(luò)存儲尺寸的壓縮,但在前向時,如果將存儲模型讀入展開后,并沒有帶來更大的速度提升。因此Song H.等人專門針對壓縮后的模型設(shè)計了一套基于FPGA的硬件前向加速框架EIE[12],有興趣的可以研究一下。
三、XNorNet
二值網(wǎng)絡(luò)一直是模型壓縮和加速領(lǐng)域經(jīng)久不衰的研究課題之一。將原始32位浮點型的權(quán)值壓縮到1比特,如何最大程度地減小性能損失就成為了研究的關(guān)鍵。
此篇論文主要有以下幾個貢獻:
提出了一個BWN(Binary-Weight-Network)和XNOR-Network,前者只對網(wǎng)絡(luò)參數(shù)做二值化,帶來約32x的存儲壓縮和2x的速度提升,而后者對網(wǎng)絡(luò)輸入和參數(shù)都做了二值化,在實現(xiàn)32x存儲壓縮的同時帶了58x的速度提升;
提出了一個新型二值化權(quán)值的算法;
第一個在大規(guī)模數(shù)據(jù)集如ImageNet上提交二值化網(wǎng)絡(luò)結(jié)果的工作;
無需預(yù)訓(xùn)練,可實現(xiàn)training from scratch。
3.1 BWN
即最優(yōu)的二值化濾波器張量B即為原始參數(shù)的符號函數(shù),最優(yōu)的尺度因子為每個濾波器權(quán)值的絕對值的均值。
訓(xùn)練算法如圖5所示,值得注意的是,只有在前向計算和后向傳播時使用二值化后的權(quán)值,在更新參數(shù)時依然使用原始參數(shù),這是因為如果使用二值化后的參數(shù)會導(dǎo)致很小的梯度下降,從而使得訓(xùn)練無法收斂。
3.2 XNOR-Net
在XNOR網(wǎng)絡(luò)中,優(yōu)化的目標是將兩個實數(shù)向量的點乘近似到兩個二值向量的點乘,即
在卷積計算中,輸入和權(quán)值均量化成了二值,因此傳統(tǒng)的乘法計算變成了異或操作,而非二值化數(shù)據(jù)的計算只占了很小一部分。
XNOR-Net中一個典型的卷積單元如圖6所示,與傳統(tǒng)單元不同,各模塊的順序有了調(diào)整。為了減少二值化帶來的精度損失,對輸入數(shù)據(jù)首先進行BN歸一化處理,BinActiv層用于對輸入做二值化,接著進行二值化的卷積操作,最后進行pooling。
圖5 BWN訓(xùn)練過程
圖6 傳統(tǒng)卷積單元與XNOR-Net卷積單元對比
3.3 實驗結(jié)果
表5 ImageNet上二值網(wǎng)絡(luò)與AlexNet結(jié)果對比
與ALexNet相比,BWN網(wǎng)絡(luò)能夠達到精度基本不變甚至略好,XNOR-Net由于對輸入也做了二值化,性能稍降。
四、Distilling
Distilling算法是Hinton等人在論文Distilling the Knowledge in a Neural Network中提出的一種類似網(wǎng)絡(luò)遷移的學(xué)習(xí)算法。
4.1 基本思想
Distilling直譯過來即蒸餾,其基本思想是通過一個性能好的大網(wǎng)絡(luò)來教小網(wǎng)絡(luò)學(xué)習(xí),從而使得小網(wǎng)絡(luò)能夠具備跟大網(wǎng)絡(luò)一樣的性能,但蒸餾后的小網(wǎng)絡(luò)參數(shù)規(guī)模遠遠小于原始大網(wǎng)絡(luò),從而達到壓縮網(wǎng)絡(luò)的目的。
其中,訓(xùn)練小模型(distilled model)的目標函數(shù)由兩部分組成
1) 與大模型(cumbersome model)的softmax輸出的交叉熵(cross entropy),稱為軟目標(soft target)。其中,softmax的計算加入了超參數(shù)溫度T,用以控制輸出,計算公式變?yōu)?/p>
溫度T越大,輸出的分布越緩和,概率zi/T越小,熵越大,但若T過大,會導(dǎo)致較大熵引起的不確定性增加,增加了不可區(qū)分性。
至于為何要以soft target來計算損失,作者認為,在分類問題中,真值(groundtruth)是一個確定性的,即one-hot vector。以手寫數(shù)字分類來說,對于一個數(shù)字3,它的label是3的概率是1,而是其他數(shù)值的概率是0,而對于soft target,它能表征label是3的概率,假如這個數(shù)字寫的像5,還可以給出label是5的一定概率,從而提供更多信息,如
數(shù)字 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)
訓(xùn)練的損失為上述兩項損失的加權(quán)和,通常第二項要小很多。
4.2 實驗結(jié)果
作者給出了在語音識別上的實驗結(jié)果對比,如下表
表6 蒸餾模型與原始模型精度對比[8]
上表顯示,蒸餾后的模型的精確度和單字錯誤率和用于產(chǎn)生軟目標的10個模型的性能相當,小模型成功地學(xué)到了大模型的識別能力。
4.3 速度考量
Distilling的提出原先并非針對網(wǎng)絡(luò)加速,而最終計算的效率仍然取決于蒸餾模型的計算規(guī)模,但理論上蒸餾后的小模型相對原始大模型的計算速度在一定程度上會有提升,但速度提升的比例和性能維持的權(quán)衡是一個值得研究的方向。
五、MobileNet
MobileNet是由Google提出的針對移動端部署的輕量級網(wǎng)絡(luò)架構(gòu)。考慮到移動端計算資源受限以及速度要求嚴苛,MobileNet引入了傳統(tǒng)網(wǎng)絡(luò)中原先采用的group思想,即限制濾波器的卷積計算只針對特定的group中的輸入,從而大大降低了卷積計算量,提升了移動端前向計算的速度。
5.1 卷積分解
MobileNet借鑒factorized convolution的思想,將普通卷積操作分成兩部分:
Depthwise Convolution
每個卷積核濾波器只針對特定的輸入通道進行卷積操作,如下圖所示,其中M是輸入通道數(shù),DK是卷積核尺寸:
圖7 Depthwise Convolution
Depthwise convolution的計算復(fù)雜度為 DKDKMDFDF,其中DF是卷積層輸出的特征圖的大小。
Pointwise Convolution
采用1x1大小的卷積核將depthwise convolution層的多通道輸出進行結(jié)合,如下圖,其中N是輸出通道數(shù):
圖8 Pointwise Convolution[
Pointwise Convolution的計算復(fù)雜度為 MNDFDF
上面兩步合稱depthwise separable convolution
標準卷積操作的計算復(fù)雜度為DKDKMNDFDF
因此,通過將標準卷積分解成兩層卷積操作,可以計算出理論上的計算效率提升比例:
對于3x3尺寸的卷積核來說,depthwise separable convolution在理論上能帶來約8~9倍的效率提升。
5.2 模型架構(gòu)
圖9 普通卷積單元與MobileNet 卷積單元對比
MobileNet的卷積單元如上圖所示,每個卷積操作后都接著一個BN操作和ReLU操作。在MobileNet中,由于3x3卷積核只應(yīng)用在depthwise convolution中,因此95%的計算量都集中在pointwise convolution 中的1x1卷積中。而對于caffe等采用矩陣運算GEMM實現(xiàn)卷積的深度學(xué)習(xí)框架,1x1卷積無需進行im2col操作,因此可以直接利用矩陣運算加速庫進行快速計算,從而提升了計算效率。
5.3 實驗結(jié)果
表7 MobileNet與主流大模型在ImageNet上精度對比
上表顯示,MobileNet在保證精度不變的同時,能夠有效地減少計算操作次數(shù)和參數(shù)量,使得在移動端實時前向計算成為可能。
六、ShuffleNet
ShuffleNet是Face++今年提出了一篇用于移動端前向部署的網(wǎng)絡(luò)架構(gòu)。ShuffleNet基于MobileNet的group思想,將卷積操作限制到特定的輸入通道。而與之不同的是,ShuffleNet將輸入的group進行打散,從而保證每個卷積核的感受野能夠分散到不同group的輸入中,增加了模型的學(xué)習(xí)能力。
6.1 設(shè)計思想
我們知道,卷積中的group操作能夠大大減少卷積操作的計算次數(shù),而這一改動帶來了速度增益和性能維持在MobileNet等文章中也得到了驗證。然而group操作所帶來的另一個問題是:特定的濾波器僅對特定通道的輸入進行作用,這就阻礙了通道之間的信息流傳遞,group數(shù)量越多,可以編碼的信息就越豐富,但每個group的輸入通道數(shù)量減少,因此可能造成單個卷積濾波器的退化,在一定程度上削弱了網(wǎng)絡(luò)了表達能力。
6.2 網(wǎng)絡(luò)架構(gòu)
在此篇工作中,網(wǎng)絡(luò)架構(gòu)的設(shè)計主要有以下幾個創(chuàng)新點:
提出了一個類似于ResNet的BottleNeck單元
借鑒ResNet的旁路分支思想,ShuffleNet也引入了類似的網(wǎng)絡(luò)單元。不同的是,在stride=2的單元中,用concat操作代替了add操作,用average pooling代替了1x1stride=2的卷積操作,有效地減少了計算量和參數(shù)。單元結(jié)構(gòu)如圖10所示。
提出將1x1卷積采用group操作會得到更好的分類性能
在MobileNet中提過,1x1卷積的操作占據(jù)了約95%的計算量,所以作者將1x1也更改為group卷積,使得相比MobileNet的計算量大大減少。
提出了核心的shuffle操作將不同group中的通道進行打散,從而保證不同輸入通道之間的信息傳遞。
ShuffleNet的shuffle操作如圖11所示。
圖10 ShuffleNet網(wǎng)絡(luò)單元
圖11 不同group間的shuffle操作
6.3 實驗結(jié)果
表8 ShuffleNet與MobileNet在ImageNet上精度對比
上表顯示,相對于MobileNet,ShuffleNet的前向計算量不僅有效地得到了減少,而且分類錯誤率也有明顯提升,驗證了網(wǎng)絡(luò)的可行性。
6.4 速度考量
作者在ARM平臺上對網(wǎng)絡(luò)效率進行了驗證,鑒于內(nèi)存讀取和線程調(diào)度等因素,作者發(fā)現(xiàn)理論上4x的速度提升對應(yīng)實際部署中約2.6x。作者給出了與原始AlexNet的速度對比,如下表。
表9 ShuffleNet與AlexNet在ARM平臺上速度對比 [10]
結(jié)束語
近幾年來,除了學(xué)術(shù)界涌現(xiàn)的諸多CNN模型加速工作,工業(yè)界各大公司也推出了自己的移動端前向計算框架,如Google的Tensorflow、Facebook的caffe2以及蘋果今年剛推出的CoreML。相信結(jié)合不斷迭代優(yōu)化的網(wǎng)絡(luò)架構(gòu)和不斷發(fā)展的硬件計算加速技術(shù),未來深度學(xué)習(xí)在移動端的部署將不會是一個難題。
參考文獻
[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
評論
查看更多