隨着2018年秋季的到來,提早批和內推大軍已經開始了,本身也成功得當了幾回炮灰,不過在總結的過程當中,越是瞭解到本身的不足,仍是須要加油。html
最近從新複習了resnet網絡,又能發現一些新的理念,感受很fantastic,順便記錄一下~網絡
以前有轉載一篇resnet的網絡,很不錯,連接在這:https://www.cnblogs.com/wmr95/articles/8848158.html函數
下面從新瞭解一下resnet,Let’s Go~~性能
《一》Resnet解決了什麼問題學習
首先了解Resnet網絡主要解決的問題是:關於深層網絡訓練帶來的問題,包括梯度消失和網絡退化。優化
深度卷積網絡天然的整合了低中高不一樣層次的特徵,特徵的層次能夠靠加深網絡的層次來豐富。從而,在構建卷積網絡時,網絡的深度越高,可抽取的特徵層次就越豐富。因此通常咱們會傾向於使用更深層次的網絡結構,以便取得更高層次的特徵。可是在使用深層次的網絡結構時咱們會遇到兩個問題,梯度消失,梯度爆炸問題和網絡退化的問題。
spa
可是當使用更深層的網絡時,會發生梯度消失、爆炸問題,這個問題很大程度經過標準的初始化和正則化層來基本解決,這樣能夠確保幾十層的網絡可以收斂,可是隨着網絡層數的增長,梯度消失或者爆炸的問題仍然存在。設計
還有一個問題就是網絡的退化,舉個例子,假設已經有了一個最優化的網絡結構,是18層。當咱們設計網絡結構的時候,咱們並不知道具體多少層次的網絡時最優化的網絡結構,假設設計了34層網絡結構。那麼多出來的16層實際上是冗餘的,咱們但願訓練網絡的過程當中,模型可以本身訓練這16層爲恆等映射,也就是通過這層時的輸入與輸出徹底同樣。可是每每模型很難將這16層恆等映射的參數學習正確,那麼就必定會不比最優化的18層網絡結構性能好,這就是隨着網絡深度增長,模型會產生退化現象。它不是由過擬合產生的,而是由冗餘的網絡層學習了不是恆等映射的參數形成的。htm
注意這裏冗餘的16層網絡並不必定是最後的16層,多是穿插在網絡各層當中。blog
《二》Resnet網絡是如何解決問題
1. Resnet介紹
ResNet使用了一個新的思想,ResNet的思想是假設咱們設計一個網絡層,存在最優化的網絡層次,那麼每每咱們設計的深層次網絡是有不少網絡層爲冗餘層的。那麼咱們但願這些冗餘層可以完成恆等映射,保證通過該恆等層的輸入和輸出徹底相同。具體哪些層是恆等層,這個會有網絡訓練的時候本身判斷出來。將原網絡的幾層改爲一個殘差塊,殘差塊的具體構造以下圖所示:
能夠看到X是這一層殘差塊的輸入,也稱做F(x)爲殘差,x爲輸入值,F(X)是通過第一層線性變化並激活後的輸出,該圖表示在殘差網絡中,第二層進行線性變化以後激活以前,F(x)加入了這一層輸入值X,而後再進行激活後輸出。在第二層輸出值激活前加入X,這條路徑稱做shortcut鏈接。
2. 在引入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的更新參數可以更快收斂,如圖所示:
假設該曾網絡只通過線性變換,沒有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更新冗餘層的參數。因此說Resnet搭配ReLU線性激活是完美組合~
這樣當網絡自行決定了哪些層爲冗餘層後,經過學習殘差F(x)=0來讓該層網絡恆等映射上一層的輸入,使得有了這些冗餘層的網絡效果與沒有這些冗餘層的網絡效果相同,這樣很大程度上解決了網絡的退化問題。
3. 引入Resnet網絡後是如何解決問題
咱們發現很深的網絡層,因爲參數初始化通常更靠近0,這樣在訓練的過程當中更新淺層網絡的參數時,很容易隨着網絡的深刻而致使梯度消失,淺層的參數沒法更新。
此處貼反向傳播的圖~~
能夠看到,假設如今須要更新b1,w2,w3,w4參數由於隨機初始化偏向於0,經過鏈式求導咱們會發現,w1w2w3相乘會獲得更加接近於0的數,那麼所求的這個b1的梯度就接近於0,也就產生了梯度消失的現象。
ResNet最終更新某一個節點的參數時,因爲h(x)=F(x)+x,因爲鏈式求導後的結果如圖所示,無論括號內右邊部分的求導參數有多小,由於左邊的1的存在,並且將原來的鏈式求導中的連乘變成了連加狀態(正確?),都能保證該節點參數更新不會發生梯度消失或梯度爆炸現象。
這樣ResNet在解決了阻礙更深層次網絡優化問題的兩個重要問題後,ResNet就能訓練更深層次幾百層乃至幾千層的網絡並取得更高的精確度了。
最後總結下ResNet網絡:
1. 解決梯度消失的問題:引入殘差項使得h(x)=F(x)+x,在反向傳播的時候由於有x的存在,保證參數更新的時候不容易會出現梯度消失的現象。
2. 解決網絡退化的問題:因爲參數初始化通常更靠近0,因此對於網絡來講訓練殘差項F(x)=0要比學習h(x)=x更容易收斂。