神經網絡架構演進史:全面回顧從LeNet5到Googlenet,resnet,fractalnet,ENet十餘種架構

轉載於:http://www.open-open.com/lib/view/open1473213789568.html 

LeNet5

LeNet5 誕生於 1994 年,是最早的卷積神經網絡之一,並且推動了深度學習領域的發展。自從 1988 年開始,在許多次成功的迭代後,這項由 Yann LeCun 完成的開拓性成果被命名爲 LeNet5(參見:Gradient-Based Learning Applied to Document Recognition)。

LeNet5 的架構基於這樣的觀點:(尤其是)圖像的特徵分佈在整張圖像上,以及帶有可學習參數的卷積是一種用少量參數在多個位置上提取相似特徵的有效方式。在那時候,沒有 GPU 幫助訓練,甚至 CPU 的速度也很慢。因此,能夠保存參數以及計算過程是一個關鍵進展。這和將每個像素用作一個大型多層神經網絡的單獨輸入相反。LeNet5 闡述了那些像素不應該被使用在第一層,因爲圖像具有很強的空間相關性,而使用圖像中獨立的像素作爲不同的輸入特徵則利用不到這些相關性。

LeNet5 特徵能夠總結爲如下幾點:

卷積神經網絡使用 3 個層作爲一個序列:卷積、池化、非線性 → 這可能是自從這篇 paper 起圖像深度學習的關鍵特徵!

使用卷積提取空間特徵

使用映射到空間均值下采樣(subsample)

雙曲正切(tanh)或 S 型(sigmoid)形式的非線性

多層神經網絡(MLP)作爲最後的分類器

層與層之間的稀疏連接矩陣避免大的計算成本

總體來看,這個網絡是最近大量架構的起點,並且也給這個領域的許多帶來了靈感。

間隔

從 1998 年到 2010 年神經網絡處於孵化階段。大多數人沒有意識到它們不斷增長的力量,與此同時其他研究者則進展緩慢。由於手機相機以及便宜的數字相機的出現,越來越多的數據可被利用。並且計算能力也在成長,CPU 變得更快,GPU 變成了多種用途的計算工具。這些趨勢使得神經網絡有所進展,雖然速度很慢。數據和計算能力使得神經網絡能完成的任務越來越有趣。之後一切變得清晰起來......

Dan Ciresan Net

2010 年的時候,Dan Claudiu Ciresan 和 Jurgen Schmidhuber 發佈了最早的 GPU 神經網絡的一個實現。這個實現是在一塊 NVIDIA GTX 280 圖形處理器上運行 9 層的神經網絡,包含前向與反向傳播。

AlexNet

2012 年,Alex Krizhevsky 發表了 Alexet(參見:ImageNet Classification with Deep Convolutional Neural Networks),它是 LeNet 的一種更深更寬的版本,並以顯著優勢贏得了困難的 ImageNet 競賽。

AlexNet 將 LeNet 的思想擴展到了更大的能學習到遠遠更復雜的對象與對象層次的神經網絡上。這項工作的貢獻有:

使用修正的線性單元(ReLU)作爲非線性

在訓練的時候使用 Dropout 技術有選擇地忽視單個神經元,以避免模型過擬合

覆蓋進行最大池化,避免平均池化的平均化效果

使用 GPU NVIDIA GTX 580 減少訓練時間

在那時,GPU 相比 CPU 可以提供更多數量的核,訓練時間可以提升 10 倍,這又反過來允許使用更大的數據集和更大的圖像。

AlexNet 的成功掀起了一場小革命。卷積神經網絡現在是深度學習的骨幹,它已經變成了「現在能解決有用任務的大型神經網絡」的代名詞。

Overfeat

2013 年的 12 月,紐約大學的 Yann LeCun 實驗室提出了 AlexNet 的衍生——Overfeat(參見:OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks)。這篇文章也提出了學習邊界框(learning bounding box),並導致之後出現了很多研究這同一主題的論文。我相信學習分割對象比學習人工邊界框更好。

VGG

來自牛津大學的 VGG 網絡(參見:Very Deep Convolutional Networks for Large-Scale Image Recognition)是第一個在各個卷積層使用更小的 3×3 過濾器(filter),並把它們組合作爲一個卷積序列進行處理的網絡。

這看來和 LeNet 的原理相反,其中是大的卷積被用來獲取一張圖像中相似特徵。和 AlexNet 的 9×9 或 11×11 過濾器不同,過濾器開始變得更小,離 LeNet 竭力所要避免的臭名昭著的 1×1 卷積異常接近——至少在該網絡的第一層是這樣。但是 VGG 巨大的進展是通過依次採用多個 3×3 卷積,能夠模仿出更大的感受野(receptive field)的效果,例如 5×5 與 7×7。這些思想也被用在了最近更多的網絡架構中,如 Inception 與 ResNet。

VGG 網絡使用多個 3×3 卷積層去表徵複雜特徵。注意 VGG-E 的第 3、4、5 塊(block):256×256 和 512×512 個 3×3 過濾器被依次使用多次以提取更多複雜特徵以及這些特徵的組合。其效果就等於是一個帶有 3 個卷積層的大型的 512×512 大分類器。這顯然意味着有大量的參數與學習能力。但是這些網絡訓練很困難,必須劃分到較小的網絡,並逐層累加。這是因爲缺少強大的方式對模型進行正則化,或者或多或少約束大量由於大量參數增長的搜索空間。

VGG 在許多層中都使用大特徵尺寸,因爲推斷(inference)在運行時是相當耗費時間的。正如 Inception 的瓶頸(bottleneck)那樣,減少特徵的數量將節省一些計算成本。

網絡中的網絡(Network-in-network)

網絡中的網絡(NiN,參見論文:Network In Network)的思路簡單又偉大:使用 1×1 卷積爲卷積層的特徵提供更組合性的能力。

NiN 架構在各個卷積之後使用空間 MLP 層,以便更好地在其他層之前組合特徵。同樣,你可以認爲 1×1 卷積與 LeNet 最初的原理相悖,但事實上它們可以以一種更好的方式組合卷積特徵,而這是不可能通過簡單堆疊更多的卷積特徵做到的。這和使用原始像素作爲下一層輸入是有區別的。其中 1×1 卷積常常被用於在卷積之後的特徵映射上對特徵進行空間組合,所以它們實際上可以使用非常少的參數,並在這些特徵的所有像素上共享!

MLP 的能力能通過將卷積特徵組合進更復雜的組(group)來極大地增加單個卷積特徵的有效性。這個想法之後被用到一些最近的架構中,例如 ResNet、Inception 及其衍生技術。

NiN 也使用了平均池化層作爲最後分類器的一部分,這是另一種將會變得常見的實踐。這是通過在分類之前對網絡對多個輸入圖像的響應進行平均完成的。

GoogLeNet 與 Inception

來自谷歌的 Christian Szegedy 開始追求減少深度神經網絡的計算開銷,並設計出 GoogLeNet——第一個 Inception 架構(參見:Going Deeper with Convolutions)。

那是在 2014 年秋季,深度學習模型正在變得在圖像與視頻幀的分類中非常有用。大多數懷疑者已經不再懷疑深度學習與神經網絡這一次是真的回來了,而且將一直發展下去。鑑於這些技術的用處,谷歌這樣的互聯網巨頭非常有興趣在他們的服務器上高效且大規模龐大地部署這些架構。

Christian 考慮了很多關於在深度神經網絡達到最高水平的性能(例如在 ImageNet 上)的同時減少其計算開銷的方式。或者在能夠保證同樣的計算開銷的前提下對性能有所改進。

他和他的團隊提出了 Inception 模塊:

初看之下這不過基本上是 1×1、3×3、5×5 卷積過濾器的並行組合。但是 Inception 的偉大思路是用 1×1 的卷積塊(NiN)在昂貴的並行模塊之前減少特徵的數量。這一般被稱爲「瓶頸(bottleneck)」。這部分內容將在下面的「瓶頸層(bottleneck layer)」部分來解釋。

GoogLeNet 使用沒有 inception 模塊的主幹作爲初始層,之後是與 NiN 相似的一個平均池化層加 softmax 分類器。這個分類器比 AlexNet 與 VGG 的分類器的運算數量少得多。這也促成一項非常有效的網絡設計,參見論文:An Analysis of Deep Neural Network Models for Practical Applications。

瓶頸層(Bottleneck layer)

受到 NiN 的啓發,Inception 的瓶頸層減少了每一層的特徵的數量,並由此減少了運算的數量;所以可以保持較低的推理時間。在將數據通入昂貴的卷積模塊之前,特徵的數量會減少 4 倍。在計算成本上這是很大的節約,也是該架構的成功之處。

讓我們具體驗證一下。現在你有 256 個特徵輸入,256 個特徵輸出,假定 Inception 層只能執行 3×3 的卷積,也就是總共要完成 256×256×3×3 的卷積(將近 589,000 次乘積累加(MAC)運算)。這可能超出了我們的計算預算,比如說,在谷歌服務器上要以 0.5 毫秒運行該層。作爲替代,我們決定減少需要進行卷積運算的特徵的數量,也就是 64(即 256/4)個。在這種情況下,我們首先進行 256 -> 64 1×1 的卷積,然後在所有 Inception 的分支上進行 64 次卷積,接而再使用一個來自 64 -> 256 的特徵的 1×1 卷積,現在運算如下:

256×64 × 1×1 = 16,000s

64×64 × 3×3 = 36,000s

64×256 × 1×1 = 16,000s

相比於之前的 60 萬,現在共有 7 萬的計算量,幾乎少了近 10 倍。

而且,儘管我們做了更好的運算,我們在此層也沒有損失其通用性(generality)。事實證明瓶頸層在 ImageNet 這樣的數據集上已經表現出了頂尖水平,而且它也被用於接下來介紹的 ResNet 這樣的架構中。

它之所以成功是因爲輸入特徵是相關聯的,因此可通過將它們與 1×1 卷積適當結合來減少冗餘。然後,在小數量的特徵進行卷積之後,它們能在下一層被再次擴展成有意義的結合。

Inception V3(還有 V2)

Christian 和他的團隊都是非常高產的研究人員。2015 年 2 月,Batch-normalized Inception 被引入作爲 Inception V2(參見論文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift)。Batch-normalization 在一層的輸出上計算所有特徵映射的均值和標準差,並且使用這些值規範化它們的響應。這相當於數據「增白(whitening)」,因此使得所有神經圖(neural maps)在同樣範圍有響應,而且是零均值。在下一層不需要從輸入數據中學習 offset 時,這有助於訓練,還能重點關注如何最好的結合這些特徵。

2015 年 12 月,該團隊發佈 Inception 模塊和類似架構的一個新版本(參見論文:Rethinking the Inception Architecture for Computer Vision)。該論文更好地解釋了原始的 GoogLeNet 架構,在設計選擇上給出了更多的細節。原始思路如下:

通過謹慎建築網絡,平衡深度與寬度,從而最大化進入網絡的信息流。在每次池化之前,增加特徵映射。

當深度增加時,網絡層的深度或者特徵的數量也系統性的增加。

使用每一層深度增加在下一層之前增加特徵的結合。

只使用 3×3 的卷積,可能的情況下給定的 5×5 和 7×7 過濾器能分成多個 3×3。看下圖

因此新的 Inception 成爲了:

也可以通過將卷積平整進更多複雜的模塊中而分拆過濾器:

在進行 inception 計算的同時,Inception 模塊也能通過提供池化降低數據的大小。這基本類似於在運行一個卷積的時候並行一個簡單的池化層:

Inception 也使用一個池化層和 softmax 作爲最後的分類器。

ResNet

2015 年 12 月又出現了新的變革,這和 Inception V3 出現的時間一樣。ResNet 有着簡單的思路:供給兩個連續卷積層的輸出,並分流(bypassing)輸入進入下一層(參見論文:Deep Residual Learning for Image Recognition)。

這和之前的一些舊思路類似。但 ResNet 中,它們分流兩個層並被應用於更大的規模。在 2 層後分流是一個關鍵直覺,因爲分流一個層並未給出更多的改進。通過 2 層可能認爲是一個小型分類器,或者一個 Network-In-Network。

這是第一次網絡層數超過一百,甚至還能訓練出 1000 層的網絡。

有大量網絡層的 ResNet 開始使用類似於 Inception 瓶頸層的網絡層:

這種層通過首先是由帶有更小輸出(通常是輸入的 1/4)的 1×1 卷積較少特徵的數量,然後使用一個 3×3 的層,再使用 1×1 的層處理更大量的特徵。類似於 Inception 模塊,這樣做能保證計算量低,同時提供豐富的特徵結合。

ResNet 在輸入上使用相對簡單的初始層:一個帶有兩個池的 7×7 卷基層。可以把這個與更復雜、更少直覺性的 Inception V3、V4 做下對比。

ResNet 也使用一個池化層加上 softmax 作爲最後的分類器。

關於 ResNet 的其他洞見每天都有發生:

ResNet 可被認爲既是平行模塊又是連續模塊,把輸入輸出(inout)視爲在許多模塊中並行,同時每個模塊的輸出又是連續連接的。

ResNet 也可被視爲並行模塊或連續模塊的多種組合(參見論文:Residual Networks are Exponential Ensembles of Relatively Shallow Networks)。

已經發現 ResNet 通常在 20-30 層的網絡塊上以並行的方式運行。而不是連續流過整個網絡長度。

當 ResNet 像 RNN 一樣把輸出反饋給輸入時,該網絡可被視爲更好的生物上可信的皮質模型(參見論文:Bridging the Gaps Between Residual Learning, Recurrent Neural Networks and Visual Cortex)。

Inception V4

這是 Christian 與其團隊的另一個 Inception 版本,該模塊類似於 Inception V3:

Inception V4 也結合了 Inception 模塊和 ResNet 模塊:

我認爲該架構不太簡潔,但也滿滿都是較少透明度的啓發法(heuristics)。很難理解裏面的選擇,對作者們而言也難以解釋。

考慮到網絡的簡潔性,可被輕易的理解並修正,那 ResNet 可能就更好了。

SqueezeNet 

SqueezeNet(參見論文:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size)是最近才公佈的,該架構是對 ResNet 與 Inception 裏面概念的重新處理。一個更好的架構設計網絡型號要小,而且參數還不需要複雜的壓縮算法

ENet

我們的團隊計劃結合近期公開的架構的所有特徵,做出一個非常高效、低重的網絡,使用較少的參數和計算就能達到頂尖結果。該網絡架構被稱爲 ENet,由 Adam Paszke 設計。我們已經使用它進行過單像素標記和場景解析。

詳細瞭解 ENet 可參見論文 ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation。ENet 是一個編碼加解碼的網絡。編碼器是一個常規的 CNN 設計進行分類。解碼器是一個增採樣(upsampling)網絡,將分類反向傳播給原始圖像進行分割。這隻使用了神經網絡,沒有其他算法進行圖像分割。

ENet 被設計爲在開始時儘可能使用最小數量的資源。正是如此它有着如此小的腳本,編碼器和解碼器網絡共佔有 0.7 MB,16 fp 精度。即使這麼小的型號,ENet 在分割的準確度上也類似於或者高於其他神經網絡解決方案。

模塊分析

對 CNN 模塊的分析,該論文(Systematic evaluation of CNN advances on the ImageNet)已經做過了,裏面的發現是非常有幫助的:

使用沒有 batchnorm 的 ELU 非線性或者有 batchnorm 的 ReLU。

使用一個學習到的 RGB 的彩色空間轉換。

使用線性學習率衰退策略。

使用平均和最大池化層的和。

使用大約 128 到 256 的 mini-batch 大小。如果這對你的 GPU 而言太大,將學習率按比例降到這個大小就行。

使用完全連接層作爲卷積,併爲做最後預測平均所有預測。

當研究增加訓練集大小的時候,檢測有一個 plateau 是否沒有達到

數據的整潔要比數據大小更重要。

如果你不能增加輸入圖像的大小,在隨後的層上減少步幅(stride),這樣做有同樣的效果。

如果你的網絡有複雜和高度優化的架構,像是 GoogLeNet,那修改一定要謹慎。

其他值得關注的架構

FractalNet(參見論文:FractalNet: Ultra-Deep Neural Networks without Residuals)使用遞歸架構,它在 ImageNet 上沒有進行測試。該架構是 ResNet 的衍生或者更通用的 ResNet。

未來

我們相信製作神經網絡架構是深度學習領域發展的頭等大事。我們團隊高度推薦仔細閱讀並理解文中提到的論文。

但有人可能會想爲什麼我們要投入如此多的時間製作架構?爲什麼不是用數據告訴我們使用什麼?如何結合模塊?這些問題很好,但仍在研究中,有一篇論文可以參考:Neural networks with differentiable structure。

要注意到,我們在本文中談到的大部分架構都是關於計算機視覺的。類似神經網絡架構在其他領域內也有開發,學習其他所有任務中的架構變革也是非常有趣的。

如果你對神經網絡架構和計算性能的比較有興趣,可參見論文:An Analysis of Deep Neural Network Models for Practical Applications。

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