1. 程式人生 > >深度學習之殘差網路原理深度刨析

深度學習之殘差網路原理深度刨析

為什麼要加深網路?

深度卷積網路自然的整合了低中高不同層次的特徵,特徵的層次可以靠加深網路的層次來豐富。
從而,在構建卷積網路時,網路的深度越高,可抽取的特徵層次就越豐富。
所以一般我們會傾向於使用更深層次的網路結構,以便取得更高層次的特徵。
但是在使用深層次的網路結構時我們會遇到兩個問題,梯度消失,梯度爆炸問題和網路退化的問題。

也就是我們需要不斷加深網路,因為網路越深,那麼特徵的層次也就越高,那麼特徵也就越豐富,
所以需要加深,但是加深後會帶來兩個問題,梯度消失或者爆炸、網路退化
通過標準的初始化和正則化層來基本解決,這樣可以確保幾十層的網路能夠收斂,
但是隨著網路層數的增加,梯度消失或者爆炸的問題仍然存在,為什麼?

之前說了,梯度消失的根本原因,是因為鏈式求導中包含很多個對啟用層的求導結果在0到1之間,原因是因為sigmod函式導致的,如果換成relu函式可以解決由於啟用層的求導導致梯度消失的問題,那麼為什麼換成了relu函式,還是會有梯度消失的問題呢?別忘了,鏈式求導中不光包含對啟用層的求導結果,它還包含了其它的求導結果,當網路很深的時候,這些求導結果如果都很小接近0的話,那麼也有可能導致梯度消失,上一篇梯度消失原因公式推導最終的梯度如下:

Loss對w1的求導為
在這裡插入圖片描述
這若干個w的值如果都很小的話,那麼連乘起來也會越來越小,所以也會導致梯度消失,這部分值如果都很大的話,那就會導致梯度爆炸

那麼網路退化又是什麼呢?

還有一個問題就是網路的退化,舉個例子,假設已經有了一個最優化的網路結構,是18層。當我們設計網路結構的時候,我們並不知道具體多少層次的網路時最優化的網路結構,假設設計了34層網路結構。那麼多出來的16層其實是冗餘的,我們希望訓練網路的過程中,模型能夠自己訓練這五層為恆等對映,也就是經過這層時的輸入與輸出完全一樣。但是往往模型很難將這16層恆等對映的引數學習正確,那麼就一定會不比最優化的18層網路結構效能好,這就是隨著網路深度增加,模型會產生退化現象。它不是由過擬合產生的,而是由冗餘的網路層學習了不是恆等對映的引數造成的。

一句話來說就是:
因為我們不知道最優的網路是多少層,只知道越深可能會越優,所以我們不斷加深網路,將它加到100層,但其實最優的層數是60層,那麼其實還有40層是多餘的,那麼理想中我們肯定希望這40層的輸入等於輸出,即希望這40層做的全是恆等對映,但是實際中這40層的輸入等於輸出概率非常小,它們學習的引數並不能使輸入等於輸出或者很難做到恆等對映,因此這40層就學習了一些實際沒用的引數,導致最終100層的效果比最優層數的效果要差一些,也就是上面說的冗餘的網路層學習了不是恆等對映的引數導致的

在這裡插入圖片描述

所以為了解決梯度消失和網路退化這兩個問題,我們的殘差網路也就誕生了,它可以說是一個里程碑吧,之前的網路像google-net也只能達到22層,但是resnet出來後,網路可以達到成百上千層

殘差的精髓

我們令x經過冗餘層對映後輸入到下一層的值是h(x),x經過冗餘層對映後的值為F(x)
在沒加短連結之前,h(x) = F(x),我們希望輸入到下一層的值h(x)=x, 但是學習x = h(x)很難,
所以我們就換個法子:
令h(x) = F(x) + x ,即讓輸入下一層的值 = 原來x的值 + x經過冗餘層對映後的值F(x)
我們的目的還是一樣希望x = h(x),也就是希望F(x) + x = x,所以也就是希望F(x) = 0,說白了就是希望x經過冗餘層對映後的值F(x)=0,因為學習它比學習原來沒加短連結的x = h(x)要簡單很多,所以短連結就誕生了,或者殘差就誕生了,這個殘差就是F(x),也就是x經過冗餘層對映後的值F(x),我們希望這個殘差為0,也就是希望x經過冗餘層對映後為0,也就能找到哪些是冗餘層

那麼殘差網路究竟是如何防止梯度消失的呢?推導如下:
在這裡插入圖片描述
看到沒這裡有個x2,對x2求偏導,看到沒,雖然在w1這一層,是對w1求偏導,但是x1經過非線性對映後輸出為x2,所以在反向對w1求偏導的時候,需要對x2,x3,…xn求偏導,
又因為
在這裡插入圖片描述

在這裡插入圖片描述

所以在反向對w1求偏導的時候,需要對包含了對x2,x3,…xn求偏導的連乘,它們計算中都會加上1,所以最終的結果肯定會離0原來越遠,所以可以有效防止梯度消失