深度學習-卷積神經網絡發展

1. LeNet(1998)

在這裏插入圖片描述

  1. 首次提出卷積神經網絡,定義基本框架:卷積+池化+全連接
  2. 定義卷積層:局部連接(引入感受野),參數共享
  3. 池化進行下采樣,減少計算量
  4. 使用Tanh爲激活函數(tanh原點對稱,比sigmoid收斂快(原因))
  5. 關於全連接層,直接將特徵圖(Featuremap)展開輸入到全連接層,會導致 CNN 僅適用於指定尺度的圖像上。LeCun 認爲 CNN 應該儘可能適用與各種尺度的圖像上,這一點也得到許多人的認同。對於分類(Classification)問題,利用全局平均池化(Global Average Pooling, GAP)操作代替特徵圖的拉伸,這樣 CNN 便可以處理各種尺度的圖像了。
    一般來說,卷積和池化的核大小相等
    卷積計算:Sizeout=(SizeinKernel+2Padding)/Stride+1Size_{out}=(Size_{in}-Kernel+2*Padding)/Stride+1
    池化計算:Sizeout=(SizeKernel)/Stride+1Size_{out}=(Size-Kernel)/Stride+1

2. AlexNet(2012)

在這裏插入圖片描述

  1. 採用雙GPU網路結構,從而可以設計出更“大”、更“深”的網絡(相較於當時的算力來說)

  2. 採用 ReLU 代替 Tanh,稍微解決梯度消失問題(Gradient Vanishing Problem),加快網絡收斂速度。(激活函數比較

  3. 提出局部相應歸一化(LRN, Local Response Normalization),據作者所言,該操作能減少指標 Top-1/Top-5 Error Rate 1.4%/1.2%。(關於 Normalization 的發展歷程

  4. 令 Pooling 操作中的 stride 小於池化核的大小,從而使相鄰的池化區域存在重疊部分,這一操作稱爲 Overlapping Pooling。據作者所言,這一操作能減少指標 Top-1/Top-5 Error Rate 0.4%/0.3%,並且減少過擬合現象。

  5. 對訓練數據進行隨機裁剪(Random Crop),將訓練圖像由 256 × 256 裁剪爲 224 × 224,並做隨機的鏡像翻轉(Horizontal Reflection)。並在測試時,從圖像的四個角以及中心進行裁剪,並進行鏡像翻轉,這樣可以得到 10 個 Patch,將這些 Patch 的結果進行平均,從而得到最終預測結果。(類似於Bagging)

  6. 對訓練圖像做 PCA(主成分分析),利用服從 (0,0.1) 的高斯分佈的隨機變量對主成分進行擾動。作者指出,這一操作能減少指標 Top-1 Error Rate 1%。

  7. 利用 Dropout 避免網絡過擬合。

3. VGG(2014)

包括:VGG-11/VGG-13/VGG-16/VGG-19
在這裏插入圖片描述

3.1 網絡結構

  1. VGG 其實跟 AlexNet 有一定的相似之處,都是由五個卷積層與激活函數疊加的部分和三個全連接層組成,但是不同的是,VGG加“深”了前面由五個卷積層與激活函數疊加的部分,使得每部分並不是一個卷積層加一個激活函數組成,而是多個這樣的組合組成一部分(有人習慣稱這個爲 Conv Layer Group),每個部分之間進行池化操作。
  2. 此外,VGG 與當時其他卷積神經網絡不同,不採用感受野大的卷積核(如:7 × 7,5 × 5),反而採用感受野小的卷積核(3 × 3)。關於這樣做的好處,作者指出有如下兩點:減少網絡參數量;由於參數量被大幅減小,於是可以用多個感受野小的卷積層替換掉之前一個感受野大的卷積層,從而增加網絡的非線性表達能力
  3. 從 VGG-16 開始,VGG 引進卷積核大小爲 1 × 1 的卷積層,使得在不影響特徵圖大小的情況下,增加網絡的非線性表達能力。

3.2 其他細節

  1. 作者提到曾使用局部響應歸一化(LRN),但是並沒有任何效果提升,反而還使得內存使用和計算時間增加。
  2. 在訓練過程中,作者爲避免隨機初始化對訓練帶來負面影響,使用預訓練模型,於是利用小的網絡參數初始化大的網絡參數(比如用以訓練好的 VGG-11 去初始化部分 VGG-13 的網絡參數)。
  3. 對訓練圖像進行預處理時,先做寬高等比縮放(原文用的詞是 isotropically rescaled,即同質化縮放),使其最短邊長度達到 S,接着再做隨機裁剪。其中,關於 S 的設置,作者提出了兩種訓練方案:Single-Scale Training,Multi-Scale Training。

4. Inception Net(2014)

4.1 Inception V1(GoogLeNet)

在這裏插入圖片描述

  1. 與 VGG 不同,Inception 結構雖然也傾向於加“深”網絡結構,從而提高模型的表達能力,並且拋棄全連接層(雖然 GoogLeNet 最後加了一層全連接層,但這是作者爲了其他人能更方便的利用模型進行微調(Finetune)
  2. 作者在文中指出,提高模型表達能力的最直接的辦法就是增加模型的“大小”,而這又會導致兩個問題的產生:模型越大,其網絡參數也就越大,就越容易產生過擬合現象,所以就需要更大的數據集,然而大型數據集的構建成本是很高昂的;模型越大,對於計算資源的需求就越大,這在現實任務中是難以接受的。而作者認爲解決這兩個問題的基本方法是將全連接層,甚至是卷積層改爲稀疏的網絡結構
  3. 作者所設計的 Inception Module 與常見的網絡結構不同,打破了常規的卷積層串聯的設計思路,選擇將卷積核大小爲 1 × 1,3 × 3,5 × 5 的卷積層和池化核大小爲 3 × 3 的池化層進行並聯,並將各自所得到的特徵圖進行 Concatenate 操作合併在一起,作爲後續的輸入。
    在這裏插入圖片描述
  4. 之所以 Inception Module 由上圖左側發展被改進爲上圖右側,是因爲:作者希望模型中深層的 Inception Module 可以捕捉到 Higher Abstraction,所以作者認爲深層的 Inception Module中的卷積層的空間集中度應該逐漸降低,以此捕捉更大面積的特徵。故,作者令越深層的 Inception Module 中,卷積核大小爲 3 × 3 和 5 × 5 這兩個卷積層的輸出通道數佔比越多。但這又將導致計算量增加,所以爲了解決這個問題,作者在原有 Inception Module 的基礎上,利用卷積核大小爲 1 × 1 的卷積層進行降維操作,從而減小計算量(這建立在一個假設之上:即使是低維的映射也可能包含關於相關圖像區域的大量信息)。
    在這裏插入圖片描述
  5. 由於 Inception Module 保持了輸入輸出的尺寸一致,故 GoogLeNet 可以由 Inception Module 進行模塊化搭建。仔細觀察 GoogLeNet 的結構,你會發現作者在 Inception Module (4a) 和 (4d) 設置了額外的輔助 Loss,用以增加向後傳導的梯度,緩解梯度消失問題,同時增加額外的正則化操作。在文章中,作者指出這樣操作的目的主要是使得模型中低層的特徵也具備很好的區分能力。(文章中,這兩個額外的 Loss 會乘上衰減係數 0.3,與最後的 Loss 相加,作爲整個模型的 Loss)

4.2 Inception V2(2015)

2015 年,谷歌提出了 Batch Normalization 操作,將其添加在之前的 GoogLeNet,並修改了一定的結構與實驗設置,得到了 Inception Net V2
在這裏插入圖片描述
在這裏插入圖片描述

  1. 將 Inception Module 中卷積核大小爲 5 × 5 的卷積層用兩個相連的卷積核大小爲 3 × 3 的卷積層進行替換。作者指出,這一操作是的模型參數增加了 25%,計算成本提高了 30%。
  2. 將輸出大小爲 28 × 28 的 Inception Module 的個數由兩個提升到三個,即增加 Inception Module (3c)。
  3. 在 Inception Module 中進行池化操作(有時爲平均池化(Average Pooling),有時爲最大池化(Max Pooling))
  4. 兩個 Inception Module 之間不再進行池化操作,僅在 Inception Module (3c) 和 (4e) 前添加 stride-2 conv/pooling layer。
  5. 將網絡第一層的卷積層替換爲深度乘子爲 8 的可分離卷積(參考卷積神經網絡中的Separable ConvolutionCNN中千奇百怪的卷積方式大彙總
  6. 作者在文中指出,他們並不是直接簡單的將 BN 添加到網絡中的,還做了如下的改動:增大學習率,移除 Dropout,減小 L2 正則化項,加速學習率衰減,移除 LRN,更徹底的打亂訓練數據,減少光學畸變數據增強

4.3 Inception V3(2015)

在這裏插入圖片描述
論文中,作者首先四條設計神經網絡的原則,接着提出如何分解大卷積核的卷積層,接着反思輔助分類器(Auxiliary Classifier)的作用,接着按照自己所提的第一條原則對常見的 Size Reduction 做了改進,最後將以上改進添加進之前的網絡結構中。

4.3.1 關於四條設計神經網絡的原則

  1. Avoid representational bottlenecks, especially early in the network.
  2. Higher dimensional representations are easier to process locally within a network.
  3. Spatial aggregation can be done over lower dimensional embeddings without much or any loss in representational power.
  4. Balance the width and depth of the network.

4.3.2 關於如何分解大卷積核的卷積層

  1. 利用連續的兩層小卷積核的卷積層代替大卷積核的卷積層(添加在卷積層後的激活函數都爲 ReLU 比 Linear+ReLU 好)
  2. 利用連續的兩層非對稱的卷積層(卷積核大小爲 n × 1 和 1 × n)代替原有卷積層(卷積核大小爲 n × n)(最好在模型的中間層使用(適用的FeatureMap大小範圍爲 12~20))
  3. 在這裏插入圖片描述
    在這裏插入圖片描述

4.3.3 關於輔助分類器的作用

GoogLeNet 曾在 Inception Module (4a) 和 (4d) 設置了額外的輔助 Loss,即設置了輔助分類器,當時作者對其的理解是:使梯度更好的回傳到低層,避免梯度消失問題,提高模型的收斂速度與最終表現。

但是作者通過實驗發現:在訓練初期,有無輔助分類器並無區別;在訓練後期,有輔助分類器將提高模型的最終表現;此外,作者去掉 GoogLeNet 中較低的輔助分類器的分支,發現此舉並不會導致模型性能有明顯的降低。最後,作者認爲:輔助分類器起到的作用更像是正則化。

4.3.4 關於如何有效減少特徵圖尺寸

  1. 在分類任務中,許多模型都會隨着深度的整長不斷通過池化操作縮小特徵圖尺寸,以此減小模型的“體積”。由於池化操作會導致特徵圖中的許多信息丟失,許多模型都習慣在特徵圖的寬與高縮小一半的同時,利用卷積核爲 1 × 1 的卷積層使得特徵圖的通道數量翻倍(即 C × W × H -> 2C × W/2 × H/2),以此減少池化操作所帶來的信息丟失
  2. 這樣操作有兩種選擇:先進行升維操作,再進行池化操作;先進行池化操作,再進行升維操作。作者指出,根據原則一,我們應先進行升維操作,再進行池化操作。
  3. 當然,這樣做會導致計算量增加,於是作者提出了另一種做法,如下圖所示:
  4. 在這裏插入圖片描述

4.4 Inception Net V4(2016)

在這裏插入圖片描述
在 Inception-v4 中,作者將 Inception 和 ResNet 結合在一起,推出了 Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4。其中,Inception-v4 的總體結構如上圖所示,各個模塊細節如下圖所示。
在這裏插入圖片描述
可以看得出來,Inception-v4 的結構設計非常複雜,需要大量的實驗驗證以及工程經驗,一般只有大廠纔有能力做這樣的工作,這也是爲什麼最近 NAS 這麼火的原因吧。

4.5 Xception(2016)

論文中,Google 利用 深度可分離卷積對 Inception V3 進行了改進,並結合 Residual Connection 設計了新的網絡。
作者在文章開頭便指出 Inception Module 背後的思路是通過一系列操作使得模型的學習更加簡單有效(分別單獨學習通道之間的關係和空間關係),這意味着 Inception Module 假設通道之間的關係和空間關係是可以被分離開的(這個假設的一個變體就是 width-wise correlation and height-wise correlation,即 Inception V3 裏的卷積核大小爲 7×1 和 1×7 的卷積層)。接着,作者由 Inception V3 中的 Inception Module 進行演變,得到極端版本的 Inception Module,與 Depthwise Separable Convulotion 思路一致,如下圖所示:
在這裏插入圖片描述
在這裏插入圖片描述
作者指出 “extreme” version of Inception Module 與 Depthwise Separable Convolution 主要存在兩點不同:

  1. Depthwise Convolution 和 Pointwise Convolution 的順序不同。不過,作者認爲這一點並不重要。
  2. 在 Inception Module 中,Depthwise Convolution 和 Pointwise Convolution 後都會接着 ReLU;而 Depthwise Separable Convolution 一般僅在 Pointwise Convolution 後接着 ReLU。作者認爲這一點差異比較重要,並在後續的實驗中進行了討論(後面發現在 Pointwise Convolution 後接 ReLU/ELU,都不如中間不添加激活函數的表現效果)。
  3. 最後,作者提出了新的網絡:Xception(結合了 Inception Module, Residual Connection, Depthwise Seperable Convolution),網絡結構如下所示:在這裏插入圖片描述

5. ResNet(2015)

在這裏插入圖片描述

5.1 殘差結構

2015 年,Kaiming He 提出了 ResNet(拿到了 2016 年 CVPR Best Paper Award),不僅解決了神經網絡中的退化問題(Degrade Problem,即相較於淺層神經網絡,深層神經網絡的深度到達一定深度後,擬合能力反而更差,訓練/測試誤差更高),還在同年的 ILSVRC 和 COCO 競賽橫掃競爭對手,分別拿下分類、定位、檢測、分割任務的第一名。(個人覺得,ResNet真的屬於現象級論文,所提出的殘差結構大幅提高了神經網絡的擬合能力)

  1. 提出了殘差結構(Residual Block,如上圖左側所示),使得原本所要擬合的函數 H(x)H(x),改爲 F(x)F(x) ,其中, H(x)=F(x)+xH(x)=F(x)+x 。雖然在“多個非線性層可以擬合任意函數”這一假設下二者並無區別,但是 Kaiming 假設模型學習後者,將更容易進行優化與收斂。(在殘差結構中,模型利用 Shortcut 進行 Identity Mapping,這樣也解決了梯度消失現象)
  2. 由於 Residual Block 並不需要額外的參數以及計算量,Kaiming 在文中以此做了多組對照實驗,證明該網絡結構的有效性(所用的兩個 ResNet 爲 ResNet-18 和 ResNet-34)。但是,若要將模型的深度繼續不斷增加,需要對其進行改進:將原先的 Residual Block(上圖右側所示,也被稱作 Basic Block) 改進爲 Bottleneck Block,減少模型的參數與計算量。
  3. 對訓練數據進行數據增強:從 [256,480] 隨機採樣,作爲圖像最短邊長度,進行寬高等比縮放;隨機裁剪 224 * 224,並進行隨機鏡像翻轉;並對所有訓練圖像的每個像素值進行統計,並減去該平均值。
  4. 對測試數據使用 10-crop 測試方法。
  5. ResNet 在非線性層後,激活函數前使用 Batch Normalization。
    在這裏插入圖片描述

5.2 關於 Residual Network 中 Identity Mapping 的討論

在這裏插入圖片描述
論文中對 ResNet 中的 Identity Mapping 進行了詳細的討論(前向傳導、後向傳導的分析),並且設計並嘗試了多種不同的 Shortcut Connection 設計(如上圖所示),並在最後對激活函數做了討論,從而提出了新的 Residual Block(爲與原版結構區分,Kaiming 稱其爲 full pre-activateion Residual Block)。

移除了 Short Connection 中的 ReLU,並將 Residual Mapping 中的 BN 和 ReLU 提前至對應的神經網絡層前。

6. DenseNet(2016)

在這裏插入圖片描述
DenseNet 即沒從網絡的深度入手,也沒從網絡的寬度入手,而是對每層的 FeatureMap 進行特徵複用,以此緩解梯度消失問題,加強網絡中特徵的傳遞,有效對特徵進行復用,並在提高網絡的表現效果的同時減少了網絡的參數量

在 Dense Block 中,每層卷積層的輸入爲在該 Block 中之前所有卷積層所輸出的 FeatureMap 的 concation 結果 (此處與 ResNet 不同,ResNet 中將結果進行 add )。作者在文中指出,ResNet 成功的關鍵點在於:‘they create short paths from early layers to later laters’;作者認爲自己之所以提出的 Dense Block 這樣的結果,就是爲了保證層與層之間的信息能最大程度的保存。

6.1 網絡結構

  1. DenseNet 與其他 CNN 類似,同樣保留着 down-sampling layers 的設計,網絡中包含四個 Dense Block 和四個 Transition Layer,分別處理不同 Size 的 FeatureMap / 對 FeatureMap 進行 Pooling 操作。
  2. 根據 Identity Mappings in Deep Residual Networks,作者在 Dense Block 中將 BN 和 ReLU 設置在卷積層前面。由於 Dense Block 的特徵複用操作,越後面的卷積層,其輸入的 Channel 越大。故作者在 DenseNet 中引用了 Bottleneck Layer,即:BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3),以此避免計算量的快速增長。(文中記使用 Bottleneck Layer 的 DesnseNet 爲 DenseNet-B)
  3. 作者還嘗試在 Transition Layer 中對 FeatureMap 的 Channel 數量進行縮減,設輸入的 FeatureMap 的 Channel 數爲mmθ\theta 爲壓縮因子,則輸出的 FeatureMap 的 Channel 數爲 θm\theta m。(實驗中,作者設置θ=0.5\theta=0.5;,並記使用 Bottleneck Layer 以及設置 Transition Layer 的θ<1\theta< 1的 DesnseNet 爲 DenseNet-BC)
  4. 爲保持特徵複用的實現(即同意 DenseNet 中的所有 FeatureMap 大小一致),作者令 Dense Block 中的卷積層的卷積核大小爲 3 × 3,padding 爲 1,且採用 zero-padding。

在這裏插入圖片描述

7. MobileNet(2017)

7.1 MobileNet V1(2017)

MobileNetV1就是把VGG中的標準卷積層換成深度可分離卷積就可以了。
可分離卷積分爲:空間可分離卷積和深度可分離卷積。
空間可分離:將一個大的卷積核變成兩個小的卷積核,比如將一個3×3的核分成一個3×1和一個1×3的核。

7.1.1 深度可分離卷積

在這裏插入圖片描述

  1. 標準卷積:
    在這裏插入圖片描述
    輸入一個12×12×3的一個輸入特徵圖,經過5×5×3的卷積核卷積得到一個8×8×1的輸出特徵圖。如果此時我們有256個特徵圖,我們將會得到一個8×8×256的輸出特徵圖。
  2. 深度卷積:
    在這裏插入圖片描述
    與標準卷積網絡不一樣的是,我們將卷積核拆分成爲但單通道形式,在不改變輸入特徵圖像的深度的情況下,對每一通道進行卷積操作,這樣就得到了和輸入特徵圖通道數一致的輸出特徵圖。如上圖:輸入12×12×3的特徵圖,經過5×5×1×3的深度卷積之後,得到了8×8×3的輸出特徵圖。輸入個輸出的維度是不變的3。這樣就會有一個問題,通道數太少,特徵圖的維度太少,能獲取到足夠的有效信息嗎
  3. 逐點卷積:逐點卷積就是1×1卷積。主要作用就是對特徵圖進行升維和降維,如下圖: 在這裏插入圖片描述
    在深度卷積的過程中,我們得到了8×8×3的輸出特徵圖,我們用256個1×1×3的卷積覈對輸入特徵圖進行卷積操作,輸出的特徵圖和標準的卷積操作一樣都是8×8×256了。
  4. 標準卷積與深度可分離卷積的過程對比:
    在這裏插入圖片描述
  5. 參數量和計算量:. 在這裏插入圖片描述

7.1.2 MobileNet v1卷積層

在這裏插入圖片描述

  1. 上圖左邊是標準卷積層,右邊是V1的卷積層,虛線處是不相同點。V1的卷積層,首先使用3×3的深度卷積提取特徵,接着是一個BN層,隨後是一個ReLU層,在之後就會逐點卷積,最後就是BN和ReLU了。這也很符合深度可分離卷積,將左邊的標準卷積拆分成右邊的一個深度卷積和一個逐點卷積
  2. 左邊是普通的ReLU,對於大於0的值不進行處理,右邊是ReLU6,當輸入的值大於6的時候,返回6,relu6“具有一個邊界”。作者認爲ReLU6作爲非線性激活函數,在低精度計算下具有更強的魯棒性。(這裏所說的“低精度”,我看到有人說不是指的float16,而是指的定點運算(fixed-point arithmetic))在這裏插入圖片描述

7.1.3 V1 網絡結構

在這裏插入圖片描述
MobileNet的網絡結構如上圖所示。首先是一個3x3的標準卷積,s2進行下采樣。然後就是堆積深度可分離卷積,並且其中的部分深度卷積會利用s2進行下采樣。然後採用平均池化層將feature變成1x1,根據預測類別大小加上全連接層,最後是一個softmax層。整個網絡有28層,其中深度卷積層有13層。

7.1.4 缺點

有人在實際使用的時候, 發現深度卷積部分的卷積核比較容易訓廢掉:訓完之後發現深度卷積訓出來的卷積核有不少是空的
在這裏插入圖片描述

7.2 MobileNet V2(2018)

解決V1的遺留問題,ReLU

7.2.1 ReLU做了些啥

這是將低維流形的ReLU變換embedded到高維空間中的的例子,就是對一個n維空間中的一個“東西”做ReLU運算,然後(利用T的逆矩陣T-1恢復)對比ReLU之後的結果與Input的結果相差有多大。
在這裏插入圖片描述
當n = 2,3時,與Input相比有很大一部分的信息已經丟失了。而當n = 15到30,還是有相當多的地方被保留了下來。

也就是說,對低維度做ReLU運算,很容易造成信息的丟失。而在高維度進行ReLU運算的話,信息的丟失則會很少。

這就解釋了爲什麼深度卷積的卷積核有不少是空。發現了問題,我們就能更好地解決問題。針對這個問題,可以這樣解決:既然是ReLU導致的信息損耗,將ReLU替換成線性激活函數

7.2.2 Linear bottleneck

我們當然不能把所有的激活層都換成線性的啊,所以我們就把最後的那個ReLU6換成Linear。
在這裏插入圖片描述

7.2.3 Expansion layer

現在還有個問題是,深度卷積本身沒有改變通道的能力,來的是多少通道輸出就是多少通道。如果來的通道很少的話,DW深度卷積只能在低維度上工作,這樣效果並不會很好,所以我們要“擴張”通道。既然我們已經知道PW逐點卷積也就是1×1卷積可以用來升維和降維,那就可以在DW深度卷積之前使用PW卷積進行升維(升維倍數爲t,t=6),再在一個更高維的空間中進行卷積操作來提取特徵:
在這裏插入圖片描述
也就是說,不管輸入通道數是多少,經過第一個PW逐點卷積升維之後,深度卷積都是在相對的更高6倍維度上進行工作。
在這裏插入圖片描述

7.2.4 Inverted residuals

  1. 回顧V1的網絡結構,我們發現V1很像是一個直筒型的VGG網絡。我們想像Resnet一樣複用我們的特徵,所以我們引入了shortcut結構,這樣V2的block就是如下圖形式:
    在這裏插入圖片描述
  2. ResNet和V2:可以發現,都採用了 1×1 -> 3 ×3 -> 1 × 1 的模式,以及都使用Shortcut結構。但是不同點呢?ResNet 先降維 (0.25倍)、卷積、再升維。MobileNetV2 則是 先升維 (6倍)、卷積、再降維。

在這裏插入圖片描述

7.2.5 V2的block

在這裏插入圖片描述

  1. V1 vs V2
    在這裏插入圖片描述
    左邊是v1的block,沒有Shortcut並且帶最後的ReLU6。
    右邊是v2的加入了1×1升維,引入Shortcut並且去掉了最後的ReLU,改爲Linear。步長爲1時,先進行1×1卷積升維,再進行深度卷積提取特徵,再通過Linear的逐點卷積降維。將input與output相加,形成殘差結構。步長爲2時,因爲input與output的尺寸不符,因此不添加shortcut結構,其餘均一致。
  2. 然V2的層數比V1的要多很多,但是FLOPs,參數以及CPU耗時都是比V1要好的。在這裏插入圖片描述

7.2.6 V2網絡結構

在這裏插入圖片描述

7.3 MobileNet V3(2019)

MobileNetV3,是谷歌在2019年3月21日提出的網絡架構。首先,引入眼簾的是這篇文章的標題,“searching”一詞就把V3的論文的核心觀點展示了出來——用神經結構搜索(NAS)來完成V3。

7.3.1 MobileNetV3的相關技術

1.網絡的架構基於NAS實現的MnasNet(效果比MobileNetV2好)
1.引入MobileNetV1的深度可分離卷積
2.引入MobileNetV2的具有線性瓶頸的倒殘差結構
3.引入基於squeeze and excitation結構的輕量級注意力模型(SE)
4.使用了一種新的激活函數h-swish(x)
5.網絡結構搜索中,結合兩種技術:資源受限的NAS(platform-aware NAS)與NetAdapt
6.修改了MobileNetV2網絡端部最後階段

7.3.2 激活函數h-swish

  1. swish激活函數
    在這裏插入圖片描述
    swish論文的作者認爲,Swish具備無上界有下界、平滑、非單調的特性。並且Swish在深層模型上的效果優於ReLU。僅僅使用Swish單元替換ReLU就能把MobileNet,NASNetA在 ImageNet上的top-1分類準確率提高0.9%,Inception-ResNet-v的分類準確率提高0.6%。
    V3也利用swish當作爲ReLU的替代時,它可以顯著提高神經網絡的精度。但是呢,作者認爲這種非線性激活函數雖然提高了精度,但在嵌入式環境中,是有不少的成本的。原因就是在移動設備上計算sigmoid函數是非常明智的選擇。所以提出了h-swish
  2. h-swish:可以用一個近似函數來逼急這個swish,讓swish變得硬(hard)。作者選擇的是基於ReLU6,作者認爲幾乎所有的軟件和硬件框架上都可以使用ReLU6的優化實現。其次,它能在特定模式下消除了由於近似sigmoid的不同實現而帶來的潛在的數值精度損失。 在這裏插入圖片描述
    在這裏插入圖片描述
    我們可以簡單的認爲,hard形式是soft形式的低精度化。作者認爲swish的表現和其他非線性相比,能夠將過濾器的數量減少到16個的同時保持與使用ReLU或swish的32個過濾器相同的精度,這節省了3毫秒的時間和1000萬MAdds的計算量。
    並且同時,作者認爲隨着網絡的深入,應用非線性激活函數的成本會降低,能夠更好的減少參數量。作者發現swish的大多數好處都是通過在更深的層中使用它們實現的。因此,在V3的架構中,只在模型的後半部分使用h-swish(HS)

7.3.3 網絡結構搜索NAS

主要結合兩種技術:資源受限的NAS(platform-aware NAS)與NetAdapt
資源受限的NAS,用於在計算和參數量受限的前提下搜索網絡來優化各個塊(block),所以稱之爲模塊級搜索(Block-wise Search) 。

NetAdapt,用於對各個模塊確定之後網絡層的微調每一層的卷積核數量,所以稱之爲層級搜索(Layer-wise Search)。

一旦通過體系結構搜索找到模型,我們就會發現最後一些層以及一些早期層計算代價比較高昂。於是作者決定對這些架構進行一些修改,以減少這些慢層(slow layers)的延遲,同時保持準確性。這些修改顯然超出了當前搜索的範圍。

7.3.4 對V2最後階段的修改

作者認爲,當前模型是基於V2模型中的倒殘差結構和相應的變體(如下圖)。使用1×1卷積來構建最後層,這樣可以便於拓展到更高維的特徵空間。這樣做的好處是,在預測時,有更多更豐富的特徵來滿足預測,但是同時也引入了額外的計算成本與延時
在這裏插入圖片描述

所以,需要改進的地方就是要保留高維特徵的前提下減小延時。首先,還是將1×1層放在到最終平均池之後。這樣的話最後一組特徵現在不是7x7(下圖V2結構紅框),而是以1x1計算(下圖V3結構黃框)。
在這裏插入圖片描述
在這裏插入圖片描述
這樣的好處是,在計算和延遲方面,特徵的計算幾乎是免費的。最終,重新設計完的結構如下:
在這裏插入圖片描述

7.3.5 V3的block

在這裏插入圖片描述
與V2的block相比較:
在這裏插入圖片描述

7.3.6 MobileNetV3的網絡結構

MobileNetV3定義了兩個模型: MobileNetV3-Large和MobileNetV3-Small。V3-Large是針對高資源情況下的使用,相應的,V3-small就是針對低資源情況下的使用。兩者都是基於之前的簡單討論的NAS

  1. MobileNetV3-Large. 在這裏插入圖片描述
  2. MobileNetV3-Small. 在這裏插入圖片描述

就像之前所說的:只有在更深層次使用h-swish才能得到比較大的好處。所以在上面的網絡模型中,不論大小,作者只在模型的後半部分使用h-swish。

7.4 爲什麼MobileNet會這麼快?

  1. 從結構方面進行了討論
  2. 用時多少的角度去討論:
    不管是在GPU還是在CPU運行,最重要的“耗時殺手”就是conv,卷積層。也就是說,想要提高網絡的運行速度,就得到提高卷積層的計算效率。

7.4.1 MobileNet資源分佈

在這裏插入圖片描述
MobileNet的95%的計算都花費在了1×1的卷積上

在計算機操作時,需要將其存入內存當中再操作(按照“行先序”):
在這裏插入圖片描述
這樣一來,特徵圖y11,y12,y21,y22的計算如下所示:
在這裏插入圖片描述
按照卷積計算,實線標註出卷積計算中的訪存過程(對應數據相乘),我們可以看到這一過程是非常散亂和混亂的。直接用卷積的計算方式是比較愚蠢的。

這時候就要用到im2col操作。

7.4.2 imcol

一句話來介紹im2col操作的話,就是通過犧牲空間的手段(約擴增K×K倍),將特徵圖轉換成龐大的矩陣來進行卷積計算
在這裏插入圖片描述
把每一次循環所需要的數據都排列成列向量,然後逐一堆疊起來形成矩陣(按通道順序在列方向上拼接矩陣)。
比如Ci×Wi×Hi大小的輸入特徵圖,K×K大小的卷積核,輸出大小爲Co×Wo×Ho,
輸入特徵圖將按需求被轉換成(K∗K)×(Ci∗Wo∗Ho)的矩陣,卷積核將被轉換成Co×(K∗K)的矩陣,
在這裏插入圖片描述
然後調用GEMM(矩陣乘矩陣)庫加速兩矩陣相乘也就完成了卷積計算。由於按照計算需求排布了數據順序,每次計算過程中總是能夠依次訪問特徵圖數據,極大地提高了計算卷積的速度。 (不光有GEMM,還有FFt(快速傅氏變換))
在這裏插入圖片描述
在這裏插入圖片描述

這樣可以更清楚的看到卷積的定義進行卷積操作(上圖上半部分),內存訪問會非常不規律,以至於性能會非常糟糕。而Im2col()以一種內存訪問規則的方式排列數據,雖然Im2col操作增加了很多數據冗餘,但使用Gemm的性能優勢超過了這個數據冗餘的劣勢。

所以標準卷積運算大概就是這樣的一個過程:

在這裏插入圖片描述
那我們現在回到1×1的卷積上來,有點特殊。按照我們之前所說的,1×1的卷積的原始儲存結構和進行im2col的結構如下圖所示:

在這裏插入圖片描述
可以看到矩陣是完全相同的。標準卷積運算和1×1卷積運算對比如下圖:
在這裏插入圖片描述
也就是說,1x1卷積不需要im2col的過程,所以底層可以有更快的實現,拿起來就能直接算,大大節省了數據重排列的時間和空間。

當然,這些也不是那麼絕對的,因爲畢竟MobileNet速度快不快,與CONV1x1運算的優化程度密切相關。如果使用了定製化的硬件(比如用FPGA直接實現3x3的卷積運算單元),那麼im2col就失去了意義而且反而增加了開銷。

回到之前的MobileNet的資源分佈,95%的1×1卷積和優化的網絡結構就是MobileNet能如此快的原因了。

8. ShffuleNet(待完善)

參考鏈接

https://zhuanlan.zhihu.com/p/76275427
https://mp.weixin.qq.com/s/ooK2aAC_TAPFmK9dPLF-Fw
https://zhuanlan.zhihu.com/p/70703846

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章