ResNet

原文鏈接:https://blog.csdn.net/qq_35031375/article/details/81586616

ResNet


出自論文Deep Residual Learning for Image Recognition

1.提出背景


1. 梯度爆炸/消失問題(這篇博客講的很好)
2. 退化問題(隨着網絡深度增加,準確率達到飽和,然後迅速下降)
3. 爲了使網絡能夠有更深的深度

2.什麼是殘差函數?


我們使用一般網絡擬合的是h(x),使得輸入x,h(x)能夠得到正確的解來幫助我們預測分類
而在ResNet中引入了殘差函數f(x)=h(x)-x(即目標值與輸入值的偏差),通過訓練擬合f(x),進而由f(x)+x得到h(x)

使用殘差函數的好處有哪些呢?我的理解有以下幾點(僅個人理解,如有錯誤請指出~)
 

  • 解決了退化問題同時很好的避免(或者只能說是減少?)了梯度爆炸/消失。ResNet的出發點並不是爲了解決梯度爆炸/消失問題,達到這種效果純粹是無意之舉,關於原因的話,我閱讀了大量的博客和解析,他們用公式的解釋方法我並不是很理解。
  • 首先爲什麼解決了退化問題。當網絡達到一定深度,若網絡已經最優化,那麼當繼續增加網絡時,f(x)將被push爲0,h(x)變爲恆等映射,那麼對於整個網絡來說,深度的增加也並不會對網絡的performance帶來太大的影響了。那麼,我的理解是,梯度爆炸/消失的原因是隨着深度增加,梯度的同向變化傳遞所導致的(如對每個單元選擇同樣的激活函數,導數同時大於1或小於1,分別對應梯度爆炸和梯度消失,因此最簡單的解決方法是使用ReLU激活函數,而ResNet也同樣選擇了ReLU作爲激活函數),在ResNet中隨着網絡深度的增加,後續的網絡由於採用恆等映射,因此並不會繼續傳遞這種變化,從而避免了梯度爆炸/消失。(同樣的原因,也有學者diss ResNet並沒有真正的增加深度,只是使網絡退化爲了淺層網絡)
  • 進而,由於恆等映射的學習比一般的線性映射要簡單的多,所以訓練速度也相對同樣的深層網絡來說使比較快的。
  • 同時,網絡在深層如果真正學習到了一些東西,而不是簡單的恆等映射,那麼將會有更好的performance
  • 此外,使用殘差函數f(x)對映射後的輸出更敏感,如由h(x)=f(x)+x=5.1,h1(x)=f(x)+x=5.2,x=5,f(x)=0.1->f(x)=0.2那麼變化率由0.1/5放大至0.1/0.1=100%.
     

3.Residual Block

在實現網絡時,使用了Residual Block來擬合h(x)=f(x)+x,整個網絡由多個包含相同形式的Residual Blocks(每一層的第一個Block的第一個卷積層的stride可能和其他的不同)的layers堆疊形成



我們稱圖中的弧線爲short connection,隨着網絡不斷優化達到最優時,f(x)被push爲0,只剩下short connection,這時,Block表示一個恆等映射。

吳恩達的.deaplearning課程中對Residual Block的數學解釋


這裏的每一個節點都執行了線性函數和ReLU激活函數。所以插入的時機是在線性變換之後,ReLU激活之前


兩種不同Residual Block 圖示

 

左邊的這種結構一般用於34層以上的網絡,右邊的結構用於於深層網絡。
其中右側的第一個1x1卷積用於降維,第三個卷積恢復維度,以減少參數量和計算。

那麼如果f(x)維度和x不同該怎麼相加?
這種情況一般發生在兩個layer的交接處,即每個layer的第一個block,特徵圖像的尺寸和通道數發生了變化。爲解決這個問題,論文中作者提出使用矩陣Ws左乘x後,再與f(x)相加,說白了,在實現的時候就是通過卷積達到同維度(我在實現CIFAR10的ResNet時使用一個1x1的卷積核,stride=2,即可實現特徵圖像尺寸減半同時通道數翻倍)

 


ResNet網絡構造


deeplearning課程對ResNet的解釋

該圖表示ResNet在Plain Network上增加了short connetion,可以看出ResNet的訓練誤差並沒有發生退化。
網絡以average pooling -> 1000-d fc -> softmax結束

Details


- 圖像水平翻轉,減去均值,224x224隨機裁剪
- 每個卷積後和激活前採用BN
- batchsize =256,lr = 0.1 當誤差穩定時更新lr = lr*0.1,SGD優化函數,weight_decay=0.0001,momentum=0.9,
- 不採用dropout

 


用於CIFAR10的ResNet結構

CIFAR10的圖像均爲32x32,論文中ResNet的網絡結構設置如下:


其中n = {3,5,7,9},表示每個層中block的個數,分別形成Res20,32,44,56的網絡
(depth= 6n+2)
具體實現請見https://github.com/DengChan/CIFAR10_pytorch/blob/master/models/ResNet.py

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