為了減少神經網絡的計算消耗,論文提出Ghost模塊來構建高效的網絡結果。該模塊將原始的卷積層分成兩部分,先使用更少的卷積核來生成少量內在特征圖,然后通過簡單的線性變化操作來進一步高效地生成ghost特征圖。從實驗來看,對比其它模型,GhostNet的壓縮效果最好,且准確率保持也很不錯,論文思想十分值得參考與學習
來源:曉飛的算法工程筆記 公眾號
論文: GhostNet: More Features from Cheap Operations
Introduction
目前,神經網絡的研究趨向於移動設備上的應用,一些研究着重於模型的壓縮方法,比如剪枝,量化,知識蒸餾等,另外一些則着重於高效的網絡設計,比如MobileNet,ShuffleNet等
訓練好的網絡一般都有豐富甚至冗余的特征圖信息來保證對輸入的理解,如圖1 ResNet-50的特征圖,相似的特征圖類似於對方的ghost。冗余的特征是網絡的關鍵特性,論文認為與其避免冗余特征,不如以一種cost-efficient的方式接受,獲得很不錯的性能提升,論文主要有兩個貢獻:
- 提出能用更少參數提取更多特征的Ghost模塊,首先使用輸出很少的原始卷積操作(非卷積層操作)進行輸出,再對輸出使用一系列簡單的線性操作來生成更多的特征。這樣,不用改變其輸出的特征圖,Ghost模塊的整體的參數量和計算量就已經降低了
- 基於Ghost模塊提出GhostNet,將原始的卷積層替換為Ghost模塊
Approach
Ghost Module for More Features
對於輸入數據$X\in \mathbb{R}^{c\times h\times w}$,卷積層操作如公式1,$Y\in \mathbb{R}{h{'}\times w^{'}\times n}$為輸出的n維特征圖,$f\in \mathbb{R}^{c\times k\times k\times n}$為該層的卷積核,可得該層的計算量為$n\cdot h^{'}\cdot w^{'}\cdot c\cdot k\cdot k$,這個數值通常成千上萬,因為$n$和$c$一般都很大。公式1的參數量與輸入和輸出的特征圖數息息相關,而從圖1可以看出中間特征圖存在大量冗余,且存在相似的特征(Ghost),所以完全沒必要占用大量計算量來計算這些Ghost
假設原輸出的特征為某些內在特征進行簡單的變換得到Ghost,通常這些內在特征數量都很少,並且能通過原始卷積操作公式2獲得,$Y^{'}\in \mathbb{R}{h{'}\times w^{'}\times m}$為原始卷積輸出,$f^{'}\in \mathbb{R}^{c\times k\times k\times m}$為使用的卷積核,$m\le n$,bias直接簡化了
為了獲得原來的$n$維特征,對$Y{'}$的內在特征分別使用一系列簡單線性操作來產生$s$維ghost特征,$\Phi_{i,j}$為生成$y_i{'}$的$j$-th ghost特征圖的線性變換函數,最后的$\Phi_{i,s}$為保存內在特征的identity mapping,整體計算如圖2b
-
Difference from Existing Methods
與目前主流的卷積操作對比,Ghost模塊有以下不同點:
- 對比Mobilenet、Squeezenet和Shufflenet中大量使用$1\times 1$ pointwise卷積,Ghost模塊的原始卷積可以自定義卷積核數量
- 目前大多數方法都是先做pointwise卷積降維,再用depthwise卷積進行特征提取,而Ghost則是先做原始卷積,再用簡單的線性變換來獲取更多特征
- 目前的方法中處理每個特征圖大都使用depthwise卷積或shift操作,而Ghost模塊使用線性變換,可以有很大的多樣性
- Ghost模塊同時使用identity mapping來保持原有特征
-
Analysis on Complexities
假設Ghost模塊包含1個identity mapping和$m\cdot (s-1)=\frac{n}{s} \cdot (s-1)$個線性操作,每個線性操作的核大小為$d\times d$
理論的加速比如公式4,而理論的壓縮比如公式5,讓$d\times d$與$k\times k$相似且$s\ll c$
Building Efficient CNNs
-
Ghost Bottlenecks
Ghost Bottleneck(G-bneck)與residual block類似,主要由兩個Ghost模塊堆疊二次,第一個模塊用於增加特征維度,增大的比例稱為expansion ration,而第二個模塊則用於減少特征維度,使其與shortcut一致。G-bneck包含stride=1和stride=2版本,對於stride=2,shortcut路徑使用下采樣層,並在Ghost模塊中間插入stride=2的depthwise卷積。為了加速,Ghost模塊的原始卷積均采用pointwise卷積
-
GhostNet
基於Ghost bottleneck,GhostNet的結構如圖7所示,將MobileNetV3的bottleneck block替換成Ghost bottleneck,部分Ghost模塊加入了SE模塊
-
Width Multiplier
盡管表7的結構已經很高效,但有些場景需要對模型進行調整,可以簡單地使用$\alpha$對每層的維度進行擴縮,$\alpha$稱為width multiplier,模型大小與計算量大約為$\alpha^2$倍
Experiments
Efficiency of Ghost Module
-
Toy Experiments
論文對圖1的ghost pair進行了不同核大小的線性變化測試,將左圖作為輸出右圖作為輸入訓練depthwise卷積,然后使用訓練的結果對左圖進行變換,計算其變換后與右圖的MSE。可以看到,不同的核大小下差值都很小,說明線性變換是有效的,而且核大小的影響不大,所以用核固定為d的depthwise卷積來進行公式3計算
-
CIFAR-10
將VGG的卷積層替換成Ghost模塊進行超參數測試,表3的$s=2$,表4的$d=3$
可以看到使用Ghost模塊不僅比其它壓縮方法更能降低模型的體量,也最能保持模型准確率
對Ghost模塊產生的特征進行了可視化,盡管從內在特征線性變換而來,但還是有明顯的差異,說明線性變換足夠靈活
-
Large Models on ImageNet
在大型網絡上使用Ghost模塊,壓縮效果和准確率依然很不錯
GhostNet on Visual Benchmarks
-
ImageNet Classification
使用$k=1$, $s=2$, $d=3$的GhostNet,結果如表7,不同的模型大小使用不同的$\alpha$值進行調整,整體而言,GhostNet最輕量且准確率最高
-
Object Detection
在one-stage和two-stage檢測算法上,GhostNet能降低大部分計算量,而mAP與其它主干網絡差不多
CONCLUSION
為了減少神經網絡的計算消耗,論文提出Ghost模塊來構建高效的網絡結果。該模塊將原始的卷積層分成兩部分,先使用更少的卷積核來生成少量內在特征圖,然后通過簡單的線性變化操作來進一步高效地生成ghost特征圖。從實驗來看,對比其它模型,GhostNet的壓縮效果最好,且准確率保持也很不錯,論文思想十分值得參考與學習
如果本文對你有幫助,麻煩點個贊或在看唄~
更多內容請關注 微信公眾號【曉飛的算法工程筆記】