CVPR2016:ResNet 從根本上解決深度網(wǎng)絡(luò)退化問題

深度殘差網(wǎng)絡(luò)(Deep residual network, ResNet)的提出是CNN圖像史上的一件里程碑事件,在2015年提出的時候便取得了五項第一,而何愷明大神也憑借這一paper斬獲CVPR 2016 Best Paper Honorable Mention。

目錄

  • 背景(深度網(wǎng)絡(luò)的退化問題)
  • 殘差結(jié)構(gòu)
  • 殘差結(jié)構(gòu)起作用的原因
  • 網(wǎng)絡(luò)結(jié)構(gòu)
  • 實驗結(jié)果
  • 論文地址

背景(深度網(wǎng)絡(luò)的退化問題)

  • 對于卷積神經(jīng)網(wǎng)絡(luò),深度是一個很重要的因素。深度卷積網(wǎng)絡(luò)自然的整合了低中高不同層次的特征,特征的層次可以靠加深網(wǎng)絡(luò)的層次來豐富。因此在構(gòu)建卷積網(wǎng)絡(luò)時,網(wǎng)絡(luò)的深度越高,可抽取的特征層次就越豐富越抽象。所以一般我們會傾向于使用更深層次的網(wǎng)絡(luò)結(jié)構(gòu),以便取得更高層次的特征。但是更深層的網(wǎng)絡(luò)結(jié)構(gòu)真的帶來了更好的表現(xiàn)嗎?我們看下面這張圖:
    image
  • 可以看到,擁有56層數(shù)的網(wǎng)絡(luò)結(jié)構(gòu)表現(xiàn)明顯差于擁有20層數(shù)的網(wǎng)絡(luò)結(jié)構(gòu),造成這一現(xiàn)象的原因大概有:過擬合、梯度消失/爆炸和深度網(wǎng)絡(luò)的退化,我們來一一剖析。

過擬合

  • 對于這一點答案是顯然的,因為過擬合會讓網(wǎng)絡(luò)在訓(xùn)練集上表現(xiàn)得很好,而從上圖我們可以看出,無論是在訓(xùn)練集還是測試集中,擁有更深層次的網(wǎng)絡(luò)表現(xiàn)均比淺層次的網(wǎng)絡(luò)差,那顯然就不是過擬合導(dǎo)致的。

梯度消失/爆炸

  • 我們先簡單回顧一下概念:梯度消失/爆炸是因為神經(jīng)網(wǎng)絡(luò)在反向傳播的時候,反向連乘的梯度小于1(或大于1),導(dǎo)致連乘的次數(shù)多了之后(網(wǎng)絡(luò)層數(shù)加深),傳回首層的梯度過小甚至為0(過大甚至無窮大),這就是梯度消失/爆炸的概念。
  • 但我們知道,如今我們已經(jīng)習慣加入BN層(Batch Normalize),他可以通過規(guī)整數(shù)據(jù)的分布基本解決梯度消失/爆炸的問題,所以這個問題也不是導(dǎo)致深層網(wǎng)絡(luò)退化的原因。

深度網(wǎng)絡(luò)的退化問題

  • 我們選擇加深網(wǎng)絡(luò)的層數(shù),是希望深層的網(wǎng)絡(luò)的表現(xiàn)能比淺層好,或者是希望它的表現(xiàn)至少和淺層網(wǎng)絡(luò)持平(相當于直接復(fù)制淺層網(wǎng)絡(luò)的特征),可實際的結(jié)果卻讓我們大吃一驚(深度網(wǎng)絡(luò)退化),接下來我們深究一下導(dǎo)致深度網(wǎng)絡(luò)退化的原因。
  1. MobileNet V2的論文中提到,由于非線性激活函數(shù)Relu的存在,每次輸入到輸出的過程都幾乎是不可逆的,這也造成了許多不可逆的信息損失。我們試想一下,一個特征的一些有用的信息損失了,那他的表現(xiàn)還能做到持平嗎?答案是顯然的
    image
  2. 我們用一個直觀的例子來感受一下深層網(wǎng)絡(luò)與淺層網(wǎng)絡(luò)持平的表現(xiàn):


    image
  • 我們把右邊的網(wǎng)絡(luò)理解為左邊淺層網(wǎng)絡(luò)加深了三層(框起來的部分),假如我們希望右邊的深層網(wǎng)絡(luò)與左邊的淺層網(wǎng)絡(luò)持平,即是希望框起來的三層跟沒加一樣,也就是加的三層的輸入等于輸出。我們假設(shè)這三層的輸入為x,輸出為H(x),那么深層網(wǎng)絡(luò)與淺層網(wǎng)絡(luò)表現(xiàn)持平的直觀理解即是:H(x)=x,這種讓輸出等于輸入的方式,就是論文中提到的恒等映射(identity mapping)。
  • 所以ResNet的初衷,就是讓網(wǎng)絡(luò)擁有這種恒等映射的能力,能夠在加深網(wǎng)絡(luò)的時候,至少能保證深層網(wǎng)絡(luò)的表現(xiàn)至少和淺層網(wǎng)絡(luò)持平。

殘差結(jié)構(gòu)

  • 通過對深度網(wǎng)絡(luò)退化問題的認識我們已經(jīng)明白,要讓之不退化,根本原因就是如何做到恒等映射。事實上,已有的神經(jīng)網(wǎng)絡(luò)很難擬合潛在的恒等映射函數(shù)H(x) = x。但如果把網(wǎng)絡(luò)設(shè)計為H(x) = F(x) + x,即直接把恒等映射作為網(wǎng)絡(luò)的一部分,就可以把問題轉(zhuǎn)化為學(xué)習一個殘差函數(shù)F(x) = H(x) - x.只要F(x)=0,就構(gòu)成了一個恒等映射H(x) = x。 而且,擬合殘差至少比擬合恒等映射容易得多(后面第三部分會解釋)。我們看一下殘差結(jié)構(gòu)與正常結(jié)構(gòu)對比圖:
    image
  • 我們可以看到,殘差結(jié)構(gòu)比正常的結(jié)構(gòu)多了右側(cè)的曲線,這個曲線也叫作shortcut connection通過跳接在激活函數(shù)前,將上一層(或幾層)的輸出與本層輸出相加,將求和的結(jié)果輸入到激活函數(shù)作為本層的輸出。
  • 我們從數(shù)學(xué)的角度來看殘差結(jié)構(gòu),假設(shè)殘差結(jié)構(gòu)的輸入為x,則輸出H(x)等于:H(x)=F(x,{W_i})+x
  • 其中F(x,{W_i})就是我們要學(xué)習的殘差,我們把x移到等式的左側(cè),殘差就等于H(x)-x,以上圖為例,殘差就是中間有一個Relu激活的雙層權(quán)重,即:
    F=W_2\sigma(W1_x)
  • 其中\sigma是Relu激活函數(shù),而W_1,W_2是指兩個weight layer。

殘差結(jié)構(gòu)起作用的原因

  • 關(guān)于殘差結(jié)構(gòu)之所以work,我想這一點也是很多讀者疑惑的地方,這里分四點和大家解釋。
  1. 首先給大家一個我自己的理解:我覺得加了殘差結(jié)構(gòu)后就是給了輸入x多一個選擇,在神經(jīng)網(wǎng)絡(luò)學(xué)習到這層的參數(shù)是冗余的時候它可以選擇直接走這條“跳接”曲線,跳過這個冗余層,而不需要再去擬合參數(shù)使得輸出H(x)等于x。
  2. 因為學(xué)習殘差的計算量比學(xué)習輸出等于輸入小。假設(shè)普通網(wǎng)絡(luò)為A,殘差網(wǎng)絡(luò)為B,輸入為2,輸出為2(輸入和輸出一樣是為了模擬冗余層需要恒等映射的情況),那么普通網(wǎng)絡(luò)就是A(2)=2,而殘差網(wǎng)絡(luò)就是B(2)=F(2)+2=2,顯然殘差網(wǎng)絡(luò)中的F(2)=0。我們知道網(wǎng)絡(luò)中權(quán)重一般會初始化成0附近的數(shù),那么我們就很容易理解,為什么讓F(2)(經(jīng)過權(quán)重矩陣)擬合0會比A(2)=2容易了。
  3. 我們知道ReLU能夠?qū)⒇摂?shù)激活為0,而正數(shù)輸入等于輸出。這相當于過濾了負數(shù)的線性變化,讓F(x)=0變得更加容易。
  4. 我們知道殘差網(wǎng)絡(luò)可以表示成H(x)=F(x)+x,這就說明了在求輸出H(x)對輸入x的倒數(shù)(梯度),也就是在反向傳播的時候,H'(x)=F'(x)+1,殘差結(jié)構(gòu)的這個常數(shù)1也能保證在求梯度的時候梯度不會消失。

網(wǎng)絡(luò)結(jié)構(gòu)

  • 先上網(wǎng)絡(luò)的結(jié)構(gòu)圖,左到右分別是VGG,沒有殘差的PlainNet,有殘差的ResNet,我們從這張圖也可以感受當年ResNet對VGG的統(tǒng)治力:


    image
  • 細心的讀者會發(fā)現(xiàn),在ResNet中有的跳接線是實線,有的跳接線是虛線。虛線的代表這些模塊前后的維度不一致,因為去掉殘差結(jié)構(gòu)的Plain網(wǎng)絡(luò)還是和VGG一樣,也就是每隔n層進行下采樣但深度翻倍(VGG通過池化層下采樣ResNet通過卷積)。這里就有兩個情況:
  • 空間上不一致時,需要給輸入的X做一個線性的映射:H(x)=F(x,{W_i})+x -> H(x)=F(x,{W_i})+W_sx
  • 深度上不一致時,有兩種解決方法,一種是在跳接過程中加一個1×1的卷積層進行升維,另一種則是直接補零(先做下采樣)。試驗后發(fā)現(xiàn)兩種方法都可以。
  • 針對比較深的神經(jīng)網(wǎng)絡(luò),作者也考慮到計算量,會先用1×1的卷積將輸入的256維降到64維,然后通過1×1恢復(fù)。這樣做的目的是減少參數(shù)量和計算量
    image

實驗結(jié)果

  • 作者對比了18層的神經(jīng)網(wǎng)絡(luò)和34層的神經(jīng)網(wǎng)絡(luò),發(fā)現(xiàn)殘差結(jié)構(gòu)確實解決了網(wǎng)絡(luò)的退化問題:


    image
  • 作者還對比了在ImgaeNet上的測試結(jié)果,發(fā)現(xiàn)ResNet確實效果非常好:
    image

論文地址

https://arxiv.org/pdf/1512.03385.pdf

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容