引領深度學習革命--CNN架構全解析

這篇文章主要講述的是CNN的各種變體,在ImageNet上都曾大方異彩。當然,前提如果還不知道什麼是卷積神經網路(CNN)的話,請移步到之前文章:全面了解卷積神經網路

加上目錄:

  1. AlexNet
  2. VGGNet
  3. Network in Network
  4. GoogLeNet
  5. resnet--殘差網路
  6. ImageNet挑戰賽總結
  7. 後續工作

先簡單說說深度上的變化,其實在ImageNet這個比賽來說,是一年更比一年深,到了2015殘差網路,作者在論文中甚至說他試過用1000多層,只是它的效果和100多層的效果差不多,所以也就用100多層的網路作為最後選擇。下面是直觀的描述深度上的變化:

圖來自網上

當然,從AlexNet到ResNet的變化,肯定不止表現在深度上,他們的結構各有特點。下面,我們就將他們結構上的特點一一說明,如下:

AlexNet

AlexNet的結構

2012,大神Alex Krizhevsky率先將深度學習網路用於imagenet挑戰賽的圖片識別分類,並獲得突破性的效果。這個神經網路結構被稱為AlexNet。(如上圖)網路大體結構上是前面5層是卷積層,後面三層是全連接層,最終softmax輸出是1000類。當然,在前面的卷積層之間有Local Response Normalization和Overlap Pooling。整體架構來說是普通的CNN,至於其主要特點和創新如下:

數據準備

我們在做圖像處理的時候,只需要數據零中心話即可,其實這也是深度學習端到端的要義-直接輸入原始數據,僅僅需要一個模型,不用很多的預處理,其他模塊,然後就可以輸出結果。而不是像傳統系統,要幾個模塊的設計(比如:機器翻譯 要設計翻譯模型 語言模型 調序模型等)

原文描述:We did not pre-process the images in any other way, except for subtracting the mean activity over the training set from each pixel.So we trained our network on the (centered) raw RGB values of the pixels.

激活函數選擇ReLU :

相對於選擇那些會飽和的激活函數,例如tanh,sigmod函數,用ReLU激活函數是最快的。從下面圖中我們也可以看的出來。這個特性在這種深層大型的神經網路中是非常重要的!同時需要注意的是現在大部分的深度神經網路都選擇這個作為激活函數

上圖是tanh和Relu激活函數在CIFAR-10任務上收斂速度的對比,具體來說Relu比tanh快差不多6倍。實線表示的是Relu

Local Response Nomalization

ReLU本來是不需要對輸入進行標準化的,但在篇論文中發現進行局部標準化能提高性能。然後設計了LRN,靈感來源於生物的神經結構,也就是活躍的神經元對相鄰神經元的抑制現象(側抑制),其公式為(具體解釋不詳細講,可以看看論文):

還有需要注意的是,Alexnet用了兩個GPU來進行訓練,然後卷積只在某一層進行交叉鏈接。這樣可以加快訓練,但效果也不會被影響。

最後原文:ImageNet Classification with Deep Convolutional Neural Networks

VGGNet

VGGNet由牛津大學的視覺幾何組(Visual Geometry Group)提出,其主要的貢獻在於證明使用很小的卷積(3*3),增加網路深度可以有效提升模型的效果,而且VGGNet對其他數據集具有很好的泛化能力。

在結構上,VGGnet其實和一開始的AlexNet在結構上沒有什麼太大的差別,不同的就是:

  1. 卷積層使用更小的尺寸和間隔(kernel size=3, stride=1), AlexNet(kernel size=11, stride=4)。然後更加的深了。這樣可以減少參數(論文中有舉例),並且可以得到更多的特徵,經過三層非線性激活函數也增加了非線性的特性。
  2. 然後VGGNet使用了1X1卷積核。作用是可以在保持feature map 尺寸不變(即不損失解析度)的前提下大幅增加非線性特性,把網路做得很深。對於1X1卷積核,下面要講的GoogLeNet和ResNet同樣使用了,具體的下面講。
  3. 雖然比於AlexNet網路更深,但文章推測VGGNet在更少的周期內就能收斂,原因有二個,一個是更大的深度和更小的卷積帶來隱式的正則化;第二個是一些層的預訓練。
  4. 最後是VGGNet不使用局部響應標準化(LRN),因為這樣的標準化並不能在ILSVRC數據集上提升性能,卻導致更多的內存消耗和計算時間。

VGGnet和Alexnet主要的不同就是以上4點,其他基本不變,這裡就不詳細講了,附上原文:Very Deep Convolutional Networks for Large-Scale Image Recognition

Network in Network

這是14年ICLR的一篇paper,雖不是在imagenet上的冠軍模型,但其採用了少量的參數就鬆鬆擊敗了Alexnet網路,Alexnet網路參數大小是230M,採用這篇paper的演算法僅僅29M,減小近10倍,且之後GoogLeNet,ResNet也有對這篇有非常多借鑒,比如1*1的卷積核。所以總的來說很有必要了解。

該論文主要的contribution是提出mlpconv,相比於傳統的卷積神經網路來說不易過擬合,而且可以進行全局平均池化。下面具體講述一些創新點:

卷積層的改進--mlpconv

之前同樣的卷積層可以認為是線性的, 因為只是局部接收域與卷積核進行加權求和,然後可能接一個relu激活函數,但它的抽象提取特徵的能力還是不夠的。所以,在這篇文章中,引入了mlpconv。提出了 mlpcon 結構,它用多層的感知器(多層的全連接層)來替代單純的卷積神經網路中的加權求和,也就是原來的feature map經過MLP的映射再輸出。其中 mlpcon 指的是: multilayer perceptron + convolution,mlp被共享於所有的局部感受野。如下圖所示:

其實和原來的差別就體現在中間接了MLP層,這樣可以提高其非線性。如上圖右,提高每一層卷積層對於複雜特徵的識別能力,這裡舉個可能不那麼恰當的例子,傳統的CNN網路,每一層的卷積層相當於一個只會做單一任務,你必須要增加海量的卷積核來達到完成特定量類型的任務,而MLPconv的每層conv有更加大的能力,每一層能夠做多種不同類型的任務,在選擇卷積核時只需要很少量的部分

整體結構

可以看到就是多個MLPconv結構組合,再之後接上global average pooling組成:

Network in Network

1×1卷積的作用

1×1的卷積層引起人們的重視應該就是在NIN的結構中,論文中利用MLP代替傳統的線性卷積核,從而提高網路的表達能力。文中同時利用了跨通道pooling的角度解釋,認為文中提出的MLP其實等價於在傳統卷積核後面接cccp層,從而實現多個feature map的線性組合,實現跨通道的信息整合。而cccp層是等價於1×1卷積的,因此細看NIN的caffe實現,就是在每個傳統卷積層後面接了兩個cccp層(其實就是接了兩個1×1的卷積層)。這就實現跨通道的交互和信息整合。

使用全局均值池化

論文中還採用全局均值池化來解決傳統CNN網路中最後全連接層參數過於複雜的特點,而且全連接會造成網路的泛化能力差,(Alexnet中使用dropout來提高網路的泛化能力),至於global average pooling 與average pooling的區別如下:

如最後一個卷積層輸出10個feature map,average pooling 是對每個feature map分別求平均,輸出10個feature map。 global average pooling是對每個feature map內部取平均,每個feature map變成一個值(因為kernel的大小設置成和feature map的相同),10個feature map就變成一個10維的向量,然後直接輸入到softmax中。如下圖

其實簡單理解就是在原始的CNN中10個feature map的話經過average pooling輸出的不一定是一個值,而global average pooling輸出的就一定是一個值

最後附上原文:Network In Network

GoogLeNet

14年的模型。一般來說,提升網路性能最直接的辦法就是增加網路深度和寬度,這也就意味著巨量的參數。但是,巨量參數容易產生過擬合也會大大增加計算量。而本文為了稀疏矩陣聚類為較為密集的子矩陣來提高計算性能,提出了名為Inception 的結構,並以此來解決網路深度變得很深所帶來的計算量和性能問題。

Inception結構

採用不同大小的卷積核表示不同大小的感受野,後面的拼接表示不同尺度特徵的融合,其中卷積核大小採用1、3和5,這主要是為了方便對齊。然後網路越到後面,特徵就越抽象,空間集中性會降低,需要的感受野更大,因此3x3和5x5的卷積核在更高層會比較多。還有就是pooling層的加入效果更好,所以在中間也加了pooling層,提高效率。

應用1×1卷積來降維

前面因為使用3x3或者5x5的卷積核仍然會帶來巨大的計算量。 因此,文章借鑒NIN,採用1x1卷積核來降維,從而減少參數。

舉個例子:以前一個圖GoogLeNet的a結構為例,輸入的feature map是28×28×192,a結構中1×1卷積通道為64,3×3卷積通道為128,5×5卷積通道為32,那麼卷積核參數為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),參數大約減少到原來的三分之一。

總結一下,採用Inception的架構的兩個主要優點:一是允許顯著增加每一步的單元數目,計算複雜性不會不受控制。降維的普遍使用能保護最後一步到下一層的大量輸入濾波器,在對它們 用大的patch size卷積前首先降維。二是視覺信息在不同的尺度上進行處理然後聚合,這樣下一步可以同時從不同尺度提取特徵。 採用了Inception模塊的網路要比沒有採用Inception模塊的同樣架構的網路快2~3倍。

下面是總體架構,ImageNet比賽上一共22層,比VGG還多幾層。

附上論文原文:Going deeper with convolutions

resnet--殘差網路

網路的層數越多,意味著能夠提取到不同level的特徵越豐富。並且,越深的網路提取的特徵越抽象,越具有語義信息。但如果簡單地增加深度,會導致梯度彌散或梯度爆炸。即使是增加正則化初始化和中間的正則化層(Batch Normalization),也只能到幾十層的網路。如果變得更深,就會出現退化問題,所謂的退化問題,就是隨著網路層數增加,但是在訓練集上的準確率卻飽和甚至下降了。這個不能解釋為overfitting,因為overfit應該表現為在訓練集上表現更好才對。退化問題也說明了深度網路不能很簡單地被很好地優化。

同時作者通過實驗表明通過淺層網路加上y=x 等同映射構造深層模型,結果深層模型並沒有比淺層網路有等同或更低的錯誤率,推斷退化問題可能是因為深層的網路並不是那麼好訓練,也就是求解器很難去利用多層網路擬合同等函數。為了解決退化問題,提高網路性能,作者變設計出了下面的殘差結構:

殘差塊結構

如果深層網路的後面那些層是恆等映射,那麼模型就退化為一個淺層網路。那現在要解決的就是學習恆等映射函數了。 但是直接讓一些層去擬合一個潛在的恆等映射函數H(x) = x,比較困難,這可能就是深層網路難以訓練的原因。但是,如果把網路設計為H(x) = F(x) + x,如下圖。我們可以轉換為學習一個殘差函數F(x) = H(x) - x. 只要F(x)=0,就構成了一個恆等映射H(x) = x. 而且,擬合殘差肯定更加容易。

通過求偏導我們就能看到,F(X)就是擬合殘差,x就是之前的函數結果,兩個相加就可以得到更加好的結果。

它有二層,如下表達式,其中σ代表非線性函數ReLU

然後通過一個shortcut,和第2個ReLU,獲得輸出y

當需要對輸入和輸出維數進行變化時(如改變通道數目),可以在shortcut時對x做一個線性變換 W_s ,如下式,然而實驗證明x已經足夠了,不需要再搞個維度變換,除非需求是某個特定維度的輸出,如文章開頭的resnet網路結構圖中的虛線,是將通道數翻倍。

需要注意的是:這個殘差塊往往需要兩層以上,單單一層的殘差塊 (y=W_1x+x) 並不能起到提升作用。

同時下面借用知乎用戶 @The one 在resnet(殘差網路)的F(x)究竟長什麼樣子?的回答,進一步理解殘差網路:

上面F是求和前網路映射,H是從輸入到求和後的網路映射。

比如把5映射到5.1,

那麼引入殘差前是F(5)=5.1,

引入殘差後是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。

這裡的F和F都表示網路參數映射,引入殘差後的映射對輸出的變化更敏感。比如原來是從5.1到5.2,映射F的輸出增加了1/51=2%,而對於殘差結構從5.1到5.2,映射F是從0.1到0.2,增加了100%。明顯後者輸出變化對權重的調整作用更大,所以效果更好。

殘差的思想都是去掉相同的主體部分,從而突出微小的變化,看到殘差網路我第一反應就是差分放大器...

從building block到bottleneck

作者探索的更深的網路。 考慮到計算的成本,將原來的building block(殘差學習結構)改為瓶頸結構。如下圖,首端和末端的1x1卷積用來削減和恢復維度,相比於原本結構,只有中間3x3成為瓶頸部分。這兩種結構的時間複雜度相似。此時投影法映射帶來的參數成為不可忽略的部分(以為輸入維度的增大),所以要使用zero padding的同等映射。

bottleneck替換原本ResNet的殘差學習結構,同時也可以增加結構的數量,網路深度得以增加。生成了ResNet-50,ResNet-101,ResNet-152. 隨著深度增加,因為解決了退化問題,性能也不斷提升。

換一個角度,有論文具體的觀點如下:殘差網路並不是一個真正意義上極深的網路,而是隱式地由指數個大部分為淺層網路疊加而成的。由此該論文指出,查看網路之後除了可以看width和depth,其實還有另外一個維度就是multiplicity。該文章中比較關鍵的一個理論證明插圖如下:

我們發現,其實殘差網路和dropout有類似的功能,其實也可以用上面的圖,一條路徑就代表這一個網路的話,那麼就是和dropout類似的,這樣集成正則化的方式,也是能有效採用這樣的加深網路的方式來提升模型性能。

以上觀點來自:Residual Networks are Exponential Ensembles of Relatively Shallow Networks

resnet中1*1卷積的作用

和GooLeNet一樣,ResNet同樣也利用了1×1卷積,並且是在3×3卷積層的前後都使用了,不僅進行了降維,還進行了升維,使得卷積層的輸入和輸出的通道數都減小,參數數量進一步減少.

整體網路結構

作者由VGG19設計出了plain 網路和殘差網路,如下圖中部和右側網路。然後利用這兩種網路進行實驗對比。

最後附上原文:Deep Residual Learning for Image Recognition

ImageNet挑戰賽總結

從2009到2017,ImageNet的8年歷史,真可謂是直接代表深度學習的革命引領。先看下圖:

可以看到,一年一年都有結構上的創新,不止深度上的變化,top 5 error也從28.2%到3.57%(top 5 error,表示最後概率向量最大的前五名中出現了正確概率即為預測正確。上面的表示錯誤率),超過了接受過訓練的人在ImageNet數據集上對圖片進行分類的成績(5.1%)。

後續工作

在2016年的ImageNet挑戰賽中,演算法上基本沒有創新,大多都是ensemble models....相應的知乎討論:如何評價ILSVRC2016的比賽結果?

然後在2017,最後一屆的挑戰賽,具體冠軍模型,可以看看這個知乎問題:如何評價Momenta ImageNet 2017奪冠架構SENet?本文先不做具體講述。

推薦閱讀:

TAG:深度學習DeepLearning | 機器學習 | 人工智慧 |