小白都能看得懂的ResNet原理

轉載自:https://blog.csdn.net/u014296502/article/details/80438616?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

深度殘差網絡是ImageNet比賽中,效果最好的網絡,在深度學習的探究過程中,發現對深度的擴展遠遠比廣度的擴展效果要達到的好的太多。理論認爲,同層的不同神經元學習不同的特徵,越往後層的神經元學習特徵的抽象程度越高。可以這樣理解,如果要識別一個汽車如下圖:

這裏寫圖片描述

上面的圖我畫的有些粗糙,但是意思應該表達清楚了,特徵的組合識別一個物體,如果特徵越抽象則識別物體更加簡單,也就是說網絡模型越深越好了?那麼在搭建一個網絡模型只要不停的加深網絡不就能夠得到更好的分類精度嗎?其實不然隨着網絡層級的不斷增加,模型精度不斷得到提升,而當網絡層級增加到一定的數目以後,訓練精度和測試精度迅速下降,這說明當網絡變得很深以後,深度網絡就變得更加難以訓練了。在不斷加神經網絡的深度時,模型準確率會先上升然後達到飽和,再持續增加深度時則會導致準確率下降。
這裏寫圖片描述

觀察精準度的走勢,隨着網絡層加深,精準度先是達到一個峯值,然後持續走低。誤差是普遍存在的,無論是訓練集還是驗證集,隨着誤差的傳播,越往後誤差越大,所以越深的網絡效果可能並不會很好。按照信息熵的傳播原理,信息在傳播的過程中是有損失的,所以越深的網絡能夠學到的信息就越少,所以就更難訓練。另一個比較嚴謹的解釋,因爲神經網絡在求梯度的時候有個鏈式法則,求解梯度時會有累乘造成了梯度彌散或者爆炸。
這裏寫圖片描述

所以越深的網絡越難訓練,且效果可能會變差。
有什麼辦法可以尋找到一個最佳深度網絡模型呢?如果我持續加深那麼誤差會變大,影響模型效果,並且也不清楚到底加多少層纔是最佳。有沒有一種方式,我可以持續加深網絡?即使模型精確度已經飽和,我持續加深也不會對模型精準度有影響?答案是有的,這個時候引出ResNet網絡,它是這樣的,假設現有一個比較淺的網絡(Shallow Net)已達到了飽和的準確率,這時在它後面再加上幾個恆等映射層(Identity mapping,也即y=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,使到隨着網絡加深,準確率不下降。
這裏寫圖片描述

也就是說,即使我並不知道多少層是最佳,我通過殘差模塊,即使已經錯過最佳深度我至少模型的精度不會有影響。起初看到這種網絡模型很是奇怪,如果是一個淺層網絡就能達到飽和,那麼後面的殘差結構目標是學習一個恆等映射,那麼學習目標爲F(x)接近爲0。既然這樣,爲什麼要去學習這個映射?直接寫個恆等函數,或者直接設置F(x)=0 輸出爲x不就行了?殘差網絡的目的是學到y=x恆等映射函數,那麼不就相當於加上的殘差網絡在最後沒起到作用嗎?那麼爲什麼會有效呢?
首先這個飽和的淺層網絡本身就不好尋找,有可能在達到飽和淺層網絡深度之前,由於誤差的原因模型精度已經下降。那麼爲什麼持續增加層,讓模型學習一個恆等映射就會使得模型表達變好呢?
假設:如果不使用殘差網絡結構,這一層的輸出F'(5)=5.1 期望輸出 H(5)=5 ,如果想要學習H函數,使得F'(5)=H(5)=5,這個變化率較低,學習起來是比較困難的。但是如果設計爲H(5)=F(5)+5=5.1,進行一種拆分,使得F(5)=0.1,那麼學習目標是不是變爲F(5)=0,一個映射函數學習使得它輸出由0.1變爲0,這個是比較簡單的。也就是說引入殘差後的映射對輸出變化更敏感了。
進一步理解:如果F'(5)=5.1 ,現在繼續訓練模型,使得映射函數F'(5)=5。(5.1-5)/5.1=2%,也許你腦中已經閃現把學習率從0.01設置爲0.0000001。淺層還好用,深層的話可能就不太好使了。如果設計爲殘差結構呢?5.1變化爲5,也就是F(5)=0.1變化爲F(5)=0.這個變化率增加了100%。引入殘差後映射對輸出變化變的更加敏感了,這也就是爲什麼ResNet雖然層數很多但是收斂速度也不會低的原因。明顯後者輸出變化對權重的調整作用更大,所以效果更好。殘差的思想都是去掉相同的主體部分,從而突出微小的變化,看到殘差網絡我第一反應就是差分放大器。這也就是當網絡模型我們已經設計到一定的深度,出現了精準度下降,如果使用殘差結構就會很容易的調節到一個更好的效果,即使你不知道此刻的深度是不是最佳,但是起碼準確度不會下降。代碼實現也比較簡單,原本的輸出結果由F(x)替換爲輸出F(x)+X,如果維度相同則直接相加,如果維度不同則利用1*1的卷積核變換。當然殘差網絡還有很多細節, 比如使用預batch normalize ,ResNet-v1 由relu非線性變換,替換爲ResNet-v2恆等變換。感興趣的童鞋,趕緊添加我的微信公共號一起討論學習吧!
這裏寫圖片描述

參考文章地址: 如何理解微軟的深度殘差學習?https://www.zhihu.com/question/38499534
殘差resnet網絡原理詳解 https://blog.csdn.net/mao_feng/article/details/52734438
殘差網絡的理解 https://blog.csdn.net/m0_37407756/article/details/78852742

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章