原標題:無需數學背景,讀懂ResNet、Inception和Xception三大變革性架構

來源 | 機器之心

無需數學背景,讀懂ResNet、Inception和Xception三大變革性架構

神經網路領域近年來出現了很多激動人心的進步,斯坦福大學的 Joyce Xu 近日在 Medium 上談了她認為「真正重新定義了我們看待神經網路的方式」的三大架構: ResNet、Inception 和 Xception。

過去幾年來,電腦視覺領域中深度學習的諸多進展都可以歸結到幾種神經網路架構。除開其中的所有數學內容、程式碼和實現細節,我想探索一個簡單的問題:這些模型的工作方式和原因是什麼?

在本文寫作時,Keras 已經將這 6 種預訓練模型集成到了庫中:

  • VGG16

  • VGG19

  • ResNet50

  • Inception v3

  • Xception

  • MobileNet

VGG 網路以及從 2012 年以來的 AlexNet 都遵循現在的基本卷積網路的原型布局:一系列卷積層、最大池化層和激活層,最後還有一些全連接的分類層。MobileNet 本質上是為移動應用優化後的 Xception 架構的流線型(streamline)版本。但剩下的三個卻真正重新定義了我們看待神經網路的方式。

本文的剩餘部分將聚焦於 ResNet、Inception 和 Xception 架構背後的直觀原理,並將解釋為什麼它們成為了電腦視覺領域後續許多成果的構建模塊。

ResNet

ResNet 誕生於一個美麗而簡單的觀察:為什麼非常深度的網路在增加更多層時會表現得更差?

直覺上推測,更深度的網路不會比更淺度的同類型網路表現更差吧,至少在訓練時間上是這樣(當不存在過擬合的風險時)。讓我們進行一個思想實驗,假設我們已經構建了一個 n 層網路,並且實現了一定準確度。那麼一個 n+1 層網路至少也應該能夠實現同樣的準確度——只要簡單複製前面 n 層,再在最後一層增加一層恆等映射就可以了。類似地,n+2、n+3 和 n+4 層的網路都可以繼續增加恆等映射,然後實現同樣的準確度。但是在實際情況下,這些更深度的網路基本上都會表現得更差。

ResNet 的作者將這些問題歸結成了一個單一的假設:直接映射是難以學習的。而且他們提出了一種修正方法:不再學習從 x 到 H(x) 的基本映射關係,而是學習這兩者之間的差異,也就是「殘差(residual)」。然後,為了計算 H(x),我們只需要將這個殘差加到輸入上即可。

假設殘差為 F(x)=H(x)-x,那麼現在我們的網路不會直接學習 H(x) 了,而是學習 F(x)+x。

這就帶來了你可能已經見過的著名 ResNet(殘差網路)模塊:

無需數學背景,讀懂ResNet、Inception和Xception三大變革性架構

ResNet 模塊

ResNet 的每一個「模塊(block)」都由一系列層和一個「捷徑(shortcut)」連接組成,這個「捷徑」將該模塊的輸入和輸出連接到了一起。然後在元素層面上執行「加法(add)」運算,如果輸入和輸出的大小不同,那就可以使用零填充或投射(通過 1×1 卷積)來得到匹配的大小。

回到我們的思想實驗,這能大大簡化我們對恆等層的構建。直覺上就能知道,比起從頭開始學習一個恆等變換,學會使 F(x) 為 0 並使輸出仍為 x 要容易得多。一般來說,ResNet 會給層一個「參考」點 x,以 x 為基礎開始學習。

這一想法在實踐中的效果好得讓人吃驚。在此之前,深度神經網路常常會有梯度消失問題的困擾,即來自誤差函數的梯度信號會在反向傳播回更早的層時指數級地下降。本質上講,在誤差信號反向回到更早的層時,它們會變得非常小以至於網路無法學習。但是,因為 ResNet 的梯度信號可以直接通過捷徑連接回到更早的層,所以我們一下子就可以構建 50 層、101 層、152 層甚至 1000 層以上的網路了,而且它們的表現依然良好。那時候,這在當時最佳的基礎上實現了巨大的飛躍——這個 22 層的網路贏得了 ILSVRC 2014 挑戰賽。

ResNet 是神經網路領域我個人最喜歡的進展之一。很多深度學習論文都是通過對數學、優化和訓練過程進行調整而取得一點點微小的進步,而沒有思考模型的底層任務。ResNet 則從根本上改變了我們對神經網路及其學習方式的理解。

有趣的事實:

  • 上面提到的 1000 多層的網路是開源的!我並不推薦你嘗試再訓練,但如果你就是要上:https://github.com/KaimingHe/resnet-1k-layers

  • 如果你覺得這有用而且有點躍躍欲試,我最近將 ResNet50 移植到了開源的 Clojure ML 庫 Cortex 中:https://github.com/thinktopic/cortex。你可以試試,看與 Keras 比較如何!

Inception

如果 ResNet 是為了更深,那麼 Inception 家族就是為了更寬。Inception 的作者對訓練更大型網路的計算效率尤其感興趣。換句話說:我們怎樣在不增加計算成本的前提下擴展神經網路?

Inception 最早的論文關注的是一種用於深度網路的新型構建模塊,現在這一模塊被稱為「Inception module」。究其核心,這種模塊源自兩種思想見解的交匯。

第一個見解與對層的操作有關。在傳統的卷積網路中,每一層都會從之前的層提取資訊,以便將輸入數據轉換成更有用的表徵。但是,不同類型的層會提取不同種類的資訊。5×5 卷積核的輸出中的資訊就和 3×3 卷積核的輸出不同,又不同於最大池化核的輸出……在任意給定層,我們怎麼知道什麼樣的變換能提供最「有用」的資訊呢?

見解 1:為什麼不讓模型選擇?

Inception 模塊會并行計算同一輸入映射上的多個不同變換,並將它們的結果都連接到單一一個輸出。換句話說,對於每一個層,Inception 都會執行 5×5 卷積變換、3×3 卷積變換和最大池化。然後該模型的下一層會決定是否以及怎樣使用各個資訊。

無需數學背景,讀懂ResNet、Inception和Xception三大變革性架構

這種模型架構的資訊密度更大了,這就帶來了一個突出的問題:計算成本大大增加。不僅大型(比如 5×5)卷積過濾器的固有計算成本高,並排堆疊多個不同的過濾器更會極大增加每一層的特徵映射的數量。而這種計算成本增長就成為了我們模型的致命瓶頸。

想一下,每額外增加一個過濾器,我們就必須對所有輸入映射進行卷積運算以計算單個輸出。如下圖所示:從單個過濾器創建一個輸出映射涉及到在之前一層的每個單個映射上執行計算。

無需數學背景,讀懂ResNet、Inception和Xception三大變革性架構

假設這裡有 M 個輸入映射。增加一個過濾器就意味著要多卷積 M 次映射;增加 N 個過濾器就意味著要多卷積 N*M 次映射。換句話說,正如作者指出的那樣:「過濾器數量的任何統一增長都會導致計算量的 4 倍增長。」我們的樸素 Inception 模塊只是將過濾器的數量增加了三四倍。但從計算成本上看,這簡直就是一場大災難。

這就涉及到了見解 2:

使用 1×1 卷積來執行降維。為了解決上述計算瓶頸,Inception 的作者使用了 1×1 卷積來「過濾」輸出的深度。一個 1×1 卷積一次僅查看一個值,但在多個通道上,它可以提取空間資訊並將其壓縮到更低的維度。比如,使用 20 個 1×1 過濾器,一個大小為 64×64×100(具有 100 個特徵映射)的輸入可以被壓縮到 64×64×20。通過減少輸入映射的數量,Inception 可以將不同的層變換并行地堆疊到一起,從而得到既深又寬(很多并行操作)的網路。

這能達到多好的效果?Inception 的第一個版本是 GoogLeNet,也就是前面提及的贏得了 ILSVRC 2014 比賽的 22 層網路。一年之後,研究者在第二篇論文中發展出了 Inception v2 和 v3,並在原始版本上實現了多種改進——其中最值得一提的是將更大的卷積重構成了連續的更小的卷積,讓學習變得更輕鬆。比如在 v3 中,5×5 卷積被替換成了兩個 連續的 3×3 卷積。

Inception 很快就變成了一種具有決定性意義的模型架構。最新的版本 Inception v4 甚至將殘差連接放進了每一個模組中,創造出了一種 Inception-ResNet 混合結構。但更重要的是,Inception 展現了經過良好設計的「網中有網」架構的能力,讓神經網路的表徵能力又更上了一層樓。

有趣的事實:

  • 最早的 Inception 論文確實引用了來自電影《盜夢空間(Inception)》的「我們需要更深」的網際網路模因作為其名字的來源,參見:http://knowyourmeme.com/memes/we-need-to-go-deeper。這肯定是 knowyourmeme.com (http://knowyourmeme.com/) 第一次出現在一篇谷歌論文的參考文獻里。

  • 第二篇 Inception 論文(提出 v2 和 v3)是在最早的 ResNet 論文發布之後的第二天發布的。2015 年 12 月真是深度學習的好日子。

Xception

Xception 表示「extreme inception」。和前面兩種架構一樣,它重塑了我們看待神經網路的方式——尤其是卷積網路。而且正如其名字表達的那樣,它將 Inception 的原理推向了極致。

它的假設是:「跨通道的相關性和空間相關性是完全可分離的,最好不要聯合映射它們。」

這是什麼意思?在傳統的卷積網路中,卷積層會同時尋找跨空間和跨深度的相關性。讓我們再看一下標準的卷積層:

無需數學背景,讀懂ResNet、Inception和Xception三大變革性架構

在上圖中,過濾器同時考慮了一個空間維度(每個 2×2 的彩色方塊)和一個跨通道或「深度」維度(4 個方塊的堆疊)。在輸入圖像的輸入層,這就相當於一個在所有 3 個 RGB 通道上查看一個 2×2 像素塊的卷積過濾器。那問題來了:我們有什麼理由去同時考慮圖像區域和通道?

在 Inception 中,我們開始將兩者稍微分開。我們使用 1×1 的卷積將原始輸入投射到多個分開的更小的輸入空間,而且對於其中的每個輸入空間,我們都使用一種不同類型的過濾器來對這些數據的更小的 3D 模塊執行變換。Xception 更進一步。不再只是將輸入數據分割成幾個壓縮的數據塊,而是為每個輸出通道單獨映射空間相關性,然後再執行 1×1 的深度方面的卷積來獲取跨通道的相關性。

無需數學背景,讀懂ResNet、Inception和Xception三大變革性架構

其作者指出這本質上相當於一種已有的被稱為「深度方面可分的卷積(depthwise separable convolution)」的運算,它包含一個深度方面的卷積(一個為每個通道單獨執行的空間卷積),後面跟著一個逐點的卷積(一個跨通道的 1×1 卷積)。我們可以將其看作是首先求跨一個 2D 空間的相關性,然後再求跨一個 1D 空間的相關性。可以看出,這種 2D+1D 映射學起來比全 3D 映射更加簡單。

而且這種做法是有效的!在 ImageNet 數據集上,Xception 的表現稍稍優於 Inception v3,而且在一個有 17000 類的更大規模的圖像分類數據集上的表現更是好得多。最重要的是,它的模型參數的數量和 Inception 一樣多,說明它的計算效率也更高。Xception 非常新(2017 年 4 月才公開),但正如前面提到的那樣,這個架構已經在通過 MobileNet 助力谷歌的移動視覺應用了。

有趣的事實:

  • Xception 的作者也是 Keras 的作者。Francois Chollet 是真正的大神。

未來發展

這就是 ResNet、Inception 和 Xception!我堅信我們需要對這些網路有很好的直觀理解,因為它們在研究界和產業界的應用越來越普遍。我們甚至可以通過所謂的遷移學習將它們用在我們自己的應用中。

遷移學習是一種機器學習技術,即我們可以將一個領域的知識(比如 ImageNet)應用到目標領域,從而可以極大減少所需要的數據點。在實踐中,這通常涉及到使用來自 ResNet、Inception 等的預訓練的權重初始化模型,然後要麼將其用作特徵提取器,要麼就在一個新數據集上對最後幾層進行微調。使用遷移學習,這些模型可以在任何我們想要執行的相關任務上得到重新利用,從自動駕駛汽車的目標檢測到為影片片段生成描述。

要了解遷移學習,Keras 有一個關於微調模型的很棒的指南:https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html。如果你對此有興趣,一定不要錯過!

原文鏈接:https://medium.com/towards-data-science/an-intuitive-guide-to-deep-network-architectures-65fdc477db41