GhostNet: More Features from Cheap Operations
1. Introduction
在訓練有素的深度神經網絡的特征圖中,豐富甚至冗余的信息常常保證了對輸入數據的全面理解。例如,圖1展示了由ResNet-50生成的輸入圖像的一些特征映射,並且存在許多相似的特征映射對,就像彼此的幽靈一樣。特征圖中的冗余度是深度神經網絡成功的重要特征。我們並沒有避免冗余的特性映射,而是傾向於采用它們,但采用的是一種低成本的方式。
2. Related Work
2.1. Model Compression
網絡修剪[14,39]、低比特量化[42,26]、知識精餾[19,57]等方法的性能往往是有上限的,因為使用了預先訓練的深度神經網絡作為其基線。因此這些方法的性能通常取決於給定的預訓練模型。對基本操作和體系結構的改進將使它們走得更遠。
2.2. Compact Model Design
雖然Xception [7]、MobileNets [21] 、MobileNetV2 [44] 、MobileNetV3 [20] 、ShuffleNet [61] 和ShuffleNetV2 [40]等輕量級模型以很少的FLOPs獲得了很好的性能,但是它們特征圖之間的相關性和冗余性一直沒有得到很好的利用。
3. Approach
3.1. Ghost Module for More Features
因為在由主流CNNs網絡計算得到的中間特征映射中廣泛存在的冗余,如上圖1所示,我們建議減少需要的資源,即用來生成這些特征映射的卷積過濾器。實際上,給定輸入X∈ Rc x h x w,其中c為channels數,h和w分別為輸入的高和寬。用來生成n特征映射的任意卷積層的操作公式為:
其中* 表示卷積操作,b為bias項。Y∈ Rh' x w' x n是有着n個channels的輸出特征映射,f∈ Rc x k x k x n是該層的卷積過濾器。h' 和w'分別是輸出的高和寬,k x k是卷積過濾器f的內核大小。在該卷積操作中,需要的FLOPs數為n*h'*w'*c*k*k,該值通常很大,因為過濾器數量n和channel數量c一般很大(如256和512)
根據公式1,需要優化的參數數量(f和b)由輸入和輸出特征圖的維數明確確定。如圖1所示,卷積層的輸出特征映射通常包含大量冗余,其中一些可能彼此相似。我們指出沒有必要用大量的FLOPs和參數一個一個地生成這些冗余的特征圖。假設輸出的特性映射是一些帶有一些cheap轉換的內在特性映射的“幽靈”。這些固有的特征圖通常較小,由普通的卷積過濾器產生。
具體來說,m channels的內在特征映射Y'∈ Rh' x w' x m是使用一個基本卷積操作生成的:
f'∈ Rc x k x k x m是使用的過濾器,m<=n且為了簡化將bias項省略。超參數如過濾器size、stride和padding和在等式1中的常見卷積操作相同,用來保持輸出特征映射空間大小(即h' 和w')的一致性。為了進一步獲得想要的n channels的特征映射,我們提出在Y'中的每個內在特征中應用一系列的cheap線性操作來生成s個ghost特征,如下函數所示:
yi′表示在Y'中的第i個內在特征映射,在上式中Φi,j是用於生成第j個ghost特征映射yij的第j個線性操作,也就是說yi′可以有一個甚至多個ghost特征映射{yij}sj=1。最后一個Φi,s是用來保存如圖2(b)所示的內在特征映射的identity映射。
通過使用等式3,我們能夠獲得n = m*s channels的特征映射,Y = [y11,y12,··· ,yms]即如圖2(b)所示的一個Ghost模塊的輸出數據。注意,線性操作Φ操作在每個通道的計算成本遠小於普通的卷積。在實際應用中,在一個Ghost模塊中可能會有幾種不同的線性運算,例如3×3和5×5的線性內核,這些將在實驗部分進行分析。
Difference from Existing Methods.提出的Ghost模塊與現有的高效卷積方案有很大的不同。
i)與[21,61]中廣泛使用1×1 pointwise卷積的單元相比,Ghost模塊中的主卷積可以定制內核大小。
ii)現有的方法[21,44,61,40]采用 pointwise卷積跨通道處理特征,然后采用depthwise卷積處理空間信息。相比之下,Ghost模塊采用普通卷積先生成少量的內在特征圖,然后利用cheap的線性運算來擴充特征,增加channels。
iii)在以往的高效架構中[21,61,53,28],處理每個特征映射的操作僅限於depthwise卷積或shift操作,而Ghost模塊中的線性操作可以有較大的多樣性。
iv)另外,在Ghost模塊中,將identity映射與線性變換並行進行,保持內在特征映射。
Analysis on Complexities.由於我們可以利用等式3中提出的Ghost模塊生成與普通卷積層相同數量的特征映射,因此我們可以很容易地將Ghost模塊集成到現有設計良好的神經結構中,從而降低計算成本。在這里,我們進一步分析了使用Ghost模塊在內存使用和理論上的加速方面的好處。比如這里有一個identity映射和m*(s-1)=(n/s)*(s-1)個線性操作,每個線性操作的平均內核大小為d x d。理想情況下,n*(s-1)個線性操作能有不同形狀和參數,但是線下推斷將會受到阻礙,尤其是考慮到CPU或GPU cards的使用。因此為了高效實現,我們建議在一個Ghost模塊中使用相同大小的線性操作(如3x3、5x5)。Ghost模塊升級普通卷積的理論加速比為:
其中dxd與kxk有着相同的量級,且s<<c。
同樣地,壓縮比計算為:
可見通過使用提出的Ghost模型,其結果於加速比是等價的
這樣子的計算方法的理解為:
因為原本通過一次卷積運算得到的輸出有着很多相似的特征映射對,那么使用Ghost方法就是將其變為兩個步驟來得到同樣的有着很多相似特征映射對的輸出。
首先一開始進行的小的卷積映射得到的Y'是m個沒有重復的特征映射結果哦,之后再進行的每個特征映射的線形操作就是為每個特征映射生成(s-1)個相似的特征映射。
這樣就能夠以一個更快、FLOPs更少的方法得到和原來的卷積運算相同的有着相似特征映射對的最終的n個channels的特征映射輸出
3.2. Building Efficient CNNs
Ghost Bottlenecks. 利用Ghost模塊的優點,我們介紹了專門為小型CNNs設計的Ghost bottleneck(G-bneck)。如圖3所示:
Ghost bottleneck看起來類似於ResNet[16]中的基本residual塊,其中集成了幾個卷積層和shortcut。提出的ghost bottleneck主要由兩個堆疊的ghost模塊組成。第一個Ghost模塊作為擴展層,增加通道的數量。我們把輸出通道數與輸入通道數之比稱為擴展比(expansion ratio)。第二個Ghost模塊減少通道的數量以匹配shortcut。然后將這兩個Ghost模塊的輸入和輸出連接起來。除了根據MobileNetV2[44]的建議在第二個Ghost模塊之后不使用ReLU外,每一層之后都使用batch歸一化(BN)[25]和ReLU非線性函數。
上面描述的Ghost bottleneck是stride=1的情況。對於stride=2的情況,通過向下采樣層實現shortcut路徑,並在兩個Ghost模塊之間插入stride=2的depthwise卷積。在實際應用中,Ghost模塊中主要的卷積是pointwise卷積,以提高其效率。(即stride=1的情況是不改變輸出的寬高,只改變channels數;stride=2是不改變channels數,只下采樣一倍寬高)
GhostNet.基於ghost bottleneck,我們建議使用如表1所示的GhostNet:
我們基本上遵循了MobileNetV3[20]架構的優勢,用我們的Ghost bottleneck代替了MobileNetV3中的bottleneck塊。GhostNet主要由一組Ghost bottleneck組成,Ghost模塊作為構建塊。第一層是標准的卷積層,有16個filter,然后是一系列的Ghost bottleneck,通道逐漸增加。這些Ghost bottleneck根據其輸入特征圖的大小被分組到不同的階段。所有的Ghost bottleneck都使用stride=1,除了最后一個階段使用stride=2。最后利用全局平均池化層和卷積層將特征映射轉化為一個1280維的特征向量進行最終分類。squeeze and excite(SE)模塊[22]也適用於某些ghost bottleneck的殘層,如表7所示。
與MobileNetV3相比,我們沒有使用hard-swish非線性函數,因為它有很大的延遲。所提出的體系結構提供了一個基本的設計參考,但進一步的超參數調整或基於ghost模塊的自動體系結構搜索將進一步提高系統的性能。
Width Multiplier. 盡管表7中的給定架構已經可以提供低延遲和保證精度,但在某些場景中,我們可能需要更小、更快的模型或更高的特定任務的精度。為了期望的需求可以定制網絡,我們可以簡單地在每一層channels的數量上均勻地乘以一個系數α。這個因子α稱為寬度乘數,因為它可以改變整個網絡的寬度。我們表示帶有寬度乘數α的GhostNet為GhostNet-α×。寬度乘數可以控制模型大小和計算成本大約α2。通常小α導致更低的延遲和更低的性能,反之亦然。
4. Experiments
4.1. Efficiency of Ghost Module
4.1.1 Toy Experiments.
我們在圖1中展示了一個圖表,指出存在一些類似的特征映射對,它們可以使用一些有效的線性操作來有效地生成。在這里,我們首先進行一個toy實驗來觀察原始特征圖和生成的Ghost特征圖之間的重構誤差。以圖1中的三對(即紅色、綠色和藍色)為例,使用ResNet-50[16]的第一個residual塊提取特征。在左邊的特征作為輸入,另一個作為輸出,我們利用一個小depthwise卷積過濾器學習映射,即它們之間的線性操作Φ。卷積濾波器d的大小范圍為1 ~ 7,不同d對的MSE(均方誤差)值如表2所示:
從表2可以看出,所有的MSE值都非常小,這說明在深度神經網絡中,特征映射之間存在很強的相關性,這些冗余特征可以由多個固有的特征生成。除了上述實驗中用到的卷積,我們還可以探索其他一些低成本的線性操作來構造Ghost模塊,如仿射變換(affine)和小波變換(wavelet)。然而,卷積是一種高效的運算,已經得到了當前硬件的良好支持,它可以涵蓋許多廣泛使用的線性運算,如平滑、模糊、運動等。此外,雖然我們也可以學習關於Φ線性操作中每個過濾器的大小 ,不規則的模塊將降低計算單元的效率(例如CPU和GPU)。因此,在接下來的實驗中,我們建議讓Ghost模塊中的d為一個固定值,利用深度卷積實現等式3,構建高效的深度神經網絡。
Analysis on Hyper-parameters. 如等式3所述,為高效的深度神經網絡提出的Ghost模塊有兩個超參數,即s和d,s用於生成m = n / s個內在特征映射,d即用於計算ghost特征圖的線性操作的內核大小d×d(即depthwise卷積過濾器的大小)。在VGG-16架構上測試了這兩個參數的影響。
首先,我們固定s = 2並調節d為{1,3,5,7}中之一,並在表3中列出了CIFAR-10驗證集的結果:
我們可以看到,提出的d = 3的Ghost模塊比d值較小或較大的Ghost模塊性能更好。這是因為尺寸為1×1的kernel不能在特征映射上引入空間信息,而尺寸較大的kernel如d = 5或d = 7會導致過擬合和增加計算量。因此,我們在接下來的實驗中采用d = 3來進行有效性和效率的檢驗。
在研究了所提議的Ghost模塊中使用的內核大小之后,我們保持d = 3,並在{2,3,4,5}范圍內調優其他超參數s。事實上,s與得到的網絡的計算代價直接相關,即如等式5和等式4所分析的,s越大,壓縮比和加速比越大。從表4的結果可以看出,當我們增加s的時候,FLOPs明顯減小,准確率逐漸降低,這是可以預料到的。特別是當s = 2時,也就是將VGG-16壓縮2倍,我們的方法比原模型的性能稍好一些,說明了所提出的Ghost模塊的優越性。
Comparison with State-of-the-arts.
上圖為比較的結果
Visualization of Feature Maps. 我們還可視化了ghost模塊的功能圖,如圖4所示:
雖然生成的特征映射來自於主要的特征映射,但是它們確實有顯著的差異,這意味着生成的特征足夠靈活,可以滿足特定任務的需要。
4.1.3 Large Models on ImageNet
將其用到更大規模的網絡中的對比結果:
4.2. GhostNet on Visual Benchmarks
用於分類中的對比:
Actual Inference Speed.
在目標檢測任務中的對比: