從LeNet到GoogLeNet:逐層詳解,看卷積神經網路的進化

  • 2020 年 2 月 12 日
  • 筆記

作者 | MrCharles

來源 | CSDN原力計劃獲獎作品

前言

深度學習的興起使卷積神經網路在電腦視覺方面大放異彩,本文將按時間和創新點順序介紹一系列網路結構:LeNet、AlexNet、VGGNet、InceptionNet 與 ResNet。

網路上大部分文章都只是草草講述,本文小波仔仔細梳理,從問題的背景,網路結構,為什麼設計這樣的結構,參數數量各方面詳細講述CNN的進化之路。

LeNet

LeNet 是整個卷積神經網路的開山之作,是卷積神經網路的現代雛形,1998年由LeCun提出。最初設計的目的是識別手寫字母,被廣泛應用在美國支票手寫識別系統當中。

LeNet一共有7層(不包括輸入層)

  • 輸入層:

輸入影像的大小為3232,這要比mnist資料庫中的最大字母(2828)還大。

作用:影像較大,這樣做的目的是希望潛在的明顯特徵,比如筆畫斷續,角點等能夠出現在最高層特徵監測子感受野的中心。

  • 其他層:

C1,C3,C5為卷積層,S2,S4為降取樣層,F6為全連接層,還有一個輸出層。

每一個層都有多個Feature Map(每個Feature Map中含有多個神經元),輸入通過一種過濾器作用,提取輸入的一種特徵,得到一個不同的Feature Map。

  • C1層-卷積層
    • 輸入圖片:32*32
    • 卷積核大小:5*5
    • 卷積核種類:6
    • 輸出featuremap大小:28*28 (32-5+1)=28
    • 神經元數量:28286
    • 可訓練參數:(55+1) * 6(每個濾波器55=25個unit參數和一個bias參數,一共6個濾波器)
    • 連接數:(55+1)62828=122304
  • S2層-池化層(下取樣層)
    • 輸入:28*28
    • 取樣區域:2*2
    • 取樣方式:4個輸入相加,乘以一個可訓練參數,再加上一個可訓練偏置。結果通過sigmoid
    • 取樣種類:6
    • 輸出featureMap大小:14*14(28/2)
    • 神經元數量:14146
    • 可訓練參數:2*6(和的權+偏置)
    • 連接數:(22+1)61414

S2中每個特徵圖的大小是C1中特徵圖大小的1/4。

  • C3層-卷積層
    • 輸入:S2中所有6個或者幾個特徵map組合
    • 卷積核大小:5*5
    • 卷積核種類:16
    • 輸出featureMap大小:10*10 (14-5+1)=10

C3中的每個特徵map是連接到S2中的所有6個或者幾個特徵map的,表示本層的特徵map是上一層提取到的特徵map的不同組合。為什麼不把S2的每一個Feature Map連接到S3的每一個Feature Map中?原因有亮點:

  • 第一,不完全連接機制連接的數量保持在合理範圍,
  • 第二,這樣破壞了網路的對稱性,由於不同的Feature Map有不同的輸入,所以迫使他們抽取不同的特徵(理想狀態特徵互補)。

存在的一個方式是:C3的前6個特徵圖以S2中3個相鄰的特徵圖子集為輸入。接下來6個特徵圖以S2中4個相鄰特徵圖子集為輸入。然後3個以不相鄰的4個特徵圖子集為輸入。最後一個將S2中所有特徵圖為輸入。則:可訓練參數:6*(355+1)+6*(455+1)+3*(455+1)+1*(655+1)=1516。如下圖:

連接數:10101516=151600

  • S4層-池化層(下取樣層)
    • 輸入:10*10
    • 取樣區域:2*2
    • 取樣方式:4個輸入相加,乘以一個可訓練參數,再加上一個可訓練偏置。結果通過sigmoid
    • 取樣種類:16
    • 輸出featureMap大小:5*5(10/2)
    • 神經元數量:5516=400
    • 可訓練參數:2*16=32(和的權+偏置)
    • 連接數:16*(2*2+1)55=2000

S4中每個特徵圖的大小是C3中特徵圖大小的1/4

  • C5層-卷積層
    • 輸入:S4層的全部16個單元特徵map(與s4全相連)
    • 卷積核大小:5*5
    • 卷積核種類:120
    • 輸出featureMap大小:1*1(5-5+1)
    • 可訓練參數/連接:120*(1655+1)=48120
  • F6層-全連接層
    • 輸入:c5 120維向量
    • 計算方式:計算輸入向量和權重向量之間的點積,再加上一個偏置,結果通過sigmoid函數輸出。
    • 可訓練參數:84*(120+1)=10164

6層是全連接層。F6層有84個節點,對應於一個7×12的比特圖,-1表示白色,1表示黑色,這樣每個符號的比特圖的黑白色就對應於一個編碼。該層的訓練參數和連接數是(120 + 1)x84=10164。ASCII編碼圖如下:

所以知道為什麼要選擇84了吧。對應ASCII碼中每個字母的比特圖。

  • 輸出層

輸出層由歐式徑向基函數(Euclidean Radial Basis Function)單元組成,每類一個單元,每個單元有84個輸入。

也就是說:每個輸入RBF單元計算輸入向量和參數向量之間的歐氏距離。輸入離參數向量越遠,RBF輸出越大。一個RBF輸出可以理解為衡量輸入模式和RBF相關聯的一個模型的匹配程度的懲罰項。給定一個輸入模式,損失函數應該能使F6的配置和RBF參數向量(模式的期望分類)足夠接近。假設x是上一層的輸入,y是RBF的輸出,則RBF輸出的計算方式是:

每一個單元的參數是人工選取並保持固定的。這些參數向量的成分被設計成-1或1。雖然這些參數可以以-1或1等概論方式任取,或者是構成一個糾錯碼,但是被設計成一個相應字元類的7*12的格式化圖片。

總結

特點:

  • LeNet主要是卷積和下取樣相結合,雖然現在各位大神看著覺得不怎麼樣,可是在1998年,可是一個開創性的想法。他對後面所有CNN奠定了很重要的基礎。
  • LeNet是一種用於手寫體字元識別的非常高效的卷積神經網路。
  • 卷積神經網路能夠很好的利用影像的結構資訊。
  • 卷積層的參數較少,這也是由卷積層的主要特性即局部連接和共享權重所決定。

缺點:

  • 網路層數很淺
  • 沒有激活層

AlexNet

AlexNet由Alex Krizhevsky和Geoffrey Hinton 於2012年提出,奪得2012年ImageNet比賽的冠軍,top5預測的錯誤率為16.4%,遠超第一名。AlexNet採用8層的神經網路,5個卷積層和3個全連接層(3個卷積層後面加了最大池化層),包含6億3000萬個鏈接,6000萬個 參數和65萬個神經元。

AlexNet相比於LeNet,網路更深,第一次引入ReLu激活層,驗證了其效果在較深的網路中超過了Sigmoid,成功解決了Sigmoid在網路較深時的梯度彌散問題。

在全連接引入dropout防止過擬合。在機器學習模型訓練中,過擬合現象實在令人頭禿。Dropout 對防止過擬合有很好的效果。之後大量 Dropout 變體湧現,這項技術也成為機器學習研究者常用的訓練 trick。訓練時使用Dropout隨機忽略一部分神經元,以避免模型過擬合,一般在全連接層使用,在預測的時候是不使用Dropout的,即Dropout為1.19年6月,Google為該項技術申請了專利,而且這項專利已經生效!

在CNN中使用重疊的最大池化(步長小於卷積核)。此前CNN中普遍使用平均池化,使用最大池化可以避免平均池化的模糊效果。同時重疊效果可以提升特徵的豐富性。

提出LRN(Local Response Normalization,即局部響應歸一化)層,對局部神經元的活動創建競爭機制,使得其中響應比較大的值變得相對更大,並抑制其他回饋較小的神經元,增強了模型的泛化能力。

使用CUDA加速神經網路的訓練,利用了GPU強大的計算能力。

數據增強,隨機的從256256的圖片中截取224224大小的區域(以及水平翻轉的鏡像),相當於增加了(256-224)2*2=2048倍的數據量,如果沒有數據增強,模型會陷入過擬合中,使用數據增強可以增大模型的泛化能力。

由於AlexNet採用了兩個GPU進行訓練,因此,該網路結構圖由上下兩部分組成,一個GPU運行圖上方的層,另一個運行圖下方的層,兩個GPU只在特定的層通訊。例如第二、四、五層卷積層的核只和同一個GPU上的前一層的核特徵圖相連,第三層卷積層和第二層所有的核特徵圖相連接,全連接層中的神經元和前一層中的所有神經元相連接。

  • 第一層-卷積層
  • 輸入圖片:2242243 (RGB), 在訓練時會經過預處理Padding變為227×227×3
  • 卷積核大小:11113
  • 卷積核種類:96 (圖上是上下各48,兩個GPU分別承擔一半計算)
  • 輸出featuremap大小:55*55 (new_size=floor((img_size – filter_size)/stride) +1=(227-11)/4=55 )
  • 神經元數量:55x55x48x2=290400
  • 可訓練參數:(11113+1) * 96=34944(每個濾波器11113個unit參數和一個bias參數,一共96個濾波器)
  • ReLU

卷積後的55×55像素層經過ReLU單元的處理,生成激活像素層,尺寸仍為2組55×55×48的像素層數據。

  • 池化

RuLU後的像素層再經過池化運算,池化運算的尺寸為3×3,步長為2,則池化後影像的尺寸為 (55-3)/2+1=27,即池化後像素的規模為27×27×96

  • 歸一化

歸一化(normalization)的目的是「抑制」,局部歸一化就是來實現局部抑制,尤其當使用ReLU時,因為ReLU的響應結果是無界的(可以非常大),所以需要歸一化。使用局部歸一化的方案有助於增加泛化能力。LRN的核心思想就是利用臨近的數據做歸一化。LRN仿造生物學上活躍的神經元對相鄰神經元的抑制現象(側抑制)。

好處有以下兩點:

1)歸一化有助於快速收斂;

2)對局部神經元的活動創建競爭機制,使得其中響應比較大的值變得相對更大,並抑制其他回饋較小的神經元,增強了模型的泛化能力。

池化後的像素層再進行歸一化處理,歸一化運算的尺寸為5×5,歸一化後的像素規模不變,仍為27×27×96,這96層像素層被分為兩組,每組48個像素層,分別在一個獨立的GPU上進行運算。

  • 第二層-卷積層

和第一層類似,卷積–>ReLU–>池化–>歸一化。第二層的輸入數據為第一層輸出的27×27×96的像素層(被分成兩組27×27×48的像素層放在兩個不同GPU中進行運算),為方便後續處理,在這裡每幅像素層的上下左右邊緣都被填充了2個像素(填充0),即影像的大小變為 (27+2+2) ×(27+2+2)

  • 輸入圖片:313148 (2個GPU一共96)
  • 卷積核大小:5*5
  • 卷積核種類:256 (圖上是上下各128,兩個GPU分別承擔一半計算)
  • 輸出featuremap大小:27×27(new_size=floor((img_size – filter_size)/stride) +1=(31-5)/4+1=27)
  • 神經元數量:27×27x128x2=186624
  • 可訓練參數:(5548*128+128) * 2=307456
  • ReLU

這些像素層經過ReLU單元的處理,生成激活像素層,尺寸仍為兩組27×27×128的像素層。

  • 池化

再經過池化運算的處理,池化運算的尺寸為3×3,步長為2,池化後影像的尺寸為(27-3)/2+1=13,即池化後像素的規模為2組13×13×128的像素層

  • 歸一化

然後再經歸一化處理,歸一化運算的尺度為5×5,歸一化後的像素層的規模為2組13×13×128的像素層,分別由2個GPU進行運算。

  • 第三層(卷積層)

第三層的處理流程為:卷積–>ReLU

這一層中每個GPU都有192個卷積核,每個卷積核的尺寸是3×3×256。因此,每個GPU中的卷積核都能對2組13×13×128的像素層的所有數據進行卷積運算。如該層的結構圖所示,兩個GPU有通過交叉的虛線連接,也就是說每個GPU要處理來自前一層的所有GPU的輸入。

本層卷積的步長是1個像素,經過卷積運算後的尺寸為 (13+1+1-3)/1+1=13,即每個GPU中共13×13×192個卷積核,2個GPU中共有13×13×384個卷積後的像素層。

  • 輸入圖片:13×13×128 2個GPU一共84,每幅像素層的上下左右邊緣都填充1個像素,填充後變為 (13+1+1)×(13+1+1)×128,
  • 卷積核大小:3×3×256
  • 卷積核種類:192*2
  • 輸出featuremap大小:13×13(new_size=floor((img_size – filter_size)/stride) +1=(15-3)/1+1=13)
  • 神經元數量:13×13×192*2=64896
  • 可訓練參數:3x3x256x384+384=885120
  • ReLU

卷積後的像素層經過ReLU單元的處理,生成激活像素層,尺寸仍為2組13×13×192的像素層,分配給兩組GPU處理。

  • 第四層(卷積層)

和第三層類似,卷積–>ReLU

  • 輸入圖片:13×13×192 填充後的尺寸變為 (13+1+1)×(13+1+1)×192,分布在兩個GPU中進行運算。
  • 卷積核大小:3×3*192(與第三層不同,第四層的GPU之間沒有虛線連接,也即GPU之間沒有通訊,卷積的移動步長是1個像素)
  • 卷積核種類:192*2
  • 輸出featuremap大小:13 * 13 (new_size=floor((img_size – filter_size)/stride) +1 =(13+1+1-3)/1+1=13
  • 神經元數量:13x13x192x2=64896
  • 可訓練參數:(3x3x192x192+192)x2=663936
  • ReLU

卷積後的像素層經過ReLU單元處理,生成激活像素層,尺寸仍為2組13×13×192像素層,分配給兩個GPU處理。

  • 第五層(卷積層)

第五層的處理流程為:卷積–>ReLU–>池化

  • 輸入圖片:13×13×192 填充後的尺寸變為 (13+1+1)×(13+1+1)×192,分布在兩個GPU中進行運算。
  • 卷積核大小:3×3*128(GPU之間沒有通訊,卷積的移動步長是1個像素)
  • 卷積核種類:128*2
  • 輸出featuremap大小:13 * 13 (new_size=floor((img_size – filter_size)/stride) +1 =(13+1+1-3)/1+1=13
  • 神經元數量:13x13x128x2=43264
  • 可訓練參數:(3x3x192x128+128)x2=442624
  • ReLU

經過ReLU單元處理,生成激活像素層,尺寸仍為2組13×13×128像素層,由兩個GPU分別處理。

  • 池化

2組13×13×128像素層分別在2個不同GPU中進行池化運算處理,池化運算的尺寸為3×3,步長為2,池化後影像的尺寸為 (13-3)/2+1=6,即池化後像素的規模為兩組6×6×128的像素層數據,共有6×6×256的像素層數據。

  • 第六層(全連接層)

處理流程為:卷積(全連接)–>ReLU–>Dropout

  • 輸入圖片:6×6×256
  • 卷積核大小:6×6×256 (卷積核的尺寸剛好與待處理特徵圖(輸入)的尺寸相同,即卷積核中的每個係數只與特徵圖(輸入)尺寸的一個像素值相乘,一一對應,因此,該層被稱為全連接層。)
  • 卷積核種類:4096
  • 輸出featuremap大小:4096×1×1
  • 神經元數量:4096
  • 可訓練參數:(6x6x128x2)x4096+4096=37752832
  • 第七層(全連接層)

全連接–>ReLU–>Dropout

第六層輸出的4096個數據與第七層的4096個神經元進行全連接,然後經ReLU進行處理後生成4096個數據,再經過Dropout處理後輸出4096個數據。

  • 神經元數量:4096
  • 可訓練參數:4096×4096+4096=16781312
  • 第八層(全連接層)

處理流程為:全連接

第七層輸出的4096個數據與第八層的1000個神經元進行全連接,經過訓練後輸出1000個float型的值,這就是預測結果。

  • 神經元數量:4096
  • 可訓練參數:4096×1000+1000=4097000

總結

  • 神經元數量總數:809800
  • 可訓練參數:60965224
  • 卷積層參數:2334080,佔總參數的3.8%
  • 全連接層參數:58631144,佔總參數量的96.2% 說明全連接還是佔了大部分的參數

一些人提出的改進可能:

  • 第一個卷積層使用的是11*11的濾波器,導致無法提取更細粒度的特徵,是否可以使用更多更小的濾波器來代替第一個卷積層
  • LRN在往後的演算法中效果不是很大,所以用的人並不多。
  • 相比於LeNet,一共有八層,但是還能使用更多層的結構么?

VGGNet

前面我們很詳細的講了AlexNet的結構,參數,特點。一個是卷積核很大,無法提取更細粒度的特徵。再一個AlexNet只有八層結構,加深是否可以達到更好的精度呢?

2014年,牛津大學電腦視覺組(Visual Geometry Group)和Google DeepMind公司的研究員一起研發出了新的深度卷積神經網路:VGGNet,並取得了ILSVRC2014比賽分類項目的第二名(第一名是GoogLeNet,也是同年提出的)和定位項目的第一名。VGGNet可以看成是加深版本的AlexNet,都是由卷積層、全連接層兩大部分構成。

VGG16相比AlexNet的一個改進是採用連續的幾個3×3的卷積核代替AlexNet中的較大卷積核(11×11,7×7,5×5)。對於給定的感受野(與輸出有關的輸入圖片的局部大小),採用堆積的小卷積核是優於採用大的卷積核,因為多層非線性層可以增加網路深度來保證學習更複雜的模式,而且代價還比較小(參數更少)。比如,3個步長為1的3×3卷積核的一層層疊加作用可看成一個大小為7的感受野(其實就表示3個3×3連續卷積相當於一個7×7卷積),其參數總量為 3x(9xC2) 3x(9xC^2)3x(9xC 2 ) ,如果直接使用7×7卷積核,其參數總量為 49xC2 49xC^249xC 2,這裡 C 指的是輸入和輸出的通道數。很明顯,27xC2 27xC^227xC 2小於49xC2 49xC^249xC 2,即減少了參數;而且3×3卷積核有利於更好地保持影像性質。

具體而言,VGGNet 用2個3×3卷積核可以來代替5*5卷積核,如下圖所示,5×5卷積看做一個小的全連接網路在5×5區域滑動(最底層5×5),我們可以先用一個3×3的卷積濾波器卷積(中間層),然後再用一個全連接層連接這個3×3卷積輸出(頂層,頂層就等價於5×5的卷積了),這個全連接層我們也可以看做一個3×3卷積層。這樣我們就可以用兩個3×3卷積級聯(疊加)起來代替一個 5×5卷積。

VGG增加網路的深度能夠在一定程度上影響網路最終的性能,使錯誤率大幅下降,同時拓展性又很強,遷移到其它圖片數據上的泛化性也非常好。VGGNet論文中分別使用了A、A-LRN、B、C、D、E6種網路結構進行測試,如下圖:

小波仔以網路結構D(VGG16)為例,介紹其處理過程,請對比上面的表格和開始的架構圖,以及下面的圖:

A、A-LRN、B、C、D、E這6種網路結構的深度雖然從11層增加至19層,但參數量變化不大,這是由於基本上都是採用了小卷積核(3×3,只有9個參數),這6種結構的參數數量(百萬級)並未發生太大變化,這是因為在網路中,參數主要集中在全連接層。經作者對A、A-LRN、B、C、D、E這6種網路結構進行單尺度的評估,錯誤率結果如下:

我們在AlexNet中就已經講過,LRN可能不是那麼有用,在上表VGG也證實這一點。VGG也證實,隨著深度增加,分類性能逐漸提高(A、B、C、D、E。同時我們也發現,多個小卷積核比單個大卷積核性能好。

  • VGG16的特點總結:

1、通過增加深度能有效地提升性能;

2、最佳模型:VGG16,從頭到尾只有3×3卷積與2×2池化,簡潔優美;

3、卷積可代替全連接,可適應各種尺寸的圖片

4、池化核變小,VGG中的池化核是2×2,stride為2,Alexnet池化核是3×3,步長為2

然而VGG並不是完美的,稍加計算我們就會發現,VGG、AlexNet的絕大多數參數都集中於最後幾個全連接層上,然而全連接層這玩意不僅線性強,參數多,還容易過擬合。我們同時還要問一句,模型還可以更深么?

GoogleNet / InceptionNet

從前面的討論可以看到,VGG16這類模型仍然還有很多不夠完美的地方。在VGG之前就已經有一篇文章《Provable Bounds for Learning Some Deep Representations》嘗試闡述了sparsely connected architectures,即「稀疏連接結構」,從本質上提高網路性能. 傳統的提高網路精度的方法,也就是擴大網路規模或增大訓練數據集,可能並不是一個很好的方法,這帶來兩個問題:一是網路參數量的急劇增加會導致網路陷入過擬合,尤其是對小數據集而言;二是消耗巨大的計算資源。

而想從本質上提高網路性能,就得用「稀疏連接結構」。

這個觀點有兩方面解釋:一方面,現實中的生物神經網路連接本身就是稀疏的;另一方面,Arora等人證明,對於大規模的稀疏網路,可通過分析前一層激活值的相關統計數據和對高度相關的輸出神經元聚類來逐層構建最優的網路結構。這種方法可以在不損失性能的前提下降低網路參數量。

實際上,傳統的網路基本都使用了隨機稀疏連接。但是,電腦對非均勻稀疏數據的計算非常低效,所以在AlexNet中又重新使用了全連接層,目的是就為了更好地進行並行運算。

那麼問題來了,是不是有一種方法既能夠保持網路結構的稀疏性,並且充分利用密集矩陣的高效計算?還真有。大量文獻表明對稀疏矩陣進行聚類為密集矩陣可以提高性能。Inception module就是基於這種思想提出來的。

下圖為Google提出的Inception module的基本結構:

該結構採用了四個分支,每個分支分別由1×1卷積、3×3卷積、5×5卷積和3x3max pooling組成,既增加了網路的寬度,也增加了網路對不同尺度的適用性。四個分支輸出後在通道維度上進行疊加,作為下一層的輸入。四個分支輸出的feature map的尺寸可由padding的大小進行控制,以保證它們的特徵維度相同(不考慮通道數)。原來造神經網路,都是一條線下來,我們可以回想一下AlexNet、VGG等著名網路,而IA是「分叉-匯聚」型網路,也就是說在一層網路中存在多個不同尺度的kernels,卷積完畢後再匯聚。

但是,3×3和5×5卷積依然會帶來很大的計算量。假如branch1x1、branch3x3、branch5x5都有256個kernels,加上branch_pool的kernels(假定為256),經過tf.concat操作,最終的kernels是256×4=1024個kernels!受Network in Network的啟發,作者使用1×1卷積對特徵圖厚度進行降維,這就是Inception v1的網路結構,如下:

那麼加進去的1×1卷積的作用是什麼呢?主要是兩個:

  1. 實現跨通道的交互和資訊整合
  2. 進行卷積核通道數的降維和升維

對於單通道的feature map和單個卷積核之間的卷積來說,CNN里的卷積大都是多通道的feature map和多通道的卷積核之間的操作(輸入的多通道的feature map和一組卷積核做卷積求和得到一個輸出的feature map),如果使用1×1的卷積核,這個操作實現的就是多個feature map的線性組合,可以實現feature map在通道個數上的變化。接在普通的卷積層的後面,配合激活函數,就可以實現network in network的結構了。

對於每一個Inception模組(如上圖a,b),原始模組是a,b圖中是加入了1×1卷積進行降維的。雖然a圖的卷積核都比較小,但是當輸入和輸出的通道數很大時,乘起來也會使得卷積核參數變的很大,而b圖加入1×1卷積後可以降低輸入的通道數,卷積核參數、運算複雜度也就跟著降下來了。

以GoogLeNet的3a模組為例,輸入的feature map是28×28×192,3a模組中1×1卷積通道為64,3×3卷積通道為128,5×5卷積通道為32,如果是a圖結構,那麼卷積核參數為1×1×192×64+3×3×192×128+5×5×192×32,而b圖對3×3和5×5卷積層前分別加入了通道數為96和16的1×1卷積層,這樣卷積核參數就變成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),參數大約減少到原來的三分之一。

同時在並行pooling層後面加入1×1卷積層後也可以降低輸出的feature map數量,a圖pooling後feature map是不變的,再加卷積層得到的feature map,會使輸出的feature map擴大到416,如果每個模組都這樣,網路的輸出會越來越大。而b圖在pooling後面加了通道為32的1×1卷積,使得輸出的feature map數降到了256。GoogLeNet利用1×1的卷積降維後,得到了更為緊湊的網路結構,雖然總共有22層,但是參數數量卻只是8層的AlexNet的十二分之一(當然也有很大一部分原因是去掉了全連接層)。

基於Inception的GoogLeNet網路結構如下:

GoogLeNet一共包含22層,網路參數量只有Alexnet的1/12。但是隨著網路層數的加深,梯度彌散的問題依然存在,所以作者在中間層加入兩個輔助的softmax,以此增加反向傳播的梯度大小,同時也起到了正則化的作用。在計算網路損失的時候,中間的輔助softmax loss會乘以一個權重(0.3)加入到最後層的loss值中。在預測時,則忽略中間softmax層的輸出。GoogLeNet也可以看做Hebbian Principle的應用:進入第一個inception前,feature map為 56×56,經過兩個inception後,縮小為28×28,經過7個inception後變成14×14,經過9個inception後為7×7。最後通過7×7的average pool變成1×1。

ResNet

根據通用逼近定理,給定足夠的容量,我們知道具有單層的前饋網路足以表示任何功能。但是,該層可能很龐大,並且網路傾向於過度擬合數據。因此,研究社區有一個共同的趨勢,那就是我們的網路架構需要更深入地研究。

自從AlexNet以來,最先進的CNN架構越來越深入。雖然AlexNet只有5個卷積層,但VGG網路和GoogleNet(也代號為Inception_v1)分別有19和22層。

但是,僅通過將層堆疊在一起,無法增加網路深度。由於臭名昭著的消失的梯度問題,難以訓練深層網路-隨著梯度向後傳播到較早的層,重複相乘可能會使梯度無限小。結果,隨著網路的不斷深入,其性能將達到飽和甚至開始迅速下降。

圖:網路深度的增加導致性能下降

在ResNet之前,有幾種方法可以解決消失的梯度問題,例如,Inception_v1在中間層添加了輔助損失作為額外的監督,但似乎沒有一種方法能夠一勞永逸地解決該問題。

ResNet的核心思想是引入一個跳過一層或多層的所謂「身份快捷方式連接」,如下圖所示:

ResNet的作者認為,堆疊層不應降低網路性能,因為我們可以簡單地在當前網路上堆疊身份映射(不執行任何操作的層),並且最終的架構將執行相同的操作。這表明,較深的模型不應產生比其較淺的模型更高的訓練誤差。他們提出讓堆疊的層(stacked layers)擬合殘差映射 residual mapping比讓它們直接擬合desired underlaying mapping更容易。上面的residual block允許它精確地做到這一點。

實際上,ResNet並不是第一個使用shortcut connections的,Highway Network引入了 gated shortcut connections。這些參數化的門控制允許多少資訊流過shortcut connection。在長期短期記憶(LSTM)單元中可以找到類似的想法,在該單元中,有一個參數化的「忘記門」,該門控制著多少資訊將流向下一個時間步。因此,可以將ResNet視為Highway Network的特例。

但是,實驗表明,Highway Network的性能並不比ResNet好,這很奇怪,因為Highway Network的解決方案空間包含ResNet,因此其性能至少應與ResNet一樣好。這表明保持這些「gradient highways」的通行性比尋求更大的solution space更為重要。

根據這種直覺,ResNet的作者改進了residual block並提出了一個預激活的residual block,其中gradients 可以無阻礙地通過shortcut connections流到任何其他較早的層。實際上,使用ResNet中的原始residual block,訓練1202層的ResNet會比110層的ResNet表現差。

預激活的residual block的作者通過實驗證明,他們現在可以訓練1001層深的ResNet來勝過其較淺的ResNet。由於其出色的結果,ResNet迅速成為各種電腦視覺任務中最受歡迎的體系結構之一。

InceptionNet V4: Inception-ResNet

受ResNet性能的啟發,InceptionNet 提出了一種混合模型。Inception ResNet有兩個子版本,即v1和v2。在討論主要功能之前,讓我們看一下這兩個子版本之間的細微差異。

  1. Inception-ResNet v1的計算成本與Inception v3相似。
  2. Inception-ResNet v2的計算成本與Inception v4相似。
  3. 它們具有不同的主幹
  4. 兩個子版本對於模組A,B,C和reduction blocks具有相同的結構。唯一的區別是超參數設置。

總體而言,就是引入 residual connections ,這些 residual connections 將 inception module的卷積運算的輸出添加到輸入中。為了進行residual addition 運算,卷積後的輸入和輸出必須具有相同的尺寸。因此,我們在原始卷積之後使用1×1卷積,以匹配深度大小(卷積後深度增加)。

(從左起)Inception modulesA(尺寸從35×35減小到17×17)和Inception modulesB(尺寸從17×17減小到8×8)。

為有利於residual connections,主要inception modules內部的pooling 操作已替換。但是,您仍然可以在reduction blocks中找到這些操作。reduction blocks A與Inception v4 (本位沒有介紹,但是和 Inception-ResNet同一篇論文)相同。

如果過濾器的數量超過1000,則具有較深單元的網路會導致網路「死亡」。因此,為了提高穩定性,作者將殘餘激活值的範圍定為0.1到0.3。

求和後,原始論文沒有使用BatchNorm在單個GPU上訓練模型(以在單個GPU上擬合整個模型)。結果發現,Inception-ResNet模型能夠在較低的時期實現較高的精度。

Inception v4和Inception-ResNet的最終網路布局如下:

頂部影像是Inception v4的布局。底部影像是Inception-ResNet的布局。(來源:[Inception v4](https://arxiv.org/pdf/1602.07261.pdf))

Reference: GoogLeNet (Inception v1)— Winner of ILSVRC 2014 (Image Classification

https://medium.com/coinmonks/paper-review-of-googlenet-inception-v1-winner-of-ilsvlc-2014-image-classification-c2b3565a64e7