深度殘差網(wǎng)絡(luò)(Deep residual network, ResNet)的提出是CNN圖像史上的一件里程碑事件朋魔,在2015年提出的時(shí)候便取得了五項(xiàng)第一棚菊,而何愷明大神也憑借這一paper斬獲CVPR 2016 Best Paper Honorable Mention显押。
目錄
- 背景(深度網(wǎng)絡(luò)的退化問(wèn)題)
- 殘差結(jié)構(gòu)
- 殘差結(jié)構(gòu)起作用的原因
- 網(wǎng)絡(luò)結(jié)構(gòu)
- 實(shí)驗(yàn)結(jié)果
- 論文地址
背景(深度網(wǎng)絡(luò)的退化問(wèn)題)
- 對(duì)于卷積神經(jīng)網(wǎng)絡(luò)扳肛,深度是一個(gè)很重要的因素。深度卷積網(wǎng)絡(luò)自然的整合了低中高不同層次的特征乘碑,特征的層次可以靠加深網(wǎng)絡(luò)的層次來(lái)豐富挖息。因此在構(gòu)建卷積網(wǎng)絡(luò)時(shí),網(wǎng)絡(luò)的深度越高兽肤,可抽取的特征層次就越豐富越抽象套腹。所以一般我們會(huì)傾向于使用更深層次的網(wǎng)絡(luò)結(jié)構(gòu),以便取得更高層次的特征资铡。但是更深層的網(wǎng)絡(luò)結(jié)構(gòu)真的帶來(lái)了更好的表現(xiàn)嗎电禀?我們看下面這張圖:
image - 可以看到,擁有56層數(shù)的網(wǎng)絡(luò)結(jié)構(gòu)表現(xiàn)明顯差于擁有20層數(shù)的網(wǎng)絡(luò)結(jié)構(gòu)害驹,造成這一現(xiàn)象的原因大概有:過(guò)擬合鞭呕、梯度消失/爆炸和深度網(wǎng)絡(luò)的退化,我們來(lái)一一剖析宛官。
過(guò)擬合
- 對(duì)于這一點(diǎn)答案是顯然的葫松,因?yàn)檫^(guò)擬合會(huì)讓網(wǎng)絡(luò)在訓(xùn)練集上表現(xiàn)得很好,而從上圖我們可以看出底洗,無(wú)論是在訓(xùn)練集還是測(cè)試集中腋么,擁有更深層次的網(wǎng)絡(luò)表現(xiàn)均比淺層次的網(wǎng)絡(luò)差,那顯然就不是過(guò)擬合導(dǎo)致的亥揖。
梯度消失/爆炸
- 我們先簡(jiǎn)單回顧一下概念:梯度消失/爆炸是因?yàn)樯窠?jīng)網(wǎng)絡(luò)在反向傳播的時(shí)候珊擂,反向連乘的梯度小于1(或大于1),導(dǎo)致連乘的次數(shù)多了之后(網(wǎng)絡(luò)層數(shù)加深)费变,傳回首層的梯度過(guò)小甚至為0(過(guò)大甚至無(wú)窮大)摧扇,這就是梯度消失/爆炸的概念。
- 但我們知道挚歧,如今我們已經(jīng)習(xí)慣加入BN層(Batch Normalize)扛稽,他可以通過(guò)規(guī)整數(shù)據(jù)的分布基本解決梯度消失/爆炸的問(wèn)題,所以這個(gè)問(wèn)題也不是導(dǎo)致深層網(wǎng)絡(luò)退化的原因滑负。
深度網(wǎng)絡(luò)的退化問(wèn)題
- 我們選擇加深網(wǎng)絡(luò)的層數(shù)在张,是希望深層的網(wǎng)絡(luò)的表現(xiàn)能比淺層好,或者是希望它的表現(xiàn)至少和淺層網(wǎng)絡(luò)持平(相當(dāng)于直接復(fù)制淺層網(wǎng)絡(luò)的特征)矮慕,可實(shí)際的結(jié)果卻讓我們大吃一驚(深度網(wǎng)絡(luò)退化)帮匾,接下來(lái)我們深究一下導(dǎo)致深度網(wǎng)絡(luò)退化的原因。
- 在MobileNet V2的論文中提到痴鳄,由于非線性激活函數(shù)Relu的存在瘟斜,每次輸入到輸出的過(guò)程都幾乎是不可逆的,這也造成了許多不可逆的信息損失。我們?cè)囅胍幌潞咦粋€(gè)特征的一些有用的信息損失了明未,那他的表現(xiàn)還能做到持平嗎槽华?答案是顯然的
image -
我們用一個(gè)直觀的例子來(lái)感受一下深層網(wǎng)絡(luò)與淺層網(wǎng)絡(luò)持平的表現(xiàn):
image
- 我們把右邊的網(wǎng)絡(luò)理解為左邊淺層網(wǎng)絡(luò)加深了三層(框起來(lái)的部分)壹蔓,假如我們希望右邊的深層網(wǎng)絡(luò)與左邊的淺層網(wǎng)絡(luò)持平,即是希望框起來(lái)的三層跟沒加一樣猫态,也就是加的三層的輸入等于輸出佣蓉。我們假設(shè)這三層的輸入為
,輸出為
亲雪,那么深層網(wǎng)絡(luò)與淺層網(wǎng)絡(luò)表現(xiàn)持平的直觀理解即是:
勇凭,這種讓輸出等于輸入的方式,就是論文中提到的恒等映射(identity mapping)义辕。
- 所以ResNet的初衷虾标,就是讓網(wǎng)絡(luò)擁有這種恒等映射的能力,能夠在加深網(wǎng)絡(luò)的時(shí)候灌砖,至少能保證深層網(wǎng)絡(luò)的表現(xiàn)至少和淺層網(wǎng)絡(luò)持平璧函。
殘差結(jié)構(gòu)
- 通過(guò)對(duì)深度網(wǎng)絡(luò)退化問(wèn)題的認(rèn)識(shí)我們已經(jīng)明白,要讓之不退化基显,根本原因就是如何做到恒等映射蘸吓。事實(shí)上,已有的神經(jīng)網(wǎng)絡(luò)很難擬合潛在的恒等映射函數(shù)
撩幽。但如果把網(wǎng)絡(luò)設(shè)計(jì)為
库继,即直接把恒等映射作為網(wǎng)絡(luò)的一部分,就可以把問(wèn)題轉(zhuǎn)化為學(xué)習(xí)一個(gè)殘差函數(shù)
.只要
窜醉,就構(gòu)成了一個(gè)恒等映射
宪萄。 而且,擬合殘差至少比擬合恒等映射容易得多(后面第三部分會(huì)解釋)榨惰。我們看一下殘差結(jié)構(gòu)與正常結(jié)構(gòu)對(duì)比圖:
image - 我們可以看到拜英,殘差結(jié)構(gòu)比正常的結(jié)構(gòu)多了右側(cè)的曲線,這個(gè)曲線也叫作shortcut connection读串,通過(guò)跳接在激活函數(shù)前聊记,將上一層(或幾層)的輸出與本層輸出相加,將求和的結(jié)果輸入到激活函數(shù)作為本層的輸出恢暖。
- 我們從數(shù)學(xué)的角度來(lái)看殘差結(jié)構(gòu)排监,假設(shè)殘差結(jié)構(gòu)的輸入為
,則輸出
等于:
- 其中
就是我們要學(xué)習(xí)的殘差,我們把
移到等式的左側(cè)杰捂,殘差就等于
舆床,以上圖為例,殘差就是中間有一個(gè)Relu激活的雙層權(quán)重,即:
- 其中
是Relu激活函數(shù)挨队,而
是指兩個(gè)weight layer谷暮。
殘差結(jié)構(gòu)起作用的原因
- 關(guān)于殘差結(jié)構(gòu)之所以work,我想這一點(diǎn)也是很多讀者疑惑的地方盛垦,這里分四點(diǎn)和大家解釋湿弦。
- 首先給大家一個(gè)我自己的理解:我覺得加了殘差結(jié)構(gòu)后就是給了輸入
多一個(gè)選擇,在神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)到這層的參數(shù)是冗余的時(shí)候它可以選擇直接走這條“跳接”曲線腾夯,跳過(guò)這個(gè)冗余層颊埃,而不需要再去擬合參數(shù)使得輸出
等于
。
- 因?yàn)?strong>學(xué)習(xí)殘差的計(jì)算量比學(xué)習(xí)輸出等于輸入小蝶俱。假設(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)重一般會(huì)初始化成0附近的數(shù),那么我們就很容易理解浅侨,為什么讓
(經(jīng)過(guò)權(quán)重矩陣)擬合0會(huì)比
容易了纽谒。
- 我們知道ReLU能夠?qū)⒇?fù)數(shù)激活為0,而正數(shù)輸入等于輸出如输。這相當(dāng)于過(guò)濾了負(fù)數(shù)的線性變化鼓黔,讓
變得更加容易。
- 我們知道殘差網(wǎng)絡(luò)可以表示成
不见,這就說(shuō)明了在求輸出
對(duì)輸入
的倒數(shù)(梯度)澳化,也就是在反向傳播的時(shí)候,
稳吮,殘差結(jié)構(gòu)的這個(gè)常數(shù)1也能保證在求梯度的時(shí)候梯度不會(huì)消失缎谷。
網(wǎng)絡(luò)結(jié)構(gòu)
-
先上網(wǎng)絡(luò)的結(jié)構(gòu)圖,左到右分別是VGG灶似,沒有殘差的PlainNet列林,有殘差的ResNet,我們從這張圖也可以感受當(dāng)年ResNet對(duì)VGG的統(tǒng)治力:
image - 細(xì)心的讀者會(huì)發(fā)現(xiàn)酪惭,在ResNet中有的跳接線是實(shí)線希痴,有的跳接線是虛線。虛線的代表這些模塊前后的維度不一致春感,因?yàn)槿サ魵埐罱Y(jié)構(gòu)的Plain網(wǎng)絡(luò)還是和VGG一樣砌创,也就是每隔n層進(jìn)行下采樣但深度翻倍(VGG通過(guò)池化層下采樣ResNet通過(guò)卷積)虏缸。這里就有兩個(gè)情況:
- 空間上不一致時(shí),需要給輸入的X做一個(gè)線性的映射:
- 深度上不一致時(shí)嫩实,有兩種解決方法刽辙,一種是在跳接過(guò)程中加一個(gè)1×1的卷積層進(jìn)行升維,另一種則是直接補(bǔ)零(先做下采樣)甲献。試驗(yàn)后發(fā)現(xiàn)兩種方法都可以宰缤。
- 針對(duì)比較深的神經(jīng)網(wǎng)絡(luò),作者也考慮到計(jì)算量竟纳,會(huì)先用1×1的卷積將輸入的256維降到64維撵溃,然后通過(guò)1×1恢復(fù)。這樣做的目的是減少參數(shù)量和計(jì)算量锥累。
image
實(shí)驗(yàn)結(jié)果
-
作者對(duì)比了18層的神經(jīng)網(wǎng)絡(luò)和34層的神經(jīng)網(wǎng)絡(luò),發(fā)現(xiàn)殘差結(jié)構(gòu)確實(shí)解決了網(wǎng)絡(luò)的退化問(wèn)題:
image - 作者還對(duì)比了在
ImgaeNet
上的測(cè)試結(jié)果集歇,發(fā)現(xiàn)ResNet
確實(shí)效果非常好:
image