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