深度殘差網路(ResNet)

凌逆戰發表於2019-07-06

引言

  對於傳統的深度學習網路應用來說,網路越深,所能學到的東西越多。當然收斂速度也就越慢,訓練時間越長,然而深度到了一定程度之後就會發現越往深學習率越低的情況,甚至在一些場景下,網路層數越深反而降低了準確率,而且很容易出現梯度消失和梯度爆炸。

  這種現象並不是由於過擬合導致的,過擬合是在訓練集中把模型訓練的太好,但是在新的資料中表現卻不盡人意的情況。從上圖可以看出,我們的訓練準誤差和測試誤差在層數增加後皆變大了,這說明當網路層數變深後,深度網路變得難以訓練。

  如果大家還沒理解的話,那我講細一點,網路太深,模型就會變得不敏感,不同的圖片類別產生了近似的對網路的刺激效果,這時候網路均方誤差的減小導致最後分類的效果往往不會太好,所以解決思路就是引入這些相似刺激的“差異性因子”。

  深度殘差網路(ResNet)的設計就是為了克服這種由於網路深度的加深而產生的學習率變低、準確率無法有效提升的問題。

殘差塊

  在一個網路中(假設有五層),如果前面四層已經達到一個最優的函式,那第五層就沒有必要了,理想中我們可以把第五層設計為一個y=x層的恆等對映,可以讓網路隨著深度的增加而不退化。但是我們的非線性網路無法畢竟恆等對映網路

  但是不退化不是我們的目的,我們希望有更好效能的網路。ResNets學習的是殘差函式$F(x)=H(x)-x$,這裡如果$F(x)=0$,那麼就是上面提到的恆等對映。

殘差塊(Residual block)(也可以理解為跳躍連線)的結構如下圖所示:

它有兩層,我們用$\sigma$表示啟用函式,如下表示式,

$$F(x)=\sigma(W_1x)$$

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

$$y=\sigma(W_2\sigma(W_1x)+x_{identity})$$

這個殘差塊往往需要兩層以上,單單一層的殘差塊並不能起到提升作用。

殘差網路的確解決了退化的問題,在訓練集和校驗集上,都證明了的更深的網路錯誤率越小,如下圖

  實際中,考慮計算的成本,對殘差塊做了計算優化,即將兩個3x3的卷積層替換為1x1 + 3x3 + 1x1, 如下圖。新結構中的中間3x3的卷積層首先在一個降維1x1卷積層下減少了計算,然後在另一個1x1的卷積層下做了還原,既保持了精度又減少了計算量。

  上面是兩種不同的跳躍結構,主要就是使用了不同的卷積核。左邊引數要比右邊的多一倍。所以當網路很深時,用右邊的比較好。 

殘差神經網路

下圖是一個普通網路

下圖是一個殘差網路(ResNet)

 

由此可見,把普通網路變成ResNet的方法就是加上跳躍連線,沒兩層增加一個捷徑,構成一個殘差塊。

  對於跳躍結構,當輸入與輸出的維度一樣時,不需要做其他處理,兩者相加就可,但當兩者維度不同時,輸入要進行變換以後去匹配輸出的維度,主要經過兩種方式,1)用zero-padding去增加維度,2)用1x1卷積來增加維度。

  普通的神經網路,隨著網路深度的加深,訓練錯誤會越來越多。但有了ResNets就不一樣了,即使網路再深,訓練的表現卻不錯,比如說訓練誤差減少,這種方式確實有助於解決梯度消失和梯度爆炸問題,讓我們在訓練更深網路的同時,又能保證良好的效能。

參考文獻:

何愷明的論文:Deep Residual Learning for Image Recognition

CSDN博主的--深度學習筆記(七)--ResNet(殘差網路)

CSDN博主三百斤菠蘿--ResNet論文筆記

相關文章