1. 程式人生 > >殘差結構詳解

殘差結構詳解

背景知識:

  1. 為什麼要構建深層網路?
    答:認為神經網路的每一層分別對應於提取不同層次的特徵資訊,有低層,中層和高層,而網路越深的時候,提取到的不同層次的資訊會越多,而不同層次間的層次資訊的組合也會越多。
  2. ResNets為什麼能構建如此深的網路?
    答:深度學習對於網路深度遇到的主要問題是梯度消失和梯度爆炸,傳統對應的解決方案則是資料的初始化(normlized initializatiton)和(batch normlization)正則化,但是這樣雖然解決了梯度的問題,深度加深了,卻帶來了另外的問題,就是網路效能的退化問題,深度加深了,錯誤率卻上升了,而殘差用來設計解決退化問題,其同時也解決了梯度問題,更使得網路的效能也提升了。

普通網路(Plain network),類似VGG,沒有殘差,憑經驗會發現隨著網路深度的加深,訓練錯誤會先減少,然後增多(並證明的錯誤的增加並不是由於過擬合產生,而是由於網路變深導致難以訓練)。從理論上分析,網路深度越深越好。但實際上,如果沒有殘差網路,對於一個普通網路來說,深度越深意味著用優化演算法越難訓練。實際上,隨著網路深度的增加,訓練誤差會越來越多,這被描述為網路退化。
ResNets的提出,可以解決上述問題,即使網路再深嗎,訓練的表現仍表現很好。它有助於解決梯度消失和梯度爆炸問題,讓我們在訓練更深網路的同時,又能保證良好的資訊。


殘差結構示意圖
在這裡插入圖片描述
殘差網路的設計思想


殘差元的主要設計有兩個,快捷連線和恆等對映,快捷連線使得殘差變得可能,而恆等對映使得網路變深,而恆等對映主要有兩個:跳躍連線和啟用函式。
在這裡插入圖片描述

實驗證明殘差塊往往需要兩層以上,單單一層的殘差塊 y = W 1 x

+ x y=W_1*x+x 並不能起作用。
實際中,考慮計算的成本,對殘差塊做了計算優化,即將兩個3x3的卷積層替換為1x1 + 3x3 + 1x1, 如下圖。新結構中的中間3x3的卷積層首先在一個降維1x1卷積層下減少了計算,然後在另一個1x1的卷積層下做了還原,既保持了精度又減少了計算量。
在這裡插入圖片描述

ResNet就是用這種跳躍結構來作為網路的基本結構。
假如本來我們要優化的目標是H(x)=F(x)+ x,但通過這個結構就把優化的目標有H(x)轉化成H(x)- x。


為什麼經過優化目標轉化後就可以解決退化問題呢?我們之前說到,深層網路在淺層網路的基礎上只要上面幾層做一個等價對映就可以達到淺層網路同樣的效果,但是為什麼不行呢?就是因為我們的演算法很難將其訓練到那個程度,也就是沒辦法將上面幾層訓練到一個等價對映,以至於深網路最後達到一個更差的效果。
通過改變結構,把訓練目標進行轉變,由H(x)轉變為H(x)- x,因為這時候就不是吧上面幾層訓練到一個等價對映,而是將其逼近於0,這樣訓練的難度比訓練一個等價對映應該下降多了。


簡單總結上一段的內容:通過在一個淺層網路基礎上疊加y=x的層(稱identity mappings,恆等對映),可以讓網路隨著深度增加而不退化。這反映多層非線性網路無法逼近恆等對映網路。

如果已經學習到較飽和的準確率(或者當發現下層的誤差變大時),那麼接下來的學習目標就轉變為恆等對映的學習,也就是使輸入x近似於輸出H(x),以保持在後面的層次中不會造成精度下降。例如,在一個網路中(假設有5層),如果前面四層已經達到一個最優的函式,那第五層就是沒有必要的了,這時我們通過這種跳躍結構,我們的優化目標就從一個等價對映變為逼近0了,逼近其他任何函式都會造成網路退化。通過這種方式就可以解決網路太深難訓練的問題。


網路不退化不是我們的最終目的,我們的最終目標是有更好效能的網路。ResNets學習的是殘差函式F(x)=H(x)-x,這裡如果F(x)=0,那麼就是上面提及的恆等對映。但實際上,我們只是逼近恆等對映,而不是使得F(x)=0。因為學習一個F(x)=0,的恆等對映很難。

34層的深度殘差結構

在這裡插入圖片描述

為經過“shortcut connections(捷徑連線)”後,H(x)=F(x)+x,如果F(x)和x的通道相同,則可直接相加,那麼通道不同怎麼相加呢。上圖中的實線、虛線就是為了區分這兩種情況的:

  1. 實線的Connection部分,表示通道相同,如上圖的第一個粉色矩形和第三個粉色矩形,都是3x3x64的特徵圖,由於通道相同,所以採用計算方式為H(x)=F(x)+x
  2. 虛線的的Connection部分,表示通道不同,如上圖的第一個綠色矩形和第三個綠色矩形,分別是3x3x64和3x3x128的特徵圖,通道不同,採用的計算方式為H(x)=F(x)+Wx,其中W是卷積操作,用來調整x維度的。

除了上面提到的兩層殘差學習單元,還有三層的殘差學習單元,如下圖所示:
在這裡插入圖片描述

兩種結構分別針對ResNet34(左圖)和ResNet50/101/152(右圖),其目的主要就是為了降低引數的數目。左圖是兩個3x3x256的卷積,引數數目: 3x3x256x256x2 = 1179648,右圖是第一個1x1的卷積把256維通道降到64維,然後在最後通過1x1卷積恢復,整體上用的引數數目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,右圖的引數數量比左圖減少了16.94倍,因此,右圖的主要目的就是為了減少引數量,從而減少計算量。
對於常規的ResNet,可以用於34層或者更少的網路中(左圖);對於更深的網路(如101層),則使用右圖,其目的是減少計算和引數量。