十分鐘一起學會ResNet殘差網絡

十分鐘一起學會ResNet殘差網絡

作者 | 荔枝boy

目錄

  • 深層次網絡訓練瓶頸:梯度消失,網絡退化
  • ResNet簡介
  • ResNet解決深度網絡瓶頸的魔力
  • ResNet使用的小技巧
  • 總結

深層次網絡訓練瓶頸:梯度消失,網絡退化

深度卷積網絡自然的整合了低中高不同層次的特徵,特徵的層次可以靠加深網絡的層次來豐富。從而,在構建卷積網絡時,網絡的深度越高,可抽取的特徵層次就越豐富。所以一般我們會傾向於使用更深層次的網絡結構,以便取得更高層次的特徵。但是在使用深層次的網絡結構時我們會遇到兩個問題,梯度消失,梯度爆炸問題和網絡退化的問題。

但是當使用更深層的網絡時,會發生梯度消失、爆炸問題,這個問題很大程度通過標準的初始化和正則化層來基本解決,這樣可以確保幾十層的網絡能夠收斂,但是隨著網絡層數的增加,梯度消失或者爆炸的問題仍然存在。

還有一個問題就是網絡的退化,舉個例子,假設已經有了一個最優化的網絡結構,是18層。當我們設計網絡結構的時候,我們並不知道具體多少層次的網絡時最優化的網絡結構,假設設計了34層網絡結構。那麼多出來的16層其實是冗餘的,我們希望訓練網絡的過程中,模型能夠自己訓練這五層為恆等映射,也就是經過這層時的輸入與輸出完全一樣。但是往往模型很難將這16層恆等映射的參數學習正確,那麼就一定會不比最優化的18層網絡結構性能好,這就是隨著網絡深度增加,模型會產生退化現象。它不是由過擬合產生的,而是由冗餘的網絡層學習了不是恆等映射的參數造成的。

十分鐘一起學會ResNet殘差網絡

圖一


十分鐘一起學會ResNet殘差網絡

圖二

ResNet簡介

ResNet是在2015年有何凱明,張翔宇,任少卿,孫劍共同提出的,ResNet使用了一個新的思想,ResNet的思想是假設我們涉及一個網絡層,存在最優化的網絡層次,那麼往往我們設計的深層次網絡是有很多網絡層為冗餘層的。那麼我們希望這些冗餘層能夠完成恆等映射,保證經過該恆等層的輸入和輸出完全相同。具體哪些層是恆等層,這個會有網絡訓練的時候自己判斷出來。將原網絡的幾層改成一個殘差塊,殘差塊的具體構造如下圖所示:

十分鐘一起學會ResNet殘差網絡

圖三

可以看到X是這一層殘差塊的輸入,也稱作F(x)為殘差,x為輸入值,F(X)是經過第一層線性變化並激活後的輸出,該圖表示在殘差網絡中,第二層進行線性變化之後激活之前,F(x)加入了這一層輸入值X,然後再進行激活後輸出。在第二層輸出值激活前加入X,這條路徑稱作shortcut連接。

ResNet解決深度網絡瓶頸的魔力

網絡退化問題的解決:

我們發現,假設該層是冗餘的,在引入ResNet之前,我們想讓該層學習到的參數能夠滿足h(x)=x,即輸入是x,經過該冗餘層後,輸出仍然為x。但是可以看見,要想學習h(x)=x恆等映射時的這層參數時比較困難的。ResNet想到避免去學習該層恆等映射的參數,使用瞭如上圖的結構,讓h(x)=F(x)+x;這裡的F(x)我們稱作殘差項,我們發現,要想讓該冗餘層能夠恆等映射,我們只需要學習F(x)=0。學習F(x)=0比學習h(x)=x要簡單,因為一般每層網絡中的參數初始化偏向於0,這樣在相比於更新該網絡層的參數來學習h(x)=x,該冗餘層學習F(x)=0的更新參數能夠更快收斂,如圖所示:

十分鐘一起學會ResNet殘差網絡

圖四



假設該曾網絡只經過線性變換,沒有bias也沒有激活函數。我們發現因為隨機初始化權重一般偏向於0,那麼經過該網絡的輸出值為[0.6 0.6],很明顯會更接近與[0 0],而不是[2 1],相比與學習h(x)=x,模型要更快到學習F(x)=0。

並且ReLU能夠將負數激活為0,過濾了負數的線性變化,也能夠更快的使得F(x)=0。這樣當網絡自己決定哪些網絡層為冗餘層時,使用ResNet的網絡很大程度上解決了學習恆等映射的問題,用學習殘差F(x)=0更新該冗餘層的參數來代替學習h(x)=x更新冗餘層的參數。

這樣當網絡自行決定了哪些層為冗餘層後,通過學習殘差F(x)=0來讓該層網絡恆等映射上一層的輸入,使得有了這些冗餘層的網絡效果與沒有這些冗餘層的網絡效果相同,這樣很大程度上解決了網絡的退化問題。

梯度消失或梯度爆炸問題的解決:

我們發現很深的網絡層,由於參數初始化一般更靠近0,這樣在訓練的過程中更新淺層網絡的參數時,很容易隨著網絡的深入而導致梯度消失,淺層的參數無法更新。

十分鐘一起學會ResNet殘差網絡

圖五


可以看到,假設現在需要更新b1,w2,w3,w4參數因為隨機初始化偏向於0,通過鏈式求導我們會發現,w4w3w2相乘會得到更加接近於0的數,那麼所求的這個b1的梯度就接近於0,也就產生了梯度消失的現象。

ResNet最終更新某一個節點的參數時,由於h(x)=F(x)+x,由於鏈式求導後的結果如圖所示,不管括號內右邊部分的求導參數有多小,因為左邊的1的存在,並且將原來的鏈式求導中的連乘變成了連加狀態(正是 ),都能保證該節點參數更新不會發生梯度消失或梯度爆炸現象。

十分鐘一起學會ResNet殘差網絡

圖六


這樣ResNet在解決了阻礙更深層次網絡優化問題的兩個重要問題後,ResNet就能訓練更深層次幾百層乃至幾千層的網絡並取得更高的精確度了。

ResNet使用的小技巧

這裡是應用了ResNet的網絡圖,這裡如果遇到了h(x)=F(x)+x中x的維度與F(x)不同的維度時,我們需要對identity加入Ws來保持Ws*x的維度與F(x)的維度一致。

x與F(x)維度相同時:


十分鐘一起學會ResNet殘差網絡


x與F(x)維度不同時:


十分鐘一起學會ResNet殘差網絡


下邊是ResNet的網絡結構圖:

十分鐘一起學會ResNet殘差網絡

圖七

使用1*1卷積減少參數和計算量:

如果用了更深層次的網絡時,考慮到計算量,會先用1*1的卷積將輸入的256維降到64維,然後通過1*1恢復。這樣做的目的是減少參數量和計算量。

十分鐘一起學會ResNet殘差網絡

圖八


左圖是ResNet34,右圖是ResNet50/101/152。這一個模塊稱作building block,右圖稱之為bottleneck design。在面對50,101,152層的深層次網絡,意味著有很大的計算量,因此這裡使用1*1卷積先將輸入進行降維,然後再經過3*3卷積後再用1*1卷積進行升維。使用1*1卷積的好處是大大降低參數量計算量。

總結

通過上述的學習,你應該知道了,現如今大家普遍認為更好的網絡是建立在更寬更深的網絡基礎上,當你需要設計一個深度網絡結構時,你永遠不知道最優的網絡層次結構是多少層,一旦你設計的很深入了,那勢必會有很多冗餘層,這些冗餘層一旦沒有成功學習恆等變換h(x)=x,那就會影響網絡的預測性能,不會比淺層的網絡學習效果好從而產生退化問題。

ResNet的過人之處,是他很大程度上解決了當今深度網絡頭疼的網絡退化問題和梯度消失問題。使用殘差網絡結構h(x)=F(x)+x代替原來的沒有shortcut連接的h(x)=x,這樣更新冗餘層的參數時需要學習F(x)=0比學習h(x)=x要容易得多。而shortcut連接的結構也保證了反向傳播更新參數時,很難有梯度為0的現象發生,不會導致梯度消失。

這樣,ResNet的構建,使我們更朝著符合我們的直覺走下去,即越深的網絡對於高級抽象特徵的提取和網絡性能更好,不用在擔心隨著網絡的加深發生退化問題了。

近段時間,準備持續發表一些CNN常見的網絡模型講解。好了,今天的十分鐘就帶你一起學會ResNet,下次的十分鐘我們再見。


分享到:


相關文章: