論文 Identity Mappings in Deep Residual Networks
2015年,ResNet(Residual Neural Network)由微軟研究院的Kaiming He等四名華人提出,并在ILSVRC2015比賽中取得冠軍,在top5上的錯誤率為3.57%,同時參數量比VGGNet低,效果非常突出。目前常用的有Res18、Res50、Res101。
VGG網絡試著探尋了一下深度學習網絡的深度究竟可以深到什么程度還能持續地提高分類準確率。我們的一般印象當中,深度學習愈是深(復雜,參數多)愈是有著更強的表達能力。憑著這一基本準則CNN分類網絡自Alexnet的7層發展到了VGG的16乃至19層,后來更有了Googlenet的22層。可后來發現深度CNN網絡達到一定深度后再一味地增加層數并不能帶來進一步地分類性能提高,反而會招致網絡收斂變得更慢,test dataset的分類準確率也變得更差。排除數據集過小帶來的模型過擬合等問題后,我們發現過深的網絡仍然還會使分類準確度下降(相對于較淺些的網絡而言)。也就是說網絡出現了退化。
ResNets要解決的是深度神經網絡的“退化”問題。什么是“退化”?
我們知道,對淺層網絡逐漸疊加layers,模型在訓練集和測試集上的性能會變好,因為模型復雜度更高了,表達能力更強了,可以對潛在的映射關系擬合得更好。而“退化”指的是,給網絡疊加更多的層后,性能卻快速下降的情況。
訓練集上的性能下降,可以排除過擬合,BN層的引入也基本解決了plain net的梯度消失和梯度爆炸問題。如果不是過擬合以及梯度消失導致的,那原因是什么?
按道理,給網絡疊加更多層,淺層網絡的解空間是包含在深層網絡的解空間中的,深層網絡的解空間至少存在不差于淺層網絡的解,因為只需將增加的層變成恒等映射,其他層的權重原封不動copy淺層網絡,就可以獲得與淺層網絡同樣的性能。更好的解明明存在,為什么找不到?找到的反而是更差的解?
顯然,這是個優化問題,反映出結構相似的模型,其優化難度是不一樣的,且難度的增長并不是線性的,越深的模型越難以優化。
有兩種解決思路,一種是調整求解方法,比如更好的初始化、更好的梯度下降算法等;另一種是調整模型結構,讓模型更易于優化——改變模型結構實際上是改變了error surface的形態。
ResNet的作者從后者入手,探求更好的模型結構。將堆疊的幾層layer稱之為一個block,對于某個block,其可以擬合的函數為 F(x)F(x)F(x),如果期望的潛在映射為H(x)H(x)H(x),與其讓F(x)F(x)F(x) 直接學習潛在的映射,不如去學習殘差H(x)?xH(x)?xH(x)?x,即F(x):=H(x)?xF(x):=H(x)?xF(x):=H(x)?x,這樣原本的前向路徑上就變成了F(x)+xF(x)+xF(x)+x,用F(x)+xF(x)+xF(x)+x來擬合H(x)H(x)H(x)。作者認為這樣可能更易于優化,因為相比于讓F(x)F(x)F(x)學習成恒等映射,讓F(x)F(x)F(x)學習成0要更加容易——后者通過L2正則就可以輕松實現。這樣,對于冗余的block,只需F(x)→0F(x)→0F(x)→0就可以得到恒等映射,性能不減。
下面的問題就變成了 F(x)+xF(x)+xF(x)+x 該怎么設計了。
Residual Block的設計
F(x)+xF(x)+xF(x)+x 構成的block稱之為Residual Block,即殘差塊,如下圖所示,多個相似的Residual Block串聯構成ResNet。
一個殘差塊有2條路徑 F(x)F(x)F(x) 和 xxx,F(x)F(x)F(x) 路徑擬合殘差,不妨稱之為殘差路徑,x路徑為 identity mapping 恒等映射,稱之為 ”shortcut” 。圖中的 ⊕ 為 element-wise addition,要求參與運算的F(x)F(x)F(x)和xxx的尺寸要相同。所以,隨之而來的問題是,
- 殘差路徑如何設計?
- shortcut路徑如何設計?
- Residual Block之間怎么連接?
在原論文中,殘差路徑可以大致分成2種,一種有 bottleneck 結構,即下圖右中的1×1 卷積層,用于先降維再升維,主要出于降低計算復雜度的現實考慮,稱之為“bottleneck block”,另一種沒有bottleneck結構,如下圖左所示,稱之為“basic block”。basic block由2個3×3卷積層構成,bottleneck block由1×1
shortcut 路徑大致也可以分成2種,取決于殘差路徑是否改變了feature map數量和尺寸,一種是將輸入x原封不動地輸出,另一種則需要經過1×1卷積來升維 or/and 降采樣,主要作用是將輸出與F(x)路徑的輸出保持shape一致,對網絡性能的提升并不明顯,兩種結構如下圖所示,
至于Residual Block之間的銜接,在原論文中,F(x)+xF(x)+xF(x)+x 經過ReLU后直接作為下一個block的輸入x。對于F(x)路徑、shortcut路徑以及block之間的銜接,在文中有更進一步的研究。
下圖中實線的Connection部分(“第一個粉色矩形和第三個粉色矩形”)都是3?3?643*3*643?3?64 的特征圖,他們的channel個數一致,所以采用計算方式:
y=F(x)+xy=F(x)+xy=F(x)+x
虛線的的Connection部分(”第一個綠色矩形和第三個綠色矩形“)分別是3?3?643*3*643?3?64和3?3?1283*3*1283?3?128的特征圖,他們的channel個數不同(64和128),所以采用計算方式:
y=F(x)+Wxy=F(x)+Wxy=F(x)+Wx
其中W是卷積操作,用來調整xxx的channel維度的
在實際的實驗過程中,作者實驗了很多中不同的結構,如下圖所示,最后發現第一種是最好的。
簡單理解一下,下圖中的左圖展開之后就是右圖,可以看出,殘差網絡的結果包含了網絡中各個節點*w。
ResNet 網絡結構
ResNet 網絡參考了 VGG19 網絡,在其基礎上進行了修改,并通過短路機制加入了殘差單元,如下圖所示。ResNet 的一個重要設計原則是:當 feature map 大小降低一半時,feature map 的數量增加一倍,這保持了網絡層的復雜度。從下圖中可以看到,ResNet相比普通網絡每兩層間增加了短路機制,這就形成了殘差學習,其中虛線表示feature map數量發生了改變。下圖展示的34-layer的ResNet,還可以構建更深的網絡如表1所示。從表中可以看到,對于18-layer和34-layer的ResNet,其進行的兩層間的殘差學習,當網絡更深時,其進行的是三層間的殘差學習,三層卷積核分別是1x1,3x3和1x1,一個值得注意的是隱含層的 feature map 數量是比較小的,并且是輸出 feature map 數量的1/4。下面直觀看一下ResNet-34與34-layer plain net和VGG的對比,以及堆疊不同數量Residual Block得到的不同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數量,就可以很容易地調整網絡的寬度和深度,來得到不同表達能力的網絡,而不用過多地擔心網絡的“退化”問題,只要訓練數據足夠,逐步加深網絡,就可以獲得更好的性能表現。下面為網絡的性能對比
作者對比18-layer和34-layer的網絡效果,如下圖所示。可以看到普通的網絡出現退化現象,但是ResNet很好的解決了退化問題。
最后展示一下ResNet網絡與其他網絡在ImageNet上的對比結果,如下表所示。可以看到ResNet-152其誤差降到了4.49%,當采用集成模型后,誤差可以降到3.57%。