深度殘差網(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ò)退化的原因。
- 在MobileNet V2的論文中提到,由于非線性激活函數(shù)Relu的存在,每次輸入到輸出的過程都幾乎是不可逆的,這也造成了許多不可逆的信息損失。我們試想一下,一個特征的一些有用的信息損失了,那他的表現(xiàn)還能做到持平嗎?答案是顯然的
image -
我們用一個直觀的例子來感受一下深層網(wǎng)絡(luò)與淺層網(wǎng)絡(luò)持平的表現(xiàn):
image
- 我們把右邊的網(wǎng)絡(luò)理解為左邊淺層網(wǎng)絡(luò)加深了三層(框起來的部分),假如我們希望右邊的深層網(wǎng)絡(luò)與左邊的淺層網(wǎng)絡(luò)持平,即是希望框起來的三層跟沒加一樣,也就是加的三層的輸入等于輸出。我們假設(shè)這三層的輸入為
,輸出為
,那么深層網(wǎng)絡(luò)與淺層網(wǎng)絡(luò)表現(xiàn)持平的直觀理解即是:
,這種讓輸出等于輸入的方式,就是論文中提到的恒等映射(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ù)
。但如果把網(wǎng)絡(luò)設(shè)計為
,即直接把恒等映射作為網(wǎng)絡(luò)的一部分,就可以把問題轉(zhuǎn)化為學(xué)習一個殘差函數(shù)
.只要
,就構(gòu)成了一個恒等映射
。 而且,擬合殘差至少比擬合恒等映射容易得多(后面第三部分會解釋)。我們看一下殘差結(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)的輸入為
,則輸出
等于:
- 其中
就是我們要學(xué)習的殘差,我們把
移到等式的左側(cè),殘差就等于
,以上圖為例,殘差就是中間有一個Relu激活的雙層權(quán)重,即:
- 其中
是Relu激活函數(shù),而
是指兩個weight layer。
殘差結(jié)構(gòu)起作用的原因
- 關(guān)于殘差結(jié)構(gòu)之所以work,我想這一點也是很多讀者疑惑的地方,這里分四點和大家解釋。
- 首先給大家一個我自己的理解:我覺得加了殘差結(jié)構(gòu)后就是給了輸入
多一個選擇,在神經(jīng)網(wǎng)絡(luò)學(xué)習到這層的參數(shù)是冗余的時候它可以選擇直接走這條“跳接”曲線,跳過這個冗余層,而不需要再去擬合參數(shù)使得輸出
等于
。
- 因為學(xué)習殘差的計算量比學(xué)習輸出等于輸入小。假設(shè)普通網(wǎng)絡(luò)為A,殘差網(wǎng)絡(luò)為B,輸入為2,輸出為2(輸入和輸出一樣是為了模擬冗余層需要恒等映射的情況),那么普通網(wǎng)絡(luò)就是
,而殘差網(wǎng)絡(luò)就是
,顯然殘差網(wǎng)絡(luò)中的
。我們知道網(wǎng)絡(luò)中權(quán)重一般會初始化成0附近的數(shù),那么我們就很容易理解,為什么讓
(經(jīng)過權(quán)重矩陣)擬合0會比
容易了。
- 我們知道ReLU能夠?qū)⒇摂?shù)激活為0,而正數(shù)輸入等于輸出。這相當于過濾了負數(shù)的線性變化,讓
變得更加容易。
- 我們知道殘差網(wǎng)絡(luò)可以表示成
,這就說明了在求輸出
對輸入
的倒數(shù)(梯度),也就是在反向傳播的時候,
,殘差結(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做一個線性的映射:
- 深度上不一致時,有兩種解決方法,一種是在跳接過程中加一個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







