一文概覽Inception家族的「奮鬥史」

本文簡要介紹了 Inception 家族的主要成員,包括 Inception v1、Inception v2 和 Inception v3、Inception v4 和 Inception-ResNet。它們的計算效率與參數效率在所有卷積架構中都是頂尖的,且根據 CS231n 中所介紹的,Inception V4 基本上是當前在 ImageNet 圖像分類任務 Top-1 正確率最高的模型。

Inception 網絡是 CNN 分類器發展史上一個重要的里程碑。在 Inception 出現之前,大部分流行 CNN 僅僅是把卷積層堆疊得越來越多,使網絡越來越深,以此希望能夠得到更好的性能。

例如第一個得到廣泛關注的 AlexNet,它本質上就是擴展 LeNet 的深度,並應用一些 ReLU、Dropout 等技巧。AlexNet 有 5 個卷積層和 3 個最大池化層,它可分為上下兩個完全相同的分支,這兩個分支在第三個卷積層和全連接層上可以相互交換信息。與 Inception 同年提出的優秀網絡還有 VGG-Net,它相比於 AlexNet 有更小的卷積核和更深的層級。

VGG-Net 的泛化性能非常好,常用於圖像特徵的抽取目標檢測候選框生成等。VGG 最大的問題就在於參數數量,VGG-19 基本上是參數量最多的卷積網絡架構。這一問題也是第一次提出 Inception 結構的 GoogLeNet 所重點關注的,它沒有如同 VGG-Net 那樣大量使用全連接網絡,因此參數量非常小。

GoogLeNet 最大的特點就是使用了 Inception 模塊,它的目的是設計一種具有優良局部拓撲結構的網絡,即對輸入圖像並行地執行多個卷積運算或池化操作,並將所有輸出結果拼接為一個非常深的特徵圖。因為 1*1、3*3 或 5*5 等不同的卷積運算與池化操作可以獲得輸入圖像的不同信息,並行處理這些運算並結合所有結果將獲得更好的圖像表徵。

另一方面,Inception 網絡是複雜的(需要大量工程工作)。它使用大量 trick 來提升性能,包括速度和準確率兩方面。它的不斷進化帶來了多種 Inception 網絡版本的出現。常見的版本有:

  • Inception v1
  • Inception v2 和 Inception v3
  • Inception v4 和 Inception-ResNet

每個版本都是前一個版本的迭代進化。瞭解 Inception 網絡的升級可以幫助我們構建自定義分類器,優化速度和準確率。此外,根據你的已有數據,或許較低版本工作效果更好。

Inception v1

這是 Inception 網絡的第一個版本。我們來分析一下它可以解決什麼問題,以及如何解決。

在《Going deeper with convolutions》論文中,作者提出一種深度卷積神經網絡 Inception,它在 ILSVRC14 中達到了當時最好的分類和檢測性能。該架構的主要特點是更好地利用網絡內部的計算資源,這通過一個精心製作的設計來實現,該設計允許增加網絡的深度和寬度,同時保持計算預算不變。為了優化質量,架構決策基於赫布原則和多尺度處理。作者向 ILSVRC14 提交使用該架構的模型即 GoogLeNet,這是一個 22 層的深度網絡,它的質量是在分類和檢測領域進行了評估。

  • 論文:Going deeper with convolutions
  • 論文鏈接:https://arxiv.org/pdf/1409.4842v1.pdf

問題:

  • 圖像中突出部分的大小差別很大。例如,狗的圖像可以是以下任意情況。每張圖像中狗所佔區域都是不同的。
一文概覽Inception家族的「奮鬥史」

從左到右:狗佔據圖像的區域依次減小(圖源:https://unsplash.com/)。

  • 由於信息位置的巨大差異,為卷積操作選擇合適的卷積核大小就比較困難。信息分佈更全局性的圖像偏好較大的卷積核,信息分佈比較局部的圖像偏好較小的卷積核。
  • 非常深的網絡更容易過擬合。將梯度更新傳輸到整個網絡是很困難的。
  • 簡單地堆疊較大的卷積層非常消耗計算資源。

解決方案:

為什麼不在同一層級上運行具備多個尺寸的濾波器呢?網絡本質上會變得稍微「寬一些」,而不是「更深」。作者因此設計了 Inception 模塊。

下圖是「原始」Inception 模塊。它使用 3 個不同大小的濾波器(1x1、3x3、5x5)對輸入執行卷積操作,此外它還會執行最大池化。所有子層的輸出最後會被級聯起來,並傳送至下一個 Inception 模塊。

一文概覽Inception家族的「奮鬥史」

原始 Inception 模塊。(圖源:https://arxiv.org/pdf/1409.4842v1.pdf)

如前所述,深度神經網絡需要耗費大量計算資源。為了降低算力成本,作者在 3x3 和 5x5 卷積層之前添加額外的 1x1 卷積層,來限制輸入信道的數量。儘管添加額外的卷積操作似乎是反直覺的,但是 1x1 卷積比 5x5 卷積要廉價很多,而且輸入信道數量減少也有利於降低算力成本。不過一定要注意,1x1 卷積是在最大池化層之後,而不是之前。

一文概覽Inception家族的「奮鬥史」

實現降維的 Inception 模塊。(圖源:https://arxiv.org/pdf/1409.4842v1.pdf)

利用實現降維的 Inception 模塊可以構建 GoogLeNet(Inception v1),其架構如下圖所示:

一文概覽Inception家族的「奮鬥史」

GoogLeNet。橙色框是 stem,包含一些初始卷積。紫色框是輔助分類器。較寬的部分是 inception 模塊。(圖源:https://arxiv.org/pdf/1409.4842v1.pdf)

GoogLeNet 有 9 個線性堆疊的 Inception 模塊。它有 22 層(包括池化層的話是 27 層)。該模型在最後一個 inception 模塊處使用全局平均池化。

不用多說,這是一個深層分類器。和所有深層網絡一樣,它也會遇到梯度消失問題。

為了阻止該網絡中間部分梯度的「消失」過程,作者引入了兩個輔助分類器(上圖紫色框)。它們對其中兩個 Inception 模塊的輸出執行 softmax 操作,然後在同樣的標籤上計算輔助損失。總損失即輔助損失和真實損失的加權和。該論文中對每個輔助損失使用的權重值是 0.3。

# The total loss used by the inception net during training.total_loss = real_loss + 0.3 * aux_loss_1 + 0.3 * aux_loss_2

輔助損失只是用於訓練,在推斷過程中並不使用。

Inception v2

Inception v2 和 Inception v3 來自同一篇論文《Rethinking the Inception Architecture for Computer Vision》,作者提出了一系列能增加準確度和減少計算複雜度的修正方法。

在這一篇論文中,作者表示非常深的卷積網絡自 2014 年以來就成為了計算機視覺領域的主流,它在各種基準測試中都獲得了非常多的提升。只要有足夠的標註數據,增加模型大小與計算成本可以在大多數任務中快速提升模型質量。在這篇論文中,作者積極探索擴展網絡的方法,旨在通過適當的分解卷積與積極的正則化儘可能高效地利用添加的計算。他們在 ILSVRC 2012 分類任務挑戰賽的驗證集上證明了模型的優秀性能,使用每個推斷過程有 50 億次乘加運算的模型,作者實現了單幀評估 21.2% top-1 和 5.6% top-5 誤差率,且模型的總參數還不到 250 萬。

  • 論文:Rethinking the Inception Architecture for Computer Vision
  • 論文地址:https://arxiv.org/pdf/1512.00567v3.pdf

以下首先介紹 Inception V2。

問題:

  • 減少特徵的表徵性瓶頸。直觀上來說,當卷積不會大幅度改變輸入維度時,神經網絡可能會執行地更好。過多地減少維度可能會造成信息的損失,這也稱為「表徵性瓶頸」。
  • 使用更優秀的因子分解方法,卷積才能在計算複雜度上更加高效。

解決方案:

  • 將 5×5 的卷積分解為兩個 3×3 的卷積運算以提升計算速度。儘管這有點違反直覺,但一個 5×5 的卷積在計算成本上是一個 3×3 卷積的 2.78 倍。所以疊加兩個 3×3 卷積實際上在性能上會有所提升,如下圖所示:
一文概覽Inception家族的「奮鬥史」

最左側前一版 Inception 模塊中的 5×5 卷積變成了兩個 3×3 卷積的堆疊。(圖源:https://arxiv.org/pdf/1512.00567v3.pdf)

  • 此外,作者將 n*n 的卷積核尺寸分解為 1×n 和 n×1 兩個卷積。例如,一個 3×3 的卷積等價於首先執行一個 1×3 的卷積再執行一個 3×1 的卷積。他們還發現這種方法在成本上要比單個 3×3 的卷積降低 33%,這一結構如下圖所示:
一文概覽Inception家族的「奮鬥史」

此處如果 n=3,則與上一張圖像一致。最左側的 5x5 卷積可被表示為兩個 3x3 卷積,它們又可以被表示為 1x3 和 3x1 卷積。(圖源:https://arxiv.org/pdf/1512.00567v3.pdf)

模塊中的濾波器組被擴展(即變得更寬而不是更深),以解決表徵性瓶頸。如果該模塊沒有被拓展寬度,而是變得更深,那麼維度會過多減少,造成信息損失。如下圖所示:

一文概覽Inception家族的「奮鬥史」

使 Inception 模塊變得更寬。這種類型等同於前面展示的模塊(圖源:https://arxiv.org/pdf/1512.00567v3.pdf)

前面三個原則用來構建三種不同類型的 Inception 模塊(這裡我們按引入順序稱之為模塊 A、B、C,這裡使用「A、B、C」作為名稱只是為了清晰期間,並不是它們的正式名稱)。架構如下所示:

一文概覽Inception家族的「奮鬥史」

這裡,「figure 5」是模塊 A,「figure 6」是模塊 B,「figure 7」是模塊 C。(圖源:https://arxiv.org/pdf/1512.00567v3.pdf)

Inception v3

問題:

  • 作者注意到輔助分類器直到訓練過程快結束時才有較多貢獻,那時準確率接近飽和。作者認為輔助分類器的功能是正則化,尤其是它們具備 BatchNorm 或 Dropout 操作時。
  • 是否能夠改進 Inception v2 而無需大幅更改模塊仍需要調查。

解決方案:

Inception Net v3 整合了前面 Inception v2 中提到的所有升級,還使用了:

  • RMSProp 優化器;
  • Factorized 7x7 卷積;
  • 輔助分類器使用了 BatchNorm;
  • 標籤平滑(添加到損失公式的一種正則化項,旨在阻止網絡對某一類別過分自信,即阻止過擬合)。

Inception v4

Inception v4 和 Inception -ResNet 在同一篇論文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中介紹。為清晰起見,我們分成兩個部分來介紹。

在該論文中,研究者介紹道,Inception 架構可以用很低的計算成本達到很高的性能。而在傳統的網絡架構中引入殘差連接曾在 2015ILSVRC 挑戰賽中獲得當前最佳結果,其結果和 Inception-v3 網絡當時的最新版本相近。這使得人們好奇,如果將 Inception 架構和殘差連接結合起來會是什麼效果。在這篇論文中,研究者通過實驗明確地證實了,結合殘差連接可以顯著加速 Inception 的訓練。也有一些證據表明殘差 Inception 網絡在相近的成本下略微超過沒有殘差連接的 Inception 網絡。研究者還展示了多種新型殘差和非殘差 Inception 網絡的簡化架構。這些變體顯著提高了在 ILSVRC2012 分類任務挑戰賽上的單幀識別性能。作者進一步展示了適當的激活值縮放如何穩定非常寬的殘差 Inception 網絡的訓練過程。通過三個殘差和一個 Inception v4 的模型集成,作者在 ImageNet 分類挑戰賽的測試集上取得了 3.08% 的 top-5 誤差率。

  • 論文:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
  • 論文地址:https://arxiv.org/pdf/1602.07261.pdf

問題:

  • 使模塊更加一致。作者還注意到某些模塊有不必要的複雜性。這允許我們通過添加更多一致的模塊來提高性能。

解決方案:

Inception v4 的 stem 被修改了。這裡的 stem 參考了在引入 Inception 塊之前執行的初始運算集。

一文概覽Inception家族的「奮鬥史」

圖上部是 Inception-ResNet v1 的 stem。圖下部是 Inception v4 和 Inception-ResNet v2 的 stem。(圖源:https://arxiv.org/pdf/1602.07261.pdf)

  • 它們有三個主要的 Inception 模塊,稱為 A、B 和 C(和 Inception v2 不同,這些模塊確實被命名為 A、B 和 C)。它們看起來和 Inception v2(或 v3)變體非常相似。
一文概覽Inception家族的「奮鬥史」

(左起)在 Inception v4 中使用的 Inception 模塊 A、B、C。注意它們和 Inception v2(或 v3)模塊的相似性。(圖源:https://arxiv.org/pdf/1602.07261.pdf)

  • Inception v4 引入了專用的「縮減塊」(reduction block),它被用於改變網格的寬度和高度。早期的版本並沒有明確使用縮減塊,但也實現了其功能。
一文概覽Inception家族的「奮鬥史」

縮減塊 A(從 35x35 到 17x17 的尺寸縮減)和縮減塊 B(從 17x17 到 8x8 的尺寸縮減)。這裡參考了論文中的相同超參數設置(V,I,k)。(圖源:https://arxiv.org/pdf/1602.07261.pdf)

Inception-ResNet v1 和 v2

受 ResNet 的優越性能啟發,研究者提出了一種混合 inception 模塊。Inception ResNet 有兩個子版本:v1 和 v2。在我們分析其顯著特徵之前,先看看這兩個子版本之間的微小差異。

  • Inception-ResNet v1 的計算成本和 Inception v3 的接近。
  • Inception-ResNetv2 的計算成本和 Inception v4 的接近。
  • 它們有不同的 stem,正如 Inception v4 部分所展示的。
  • 兩個子版本都有相同的模塊 A、B、C 和縮減塊結構。唯一的不同在於超參數設置。在這一部分,我們將聚焦於結構,並參考論文中的相同超參數設置(圖像是關於 Inception-ResNet v1 的)。

問題:

  • 引入殘差連接,它將 inception 模塊的卷積運算輸出添加到輸入上。

解決方案:

  • 為了使殘差加運算可行,卷積之後的輸入和輸出必須有相同的維度。因此,我們在初始卷積之後使用 1x1 卷積來匹配深度(深度在卷積之後會增加)。
一文概覽Inception家族的「奮鬥史」

(左起)Inception ResNet 中的 Inception 模塊 A、B、C。注意池化層被殘差連接所替代,並在殘差加運算之前有額外的 1x1 卷積。(圖源:https://arxiv.org/pdf/1602.07261.pdf)

  • 主要 inception 模塊的池化運算由殘差連接替代。然而,你仍然可以在縮減塊中找到這些運算。縮減塊 A 和 Inception v4 中的縮減塊相同。
一文概覽Inception家族的「奮鬥史」

(左起)縮減塊 A(從 35x35 到 17x17 的尺寸縮減)和縮減塊 B(從 17x17 到 8x8 的尺寸縮減)。這裡參考了論文中的相同超參數設置(V,I,K)。(圖源:https://arxiv.org/pdf/1602.07261.pdf)

  • 如果卷積核的數量超過 1000,則網絡架構更深層的殘差單元將導致網絡崩潰。因此,為了增加穩定性,作者通過 0.1 到 0.3 的比例縮放殘差激活值。
一文概覽Inception家族的「奮鬥史」

激活值通過一個常數進行比例縮放,以防止網絡崩潰。(圖源:https://arxiv.org/pdf/1602.07261.pdf)

  • 原始論文並沒有在求和之後使用批歸一化,以在單個 GPU 上訓練模型(在單個 GPU 上擬合整個模型)。
  • 研究發現 Inception-ResNet 模型可以在更少的 epoch 內達到更高的準確率。
  • Inception v4 和 Inception-ResNet 的網絡完整架構如下圖所示:
一文概覽Inception家族的「奮鬥史」

圖上部是 Inception v4 的架構。圖下部是 Inception-ResNet 的架構。(圖源:https://arxiv.org/pdf/1602.07261.pdf)


分享到:


相關文章: