大話深度殘差網絡(DRN)ResNet

論文地址:Deep Residual Learning for Image Recognition

一、引言

深度殘差網絡(Deep residual network, ResNet)的提出是CNN圖像史上的一件里程碑事件,讓我們先看一下ResNet在ILSVRC和COCO 2015上的戰績:

圖1 ResNet在ILSVRC和COCO 2015上的戰績

ResNet取得了5項第一,並又一次刷新了CNN模型在ImageNet上的歷史:

圖2 ImageNet分類Top-5誤差

ResNet的作者何凱明也因此摘得CVPR2016最佳論文獎,當然何博士的成就遠不止於此,感興趣的可以去搜一下他後來的輝煌戰績。那麼ResNet爲什麼會有如此優異的表現呢?其實ResNet是解決了深度CNN模型難訓練的問題,從圖2中可以看到14年的VGG才19層,而15年的ResNet多達152層,這在網絡深度完全不是一個量級上,所以如果是第一眼看這個圖的話,肯定會覺得ResNet是靠深度取勝。事實當然是這樣,但是ResNet還有架構上的trick,這才使得網絡的深度發揮出作用,這個trick就是殘差學習(Residual learning)。下面詳細講述ResNet的理論及實現。

二、深度網絡的退化問題

從經驗來看,網絡的深度對模型的性能至關重要,當增加網絡層數後,網絡可以進行更加複雜的特徵模式的提取,所以當模型更深時理論上可以取得更好的結果,從圖2中也可以看出網絡越深而效果越好的一個實踐證據。但是更深的網絡其性能一定會更好嗎?實驗發現深度網絡出現了退化問題(Degradation problem):網絡深度增加時,網絡準確度出現飽和,甚至出現下降。這個現象可以在圖3中直觀看出來:56層的網絡比20層網絡效果還要差。這不會是過擬合問題,因爲56層網絡的訓練誤差同樣高。我們知道深層網絡存在着梯度消失或者爆炸的問題,這使得深度學習模型很難訓練。但是現在已經存在一些技術手段如BatchNorm來緩解這個問題。因此,出現深度網絡的退化問題是非常令人詫異的。

圖3 20層與56層網絡在CIFAR-10上的誤差

從上面兩個圖可以看出,在網絡很深的時候(56層相比20層),模型效果卻越來越差了(誤差率越高),並不是網絡越深越好。
通過實驗可以發現:隨着網絡層級的不斷增加,模型精度不斷得到提升,而當網絡層級增加到一定的數目以後,訓練精度和測試精度迅速下降,這說明當網絡變得很深以後,深度網絡就變得更加難以訓練了。

**訓練集上的性能下降,可以排除過擬合,BN層的引入也基本解決了plain net的梯度消失和梯度爆炸問題。**如果不是過擬合以及梯度消失導致的,那原因是什麼?

按道理,給網絡疊加更多層,淺層網絡的解空間是包含在深層網絡的解空間中的,深層網絡的解空間至少存在不差於淺層網絡的解,因爲只需將增加的層變成恆等映射,其他層的權重原封不動copy淺層網絡,就可以獲得與淺層網絡同樣的性能。更好的解明明存在,爲什麼找不到?找到的反而是更差的解?

顯然,這是個優化問題,反映出結構相似的模型,其優化難度是不一樣的,且難度的增長並不是線性的,越深的模型越難以優化。

有兩種解決思路,一種是調整求解方法,比如更好的初始化、更好的梯度下降算法等;另一種是調整模型結構,讓模型更易於優化——改變模型結構實際上是改變了error surface的形態。

ResNet的作者從後者入手,探求更好的模型結構。將堆疊的幾層layer稱之爲一個block,對於某個block,其可以擬合的函數爲F(x)F(x),如果期望的潛在映射爲H(x)H(x),**與其讓 F(x)F(x) 直接學習潛在的映射,不如去學習殘差 H(x)xH(x)−x,即 F(x):=H(x)xF(x):=H(x)−x,這樣原本的前向路徑上就變成了 F(x)+xF(x)+x ,用 F(x)+xF(x)+x來擬合H(x)H(x)作者認爲這樣可能更易於優化,因爲相比於讓F(x)F(x)學習成恆等映射,讓F(x)F(x)學習成0要更加容易——後者通過L2正則就可以輕鬆實現。**這樣,對於冗餘的block,只需F(x)0F(x)→0就可以得到恆等映射,性能不減。

下面的問題就變成了 F(x)+xF(x)+x 該怎麼設計了。

三、Residual Block的設計

前面描述了一個實驗結果現象,在不斷加神經網絡的深度時,模型準確率會先上升然後達到飽和,再持續增加深度時則會導致準確率下降,示意圖如下:

那麼我們作這樣一個假設:假設現有一個比較淺的網絡(Shallow Net)已達到了飽和的準確率,這時在它後面再加上幾個恆等映射層(Identity mapping,也即y=x,輸出等於輸入),這樣就增加了網絡的深度,並且起碼誤差不會增加,也即更深的網絡不應該帶來訓練集上誤差的上升。而這裏提到的使用恆等映射直接將前一層輸出傳到後面的思想,便是著名深度殘差網絡ResNet的靈感來源。

這個有趣的假設讓何博士靈感爆發,他提出了殘差學習來解決退化問題。對於一個堆積層結構(幾層堆積而成)當輸入爲 xx 時其學習到的特徵記爲 H(x)H(x),現在我們希望其可以學習到殘差 F(x)=H(x)xF(x)=H(x)-x ,這樣其實原始的學習特徵是F(x)+xF(x)+x 。之所以這樣是因爲殘差學習相比原始特徵直接學習更容易。當殘差爲 0 時,此時堆積層僅僅做了恆等映射,至少網絡性能不會下降,實際上殘差不會爲 0,這也會使得堆積層在輸入特徵基礎上學習到新的特徵,從而擁有更好的性能。殘差學習的結構如圖4所示。這有點類似與電路中的“短路”,所以是一種短路連接(shortcut connection)

圖4 殘差學習單元

F(x)+xF(x)+x 構成的block稱之爲Residual Block,即殘差塊,如上圖所示,多個相似的Residual Block串聯構成ResNet。

一個殘差塊有2條路徑 F(x)F(x)xxF(x)F(x) 路徑擬合殘差,不妨稱之爲殘差路徑xx 路徑爲 identity mapping恆等映射,稱之爲”shortcut”。圖中的⊕爲element-wise addition,要求參與運算的 F(x)F(x)xx 的尺寸要相同。所以,隨之而來的問題是:

  • 殘差路徑如何設計?
  • shortcut路徑如何設計?
  • Residual Block之間怎麼連接?

在原論文中,殘差路徑可以大致分成2種,一種有bottleneck結構,即下圖右中的1×1卷積層,用於先降維再升維,主要出於降低計算複雜度的現實考慮,稱之爲“bottleneck block”,另一種沒有bottleneck結構,如下圖左所示,稱之爲“basic block”。basic block由2個3×3卷積層構成,bottleneck block由1×1

bottleneck block中第一個1x1的卷積把256維channel降到64維,然後在最後通過1x1卷積恢復,整體上用的參數數目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而是basic block中兩個3x3x256的卷積,參數數目: 3x3x256x256x2 = 1179648,差了16.94倍。

對於常規ResNet,可以用於34層或者更少的網絡中,對於Bottleneck Design的ResNet通常用於更深的如101這樣的網絡中,目的是減少計算和參數量(實用目的)。

shortcut路徑大致也可以分成2種,取決於殘差路徑是否改變了feature map數量和尺寸,一種是將輸入x原封不動地輸出,另一種則需要經過1×1卷積來升維 or/and 降採樣,主要作用是將輸出與F(x)路徑的輸出保持shape一致,對網絡性能的提升並不明顯,兩種結構如下圖所示。

至於Residual Block之間的銜接,在原論文中,F(x)+xF(x)+x 經過ReLU後直接作爲下一個block的輸入x。

四、ResNet 網絡結構

ResNet爲多個Residual Block的串聯,下面直觀看一下ResNet-34與34-layer plain net和VGG的對比,以及堆疊不同數量Residual Block得到的不同ResNet。

ResNet網絡結構圖

不同深度的ResNet

ResNet的設計有如下特點:

  • 與plain net相比,ResNet多了很多“旁路”,即shortcut路徑,其首尾圈出的layers構成一個Residual Block;
  • ResNet中,所有的Residual Block都沒有pooling層,降採樣是通過conv的stride實現的
  • 分別在conv3_1、conv4_1和conv5_1 Residual Block,降採樣1倍,同時feature map數量增加1倍,如圖中虛線劃定的block;
  • 通過Average Pooling得到最終的特徵,而不是通過全連接層;
  • 每個卷積層之後都緊接着BatchNorm layer,爲了簡化,圖中並沒有標出;

ResNet結構非常容易修改和擴展,通過調整block內的channel數量以及堆疊的block數量,就可以很容易地調整網絡的寬度和深度,來得到不同表達能力的網絡,而不用過多地擔心網絡的“退化”問題,只要訓練數據足夠,逐步加深網絡,就可以獲得更好的性能表現。

下面爲網絡的性能對比:

五、error surface對比

上面的實驗說明,不斷地增加ResNet的深度,甚至增加到1000層以上,也沒有發生“退化”,可見Residual Block的有效性。ResNet的動機在於認爲擬合殘差比直接擬合潛在映射更容易優化,下面通過繪製error surface直觀感受一下shortcut路徑的作用,圖片截自Loss Visualization

可以發現:

  • ResNet-20(no short)淺層plain net的error surface還沒有很複雜,優化也會很困難,但是增加到56層後複雜程度極度上升。對於plain net,隨着深度增加,error surface 迅速“惡化”
  • 引入shortcut後,error suface變得平滑很多,梯度的可預測性變得更好,顯然更容易優化

六、Residual Block的分析與改進

論文Identity Mappings in Deep Residual Networks進一步研究ResNet,通過ResNet反向傳播的理論分析以及調整Residual Block的結構,得到了新的結構,如下

注意,這裏的視角與之前不同,這裏將shortcut路徑視爲主幹路徑,將殘差路徑視爲旁路。

新提出的Residual Block結構,具有更強的泛化能力,能更好地避免“退化”,堆疊大於1000層後,性能仍在變好。具體的變化在於

  • **通過保持shortcut路徑的“純淨”,可以讓信息在前向傳播和反向傳播中平滑傳遞,這點十分重要。**爲此,如無必要,不引入1×1卷積等操作,同時將上圖灰色路徑上的ReLU移到了F(x)F(x)路徑上。
  • 在殘差路徑上,將BN和ReLU統一放在weight前作爲pre-activation,獲得了“Ease of optimization”以及“Reducing overfitting”的效果。

七、ResNet18 Tensorflow2.0 實現

GitHub地址:https://github.com/freeshow/ComputerVisionStudy

八、參考鏈接

  • https://my.oschina.net/u/876354/blog/1622896
  • https://zhuanlan.zhihu.com/p/31852747
  • https://www.cnblogs.com/shine-lee/p/12363488.html

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