您當前的位置:首頁 > 動漫

deeplearning.ai-深度卷積神經網路-例項1-殘差網路

作者:由 你看這是一隻肥仔 發表于 動漫時間:2017-12-08

ResNet的發明者是何凱明( Kaiming He)、張翔宇( Xiangyu Zhang)、任少卿( ShaoqingRen)和孫劍( Jiangxi Sun)

殘差網路更容易最佳化,並且能夠透過增加相當的深度來提高準確率。核心是解決了增加深度帶來的副作用(退化問題),這樣能夠透過單純地增加網路深度,來提高網路效能。

深度學習底層到高層並且

隨著層數的增加底/中/高層特徵越豐富

,指出在很多的機器視覺比賽中比賽的獲得者都在深度學習網路加深獲得很大的模型效能提升。

是否更深的網路意味著更好的深度學習模型?這個問題的答案受著梯度消失/梯度爆炸的桎梏,這阻礙著網路的收斂,使用初始歸一化和批歸一化可以緩解梯度消失/梯度爆炸的問題使得網路的深度可以進一步的加深。但是在訓練更深的網路時候會發生退化的問題也就是

隨著模型的規模加大模型的在訓練和測試集效能同時下降

,這並不是過擬合的問題(過擬合問題應該是模型在訓練集上效能越來越好)。

deeplearning.ai-深度卷積神經網路-例項1-殘差網路

隨後作者做了一個實驗,在一個淺層神經網路中

逐漸加入恆等對映的層

,因為加入的層都是對淺層神經網路最後層輸出的一個恆等對映,

所以逐漸加入恆等對映層模型的效能應該不會出現比淺層神經網路效能差的現象

,但是實驗表明,我們目前現有的解決方案無法找到與構建的解決方案相比相對不錯或更好的解決方案(或在合理的時間內無法實現)。

在文章中提出使用殘差網路框架解決上面提到的退化問題,使用每一個殘差模組擬合殘差對映,而不是使用多個神經堆疊層去直接擬合期望對映。期望對映為H(x),使用堆疊非線性神經網路擬合另外一個對映F(x) = H(x) – x,那麼原始期望對映H(x) = F(x) + x,我們

假設殘差對映(F(x))要比原始期望對映H(x)容易最佳化,(

這是剛開始的假設,文章中的實驗確實證明了假設的正確性,作者在文章中並沒有進行理論的證明

H(x) – x可以透過帶有“shortcut connection”的前向神經網路實現(殘差模組),在作者使用的殘差模組中的“shortcut connection”就是完成一個恆等對映(identity mapping)如圖

deeplearning.ai-深度卷積神經網路-例項1-殘差網路

恆等對映並沒有給網路加入任何學習引數及計算的複雜度,整個網路仍然可以由帶有反向傳播的SGD進行端到端的訓練,並且可以使用公共庫(例如,Caffe [19])輕鬆實現,而無需修改求解器。

1:殘差網路有相比於同等深度的普通網路(plainnetworks)更容易最佳化。

2:殘差網路有相比於同等深度的普通網路(plain networks)隨著深度的增加能夠獲得更多 的新能提升。

網路效能很好,而且不止是適用於imageNet資料(這個網路拿了第一名啊),還有其他很多機器視覺比賽中拿獎(文章中列舉了很多,簡直是拿獎拿到手軟),

堅實的證據表明殘差學習準則是通用的。

以下一個是另外一個知乎中評論中給出來的很好的解釋(之前看到並複製下來的,今天寫這篇的時候沒找到原連結)

F是求和前網路對映,H是從輸入到求和後的網路對映。比如把5對映到5。1,那麼引入殘差前是F‘(5)=5。1,引入殘差後是H(5)=5。1, H(5)=F(5)+5, F(5)=0。1。這裡的F’和F都表示網路引數對映,

引入殘差後的對映對輸出的變化更敏感

。比如s輸出從5。1變到5。2,對映F‘的輸出增加了1/51=2%,而對於殘差結構輸出從5。1到5。2,對映F是從0。1到0。2,增加了0。1/0。1 = 100%。

明顯後者輸出變化對權重的調整作用更大,所以效果更好。殘差的思想都是去掉相同的主體部分,從而突出微小的變化

,看到殘差網路我第一反應就是差分放大器

以下內容是吳恩達課程中做的筆記

跳躍連線

( Skip connection),它可以從某一層網路層獲取啟用,然後迅速反饋給另外

一層,甚至是神經網路的更深層。

殘差塊

下圖是殘差塊中的(主要連線)main path,也就是(普通連線)plain net

deeplearning.ai-深度卷積神經網路-例項1-殘差網路

圖1

a^{l}

經過兩個神經層輸出得到

a^{l+2}

主要連線加入跳躍連線

deeplearning.ai-深度卷積神經網路-例項1-殘差網路

圖2

a^{l}

直接向後複製到深層,在第二層

a^{l+2}

的啟用函式前加入到主要連線中去,

a^{l}

直接到達神經網路的深層,這也就意味著以下公式的變化:

沒有跳躍連線的公式也就是圖一:

z^{l} = w^{l}a^{l-1} + b^{l}

a^{l} = g(z^{l})

(1)

z^{l+1} = w^{l+1}a^{l} + b^{l+1}

a^{l+1} = g(z^{l+1})

(2)

z^{l+2} = w^{l+2}a^{l+1} + b^{l+2}

a^{l+2} = g(z^{l+2})

(3)

加入跳躍連線後:

公式(1),(2)都不變,公式(3)變為

z^{l+2} = w^{l+2}a^{l+1} + b^{l+2}

a^{l+2} = g(z^{l+2} + a^{l-1})

(4)

公式(4)需要注意的是,跳躍連線是在啟用函式之前加入的

跳躍連線可以跳過一層或者好幾層,將資訊傳遞到神經網路更深層,ResNet,就是將很多上面提到的殘差塊,堆疊在一起,

以下是文章中說的一個普通神經網路(plain net)

deeplearning.ai-深度卷積神經網路-例項1-殘差網路

加入跳躍連線後

deeplearning.ai-深度卷積神經網路-例項1-殘差網路

加入使用一個標準的最佳化演算法去訓練神經網路(SGD,Adam等),隨著網路的加深訓練誤差會越來越小,然後增多,理論上應該是訓練誤差越來越小,但是如果沒有殘差網路,對於一個普通網路,

深度越深意味著網路越來越難訓練

,誤差越來越大。

但是有了ResNet之後就變的不一樣了,即使網路更深也是沒有問題的,ImageNet中使用到了152層,文章中的其他實驗作者更是做到了1000層的深度。

為什麼殘差網路能夠有效呢?

在上面度文章的時候就說明了ResNet有效的最主要原因,

學習恆等對映,更容易最佳化

以下是吳恩達在課程中解釋的原因,和上面的是一樣的

deeplearning.ai-深度卷積神經網路-例項1-殘差網路

加入要訓練一個大型網路,圖上是普通神經網路

下面的加入了殘差塊的網路,網路中使用到了Relu啟用函式,所以每層、每個神經元的啟用值>=0

圖下邊是殘差塊公式,加入我們的網路中加入了正則項,壓縮了權重,加入W=0,那麼上圖中綠色的部分就不見了最後產生了恆等對映就是:

a^{l} = a^{l+2}

在上面也提到過,殘差網路的假設是

假設殘差對映(F(x))要比原始期望對映H(x)容易最佳化,儘管這個假設最後是實驗驗證正確的。

跳躍連線是的很容易得到

a^{l} = a^{l+2}

這樣的恆等變化,所以給大型神經網路增加兩層,不論是把殘差塊新增到神經網路的中間還是末端位置,都不會影響網路的表現

當然,我們的目標不僅僅是保持網路的效率,還要提升它的效率。想象一下,

如果這些

隱藏層單元學到一些有用資訊,那麼它可能比學習恆等函式表現得更好。

而這些不含有殘差

塊或跳躍連線的深度普通網路情況就不一樣了,當網路不斷加深時,就算是選用學習恆等函

數的引數都很困難,所以很多層最後的表現不但沒有更好,反而更糟。

除此之外在實現的時候,需要特別注意的是

g(z^{l+2} + a^{l-1})

最後這兩項

z^{l+2}, a^{l-1}

必須是相同維度的,這會在後面完成CNN第二次作業部分時候說明。

標簽: 殘差  對映  網路  神經網路  恆等