廖干洲
(廣州大學松田學院,廣東 增城 511370)
深度學習網絡,尤其是卷積神經網絡(簡稱CNN),自從在LeNet[1]的問世以來,其實在2012年 AlexNet[2]以絕對優(yōu)勢問鼎 ImageNet LSVRC-2012挑戰(zhàn)賽以后,卷積神經網絡幾乎成了深度學習網絡的代名詞,在圖像、語音識別等領域上的應用具有壓倒性的優(yōu)勢。以至于隨后的VGG[3]、GoogLeNet[4]、ResNet[5]等經典網絡,都是在卷積神經網絡的基礎上,在網絡模塊結結構、網絡深度和訓練方法等進行改進,從而得到進一步的發(fā)展應用。甚至連今年流行的目標檢測(Object Detection)算法中,諸如 RCNN[6],Faster RCNN[7]、SSD[8]、YOLO[9-11]等網絡,無一不是從卷積神經網絡的基礎上發(fā)展起來的。
盡管卷積神經網絡在識別和目標檢測領域上具有令人滿意的效果,但是這些效果多是在實驗室的高性能計算機中得到的,如YOLO-v1在2016年的計算機配置中,使用了4塊Titan X顯卡,每一個塊顯卡的算力達到6.9 TFLOPs,而移動端當前最新的處理器高通驍龍 865處理器的算力為1.5TFLOPS,不及于4年前計算機的1/4,因此最前沿的卷積神經網絡的效率問題一直為人所詬病,也正因為這個原因,卷積神經網絡在很長的一段時間內,都是停留在實驗室當中,真正的應用較少。人們也一直致力于在卷積神經網絡移動端的移植應用,但是多是停留在網絡剪枝和減少網絡層數等方法上,沒有根本地解決卷積神經網絡結構復雜的問題。直到 2016年提出 Squeeze Net[13]和 2017年 google團隊提出 Mobile Net[14]后,輕量化的卷積神經網絡算是有了比較明確的發(fā)展方向與路徑。
近年便攜式設備得到了迅速的普及,用戶也對其提出了越來越多的需求,尤其在神經網絡的應用上。因此,如何設計高效、高性能的輕量化神經網絡是解決問題的關鍵。本文詳細闡述了Squeeze Net,Mobile Net和 Shuffle Net[15]等三種輕量化神經網絡,同時簡要總結和分析了每種方法的特點,最后總結現有的方法,并給出了未來發(fā)展的前景。
隨著CNN性能要求越來越高,傳統(tǒng)的網絡已經無法滿足大家的需求,于是乎大家紛紛提出性能更優(yōu)越的 CNN網絡,在 AlexNet后,有如VGG、GoogLeNet、ResNet一系列網絡等。而這些網絡的性能得到提升的重要原因是在于網絡層數的不斷增加。從7層AlexNet到16層VGG,再從16層VGG到GoogLeNet的22層,再到152層 ResNet(更有上千層的 ResNet)。雖然網絡性能得到了逐步提高,但隨之而來的就是效率問題。
表1 幾種傳統(tǒng)卷積申請網絡概況Tab.1 Overview of several traditional convolution application networks
效率問題主要是模型的存儲問題和模型進行預測的速度問題。第一,存儲問題。大型網絡有著大量的權值參數,保存大量權值參數對設備的內存要求很高;第二,速度問題。在實際應用中,往往是毫秒級別,而在現有的移動設備的處理器來講,很難滿足此要求,因此減少計算量成為了主要的技術手段。
如何解決 CNN網絡在存儲上和速度上的問題,成了這些網絡是否能夠應用在實際場景的關鍵問題,因此,輕量化CNN應運而生。
針對不用的應用場景,在CNN的框架下重新設計每一層網絡,該方法是的輕量化神經網絡成為研究得熱點,標志性的事件是 Squeeze Net 的提出,該方法使用了AlexNet五十分之一的計算,達到了幾乎一樣的效果。該方法把多個稱為 Fire Module的CNN模塊構建而成。所謂Fire Module是由兩個模塊組成,分別是 Squeeze模塊和Expand模塊,所謂Squeeze就是多個1×1的卷積核,借鑒了GoogLeNet的思想,使用1×1的卷積核的使得 squeeze模塊變成一個瓶頸層[16],減少網絡通道數,以減少計算量,然后再利用Expand模塊把通道數增加,如圖1所示,原128個通道輸入,通過Squeeze層,變?yōu)?6個輸出,再通過Expand層的兩個64通道,結合變?yōu)?28個通道,還原為原來的尺寸大小。
圖1 某一層Fire Module的詳解計算過程Fig.1 Detailed calculation process of a certain layer of Fire Module
此外,還采用了將池化層采樣操作延后的方法,可以給卷積層提供更大的激活圖:更大的激活圖保留了更多的信息,可以提供更高的分類準確率,當然此方法是為了提高準確率,但是因為池化層的延后,對其計算量會有一定的增加。
Mobile Net是google團隊在2017年提出的一種新型輕量化CNN模型,Mobile Net的基本單元是深度可分離單元(Depthwise Separable Convolution)[17],分為兩個部分,分別是深度卷積(Depthwise Convolution)和逐點卷積(Pointwise Convolution)[18],如圖 2。
其中深度卷積和標準卷積不同,對于標準卷積其卷積核是用在所有的輸入通道上,而深度卷積針對每個輸入通道采用不同的卷積核,就是說一個卷積核對應一個輸入通道,通道之間直接沒有交叉聯系,因此其計算量大大減小。
圖2 標準卷積與深度可分離卷積Fig.2 Standard convolution and depth separable convolution
此外,為了進一步壓縮參數數量,該方法還準備了兩個參數,分別為寬度算子(Width Multiplier)α,和分別率算子(Resolution Multiplier)ρ。兩個參數均為小于1的小數,分別乘以輸入通道M和輸出通道N,和輸入圖像的尺寸。減小輸入、輸出通道,和輸入圖像的尺寸,可以進一步壓縮數據,也就減小的數據和計算量了。
ShuffleNet是Face++團隊在2017年末提出的模型,是把前人關于輕量化模型和壓縮模型的方法結合起來,核心是利用原有的ResNet,采用了通道重組(channel shuffle)、組卷積(pointwise group convolution)[19]和深度卷積(depthwise separable convolution)來修改原來的ResNet單元。
2.3.1 通道重組
分組卷積能有效減少計算量,一般卷積操作中比如輸入通道的數量是 N,該卷積核的數量是M,那么M個卷積核都要和N個通道進行卷積計算,然后相加作為一個卷積的結果。利用了分組計算,設g組數為g,那么N個輸入通道就被分成g個組,M個卷積核就被分成g個組,分組卷積時,第一個組的M/g個卷積核中的每一個都和第一個組的N/g個輸入通道做卷積得到結果,第二個組同理,直到最后一個組。這種操作可以大大減少計算量,因為你每個卷積核不再是和輸入的全部通道做卷積,而是和一個組的通道做卷積。
但是如果多個組操作疊加在一起,某個輸出通道僅僅來自自己輸入通道,并不包含其他通道,輸出的特征會非常局限,而使用通道重組,可以解決這個問題。通道重組技術在分組時對所有的組進行重組操作(shuffle),這樣每個輸出的通道,便包含了所有輸入通道的數據,得到更為合理的結果。
如圖 3所示,為了便于理解,以顏色通道為例,從左到右分別為紅色、綠色和藍色。在未進行重組前,每一組的輸出,只跟輸入數據的有關系(如圖a中紅色部分);而在重組以后,每一輸出都包含了所有的輸入通道元素(如圖c中,每一個輸出通道都包含輸入的三種顏色)。
圖3 分組卷積思想Fig.3 Gr ouped convolution idea
2.3.2 計算量對比
以普通二維卷積為例,設輸入的數據格式為:m×m×h1,卷積核為:k×k,輸出的數據格式為:n×n×h2:
參 數量:k×k×h1×h2
計算量:k×k×h1×h2×n×n
而利用分組卷積技術,假設分組大小為g,則:參數量:
(k×k×h1/g×h2/g) ×g=k×k×h1×h2/g計算量:
(k×k×h1/g×h2/g×n×n) /g=k×k×h1×h2×n×n/g
可見,參數量和計算量均為未分組的1/g。
從前文可知,輕量化網絡基本都是在原有網絡的基礎上,利用各種方法進行修改,目的是為了減少參數量和計算量,從前面的幾種典型輕量化網絡中不難發(fā)現其構建原則。
CNN模型大的一個很重要因素就是參數較多,并且參數時間計算量大,幾乎每個參數都有乘法和加法運算??煞蛛x卷積是降低計算量的一個重要手段,利用可分離卷積,可以把卷積層運算分為兩層(一般的輕量化卷積都采用兩層)甚至更多,層數的增多可以使得參數設置上比較靈活,一般第一步采用較少量卷積與數據進行卷積運算,第二步采用1×1卷積核,把輸出結構還原成輸入結構。這就是所謂可分離卷積,實際是使用了瓶頸層的思想。
眾所周知,分組卷積可以大大減低計算量,而分組卷積中“分組”,根據應用場景,可以分為方法,具體有多分辨率卷積核分組、多尺度分組、多通道分組等。這幾種方法在不同的輕量化卷積中都有應用到,但是在使用的時候必須注意分組的參數,如多分辨率卷積核的大小,多通道分組中分組的數量等,不能一味追求減低計算量,需要在表現和性能上做一個折中。
輕量化網絡的主要任務是對于網絡的修改,但是在此以外,有一點也不能忽略,就是一些超參數的設置,在構建網絡的時候,適當地設置多一些超參數,如分組的組數,輸入、輸出、中間數據的尺寸等。這些簡單的超參數設置起來比較簡單,但是有時候能在某些方面得到意想不到的結果,如減小中間層的尺寸,可能不會影響準確率,但是計算量卻是能有效減小。
根據原有CNN的基礎上,構建新的網絡,是近年來輕量化網絡能夠蓬勃發(fā)展的一個重要方法。輕量化網絡的出現,將大而笨重的CNN從實驗室中請了出來,逐漸走到實際的應用設備的應用中。除了該方法以外,還有CNN網絡壓縮[20]、基于神經網絡架構搜索(Neural Architecture Search,NAS)[21]的自動化設計神經網絡、基于 AutoML的自動模型壓縮等一些列方法,這些方法中不泛很多簡易的方法,如自動設計方法。
但是這些方法有著效果不理想,如CNN網絡壓縮方法,有時候并不能應用在移動設備中;而自動設計方法的難度較大,較高,并不適用于大多數的研究人員。構建新網絡的方法有著門檻較低,效果較好等優(yōu)點,盡管網絡構建中有著很多不確定因素,但是得到較好結果的難度不大,因此在一定的時期內仍然具有旺盛的生命力。