一提及「深度學習」,天然就聯想到它很是顯著的特色「深、深、深」(重要的事說三遍),經過很深層次的網絡實現準確率很是高的圖像識別、語音識別等能力。所以,咱們天然很容易就想到:深的網絡通常會比淺的網絡效果好,若是要進一步地提高模型的準確率,最直接的方法就是把網絡設計得越深越好,這樣模型的準確率也就會愈來愈準確。網絡
那現實是這樣嗎?
先看幾個經典的圖像識別深度學習模型:
這幾個模型都是在世界頂級比賽中獲獎的著名模型,然而,一看這些模型的網絡層次數量,彷佛讓人很失望,少則5層,多的也就22層而已,這些世界級模型的網絡層級也沒有那麼深啊,這種也算深度學習嗎?爲何不把網絡層次加到成百上千層呢?app
帶着這個問題,咱們先來看一個實驗,對常規的網絡(plain network,也稱平原網絡)直接堆疊不少層次,經對圖像識別結果進行檢驗,訓練集、測試集的偏差結果以下圖:
從上面兩個圖能夠看出,在網絡很深的時候(56層相比20層),模型效果卻愈來愈差了(偏差率越高),並非網絡越深越好。
經過實驗能夠發現:隨着網絡層級的不斷增長,模型精度不斷獲得提高,而當網絡層級增長到必定的數目之後,訓練精度和測試精度迅速降低,這說明當網絡變得很深之後,深度網絡就變得更加難以訓練了。函數
【問題來了】爲何隨着網絡層級越深,模型效果卻變差了呢?學習
下圖是一個簡單神經網絡圖,由輸入層、隱含層、輸出層構成:
回想一下神經網絡反向傳播的原理,先經過正向傳播計算出結果output,而後與樣本比較得出偏差值Etotal
根據偏差結果,利用著名的「鏈式法則」求偏導,使結果偏差反向傳播從而得出權重w調整的梯度。下圖是輸出結果到隱含層的反向傳播過程(隱含層到輸入層的反向傳播過程也是相似):
經過不斷迭代,對參數矩陣進行不斷調整後,使得輸出結果的偏差值更小,使輸出結果與事實更加接近。測試
從上面的過程能夠看出,神經網絡在反向傳播過程當中要不斷地傳播梯度,而當網絡層數加深時,梯度在傳播過程當中會逐漸消失(假如採用Sigmoid函數,對於幅度爲1的信號,每向後傳遞一層,梯度就衰減爲原來的0.25,層數越多,衰減越厲害),致使沒法對前面網絡層的權重進行有效的調整。設計
那麼,如何又能加深網絡層數、又能解決梯度消失問題、又能提高模型精度呢?orm
【主角登場】深度殘差網絡(Deep Residual Network,簡稱DRN)深度學習
前面描述了一個實驗結果現象,在不斷加神經網絡的深度時,模型準確率會先上升而後達到飽和,再持續增長深度時則會致使準確率降低,示意圖以下:
那麼咱們做這樣一個假設:假設現有一個比較淺的網絡(Shallow Net)已達到了飽和的準確率,這時在它後面再加上幾個恆等映射層(Identity mapping,也即y=x,輸出等於輸入),這樣就增長了網絡的深度,而且起碼偏差不會增長,也即更深的網絡不該該帶來訓練集上偏差的上升。而這裏提到的使用恆等映射直接將前一層輸出傳到後面的思想,即是著名深度殘差網絡ResNet的靈感來源。it
ResNet引入了殘差網絡結構(residual network),經過這種殘差網絡結構,能夠把網絡層弄的很深(聽說目前能夠達到1000多層),而且最終的分類效果也很是好,殘差網絡的基本結構以下圖所示,很明顯,該圖是帶有跳躍結構的:
殘差網絡借鑑了高速網絡(Highway Network)的跨層連接思想,但對其進行改進(殘差項本來是帶權值的,但ResNet用恆等映射代替之)。
假定某段神經網絡的輸入是x,指望輸出是H(x),即H(x)是指望的複雜潛在映射,若是是要學習這樣的模型,則訓練難度會比較大;
回想前面的假設,若是已經學習到較飽和的準確率(或者當發現下層的偏差變大時),那麼接下來的學習目標就轉變爲恆等映射的學習,也就是使輸入x近似於輸出H(x),以保持在後面的層次中不會形成精度降低。
在上圖的殘差網絡結構圖中,經過「shortcut connections(捷徑鏈接)」的方式,直接把輸入x傳到輸出做爲初始結果,輸出結果爲H(x)=F(x)+x,當F(x)=0時,那麼H(x)=x,也就是上面所提到的恆等映射。因而,ResNet至關於將學習目標改變了,再也不是學習一個完整的輸出,而是目標值H(X)和x的差值,也就是所謂的殘差F(x) := H(x)-x,所以,後面的訓練目標就是要將殘差結果逼近於0,使到隨着網絡加深,準確率不降低。
這種殘差跳躍式的結構,打破了傳統的神經網絡n-1層的輸出只能給n層做爲輸入的慣例,使某一層的輸出能夠直接跨過幾層做爲後面某一層的輸入,其意義在於爲疊加多層網絡而使得整個學習模型的錯誤率不降反升的難題提供了新的方向。
至此,神經網絡的層數能夠超越以前的約束,達到幾十層、上百層甚至千層,爲高級語義特徵提取和分類提供了可行性。io
下面感覺一下34層的深度殘差網絡的結構圖,是否是很壯觀:
從圖能夠看出,怎麼有一些「shortcut connections(捷徑鏈接)」是實線,有一些是虛線,有什麼區別呢?
由於通過「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層),則使用右圖,其目的是減小計算和參數量。
經檢驗,深度殘差網絡的確解決了退化問題,以下圖所示,左圖爲平原網絡(plain network)網絡層次越深(34層)比網絡層次淺的(18層)的偏差率更高;右圖爲殘差網絡ResNet的網絡層次越深(34層)比網絡層次淺的(18層)的偏差率更低。
結語
ResNet在ILSVRC2015競賽中驚豔亮相,一會兒將網絡深度提高到152層,將錯誤率降到了3.57,在圖像識別錯誤率和網絡深度方面,比往屆比賽有了很是大的提高,ResNet毫無懸念地奪得了ILSVRC2015的第一名。以下圖所示:
在ResNet的做者的第二篇相關論文《Identity Mappings in Deep Residual Networks》中,提出了ResNet V2。ResNet V2 和 ResNet V1 的主要區別在於,做者經過研究 ResNet 殘差學習單元的傳播公式,發現前饋和反饋信號能夠直接傳輸,所以「shortcut connection」(捷徑鏈接)的非線性激活函數(如ReLU)替換爲 Identity Mappings。同時,ResNet V2 在每一層中都使用了 Batch Normalization。這樣處理後,新的殘差學習單元比之前更容易訓練且泛化性更強。
牆裂建議
建議仔細閱讀下何凱明關於深度殘差網絡的兩篇經典論文,深度殘差網絡的主要思想即是在這論文中提出來的,值得收藏閱讀
-
《Deep Residual Learning for Image Recognition》(基於深度殘差學習的圖像識別)
-
《Identity Mappings in Deep Residual Networks》(深度殘差網絡中的特徵映射)