殘差結構詳解

2021-08-31 13:42:15 字數 2811 閱讀 3036

背景知識:

為什麼要構建深層網路?

答:認為神經網路的每一層分別對應於提取不同層次的特徵資訊,有低層,中層和高層,而網路越深的時候,提取到的不同層次的資訊會越多,而不同層次間的層次資訊的組合也會越多。

resnets為什麼能構建如此深的網路?

答:深度學習對於網路深度遇到的主要問題是梯度消失和梯度**,傳統對應的解決方案則是資料的初始化(normlized initializatiton)和(batch normlization)正則化,但是這樣雖然解決了梯度的問題,深度加深了,卻帶來了另外的問題,就是網路效能的退化問題,深度加深了,錯誤率卻上公升了,而殘差用來設計解決退化問題,其同時也解決了梯度問題,更使得網路的效能也提公升了。

普通網路(plain network),類似vgg,沒有殘差,憑經驗會發現隨著網路深度的加深,訓練錯誤會先減少,然後增多(並證明的錯誤的增加並不是由於過擬合產生,而是由於網路變深導致難以訓練)。從理論上分析,網路深度越深越好。但實際上,如果沒有殘差網路,對於乙個普通網路來說,深度越深意味著用優化演算法越難訓練。實際上,隨著網路深度的增加,訓練誤差會越來越多,這被描述為網路退化。

resnets的提出,可以解決上述問題,即使網路再深嗎,訓練的表現仍表現很好。它有助於解決梯度消失和梯度**問題,讓我們在訓練更深網路的同時,又能保證良好的資訊。

殘差結構示意圖

殘差網路的設計思想

殘差元的主要設計有兩個,快捷連線和恒等對映,快捷連線使得殘差變得可能,而恒等對映使得網路變深,而恒等對映主要有兩個:跳躍連線和啟用函式。

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

1∗x+

xy=w_1*x+x

y=w1​∗

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,這樣訓練的難度比訓練乙個等價對映應該下降多了。

如果已經學習到較飽和的準確率(或者當發現下層的誤差變大時),那麼接下來的學習目標就轉變為恒等對映的學習,也就是使輸入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的通道相同,則可直接相加,那麼通道不同怎麼相加呢。上圖中的實線、虛線就是為了區分這兩種情況的:

實線的connection部分,表示通道相同,如上圖的第乙個粉色矩形和第三個粉色矩形,都是3x3x64的特徵圖,由於通道相同,所以採用計算方式為h(x)=f(x)+x

虛線的的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層),則使用右圖,其目的是減少計算和參數量。

深度殘差網路

深度殘差學習 deep residual learning 的思想 在residual net中 1 identity 為恒等對映,此條路徑一直存在 2 f x 為需要學習的殘差函式 residual function h x x f x 問題的重新表示或預處理會簡化問題的優化 假設我們期望的網路層...

殘差網路雜記

深度增加的乙個問題在於這些增加的層是引數更新的訊號。梯度是從後向前傳播的,增加網路深度後,比較靠前的層梯度會很小。當網路更深時意味著引數空間更大,優化問題變得更難,因此簡單地去增加網路深度反而出現更高的訓練誤差。殘差網路resnet設計一種殘差模組讓我們可以訓練更深的網路。殘差模組在輸入和輸出之間建...

pytorch學習 殘差

殘差能很好的解決網路梯度瀰散的問題。將網路假設成水管的話,網路層表示為閥門,越往後水管的水量越小,加入殘差後,可以理解為,將水管並行,保證每個閥門都能有足夠多的水量。殘差實際上是做加法,加入以影象為例,pytorch輸入是 n,c,h,w 的張量,經過一層網路計算後得到的是 n,c h w 如果做張...