天天看點

為什麼ResNet和DenseNet可以這麼深?一文詳解殘差塊為何有助于解決梯度彌散問題。

傳統的“提拉米蘇”式卷積神經網絡模型,都以層疊卷積層的方式提高網絡深度,進而提高識别精度。但層疊過多的卷積層會出現一個問題,就是梯度彌散(Vanishing),backprop無法有效地把梯度更新到前面的網絡層,導緻前面的層參數無法更新。

而BatchNormalization(BN)、ResNet的skip connection就是為了解決這個問題,BN通過規範化輸入資料改變資料分布,在前傳過程中消除梯度彌散。而skip connection則能在後傳過程中更好地把梯度傳到更淺的層次中。那麼問題來了,

為什麼加了一個捷徑就能把梯度傳到淺層網絡?

這個要從神經網絡梯度更新的過程說起,如果讀者已經非常熟悉神經網絡的梯度更新,可以快進這部分,但這個梯度更新的原理才是整個問題的關鍵。

這裡主要引用cs231n的講義,個人認為這是了解神經網絡梯度更新講得最好的課程,建議直接看cs231n 2016的視訊講解,Andrej Karpathy在視訊裡講得非常清晰,配合他的PPT看非常易懂,這裡是位址:CS231n Winter 2016: Lecture 4: Backpropagation, Neural Networks 1。這裡是YouTube視訊連結,國内的朋友請百度:cs231n 2016視訊。

由于篇幅原因,就不像Andrej在視訊裡從執行個體講起那麼詳細了,這裡就隻講梯度在中間層傳播時的計算過程,如果還沒完全了解神經網絡梯度更新原理的,建議先把視訊看完。

圖1 來自斯坦福cs231n課程slides

當梯度傳播到中間層的神經元f時,如圖1所示,來自上一層的梯度dLdz從右邊z進入,傳到中間的神經元。此神經元在左邊有兩個輸入,分别是x和y,為了計算L對于x和y的梯度dLdx和dLdy,就必須先計算dzdx和dzdy,根據複合函數求導公式,dLdx = dLdz * dzdx,dLdy = dLdz * dzdy,這樣就能算出傳播到x和y的梯度了。也就是說通過這個方法,來自深一層的梯度就能傳播到x和y當中。

圖2

讓我們來考慮一個新的情況。圖2虛線框為一個神經元block,假設輸入x為10,權重w1=0.1,w2=0.1,w3=0.1,w4=0.1,每個神經元對輸入的操作均為相乘。我們對它進行前傳和後傳的計算,看看梯度的變化情況:

前向傳播:

首先x與w1相乘,得到1;1與w2相乘,得到0.1,以此類推,如下面的gif圖綠色數字表示

圖3 前向傳播

後向傳播:

假設從下一層網絡傳回來的梯度為1(最右邊的數字),後向傳播的梯度數值如下面gif圖紅色數字表示:

圖4 後向傳播

那麼這裡可以看到,本來從上一層傳過來的梯度為1,經過這個block之後,得到的梯度已經變成了0.0001和0.01,也就是說,梯度流過一個blcok之後,就已經下降了幾個量級,傳到前一層的梯度将會變得很小!

這就是梯度彌散。假如模型的層數越深,這種梯度彌散的情況就更加嚴重,導緻淺層部分的網絡權重參數得不到很好的訓練,這就是為什麼在Resnet出現之前,CNN網絡都不超過二十幾層的原因。

既然梯度經過一層層的卷積層會逐漸衰減,我們來考慮一個新的結構,如圖5:

圖5

假如,我們在這個block的旁邊加了一條“捷徑”(如圖5橙色箭頭),也就是常說的“skip connection”。假設左邊的上一層輸入為x,虛線框的輸出為f(x),上下兩條路線輸出的激活值相加為h(x),即h(x) = F(x) + x,得出的h(x)再輸入到下一層。

圖6

當進行後向傳播時,右邊來自深層網絡傳回來的梯度為1,經過一個加法門,橙色方向的梯度為dh(x)/dF(x)=1,藍色方向的梯度也為1。這樣,經過梯度傳播後,現在傳到前一層的梯度就變成了[1, 0.0001, 0.01],多了一個“1”!正是由于多了這條捷徑,來自深層的梯度能直接暢通無阻地通過,去到上一層,使得淺層的網絡層參數等到有效的訓練!

這個想法是何等的簡約而偉大,不得不佩服作者的強大的思維能力!

圖7

如圖7,左邊來了一輛裝滿了“梯度”商品的貨車,來領商品的客人一般都要排隊一個個拿才可以,如果排隊的人太多,後面的人就沒有了。于是這時候派了一個人走了“快捷通道”,到貨車上領了一部分“梯度”,直接送給後面的人,這樣後面排隊的客人就能拿到更多的“梯度”。

圖8

ResNet正是有了這樣的Skip Connection,梯度能暢通無阻地通過各個Res blocks,作者何凱明說到,唯一影響深度的就是記憶體不足,是以隻要記憶體足夠,上千層的殘差網絡也都能實作。

而DenseNet更為極端,它的skip connection不僅僅隻連接配接上下層,直接實作了跨層連接配接,每一層獲得的梯度都是來自前面幾層的梯度加成。

圖9 DenseNet結構

DenseNet在增加深度的同時,加寬每一個DenseBlock的網絡寬度,能夠增加網絡識别特征的能力,而且由于DenseBlock的橫向結構類似 Inception block的結構,使得需要計算的參數量大大降低。因而此論文獲得了CVPR2017最佳論文獎項!

圖10 DenseNet詳細結構 來自原論文

ResBlock與BN的結合能夠完美解決梯度彌散的問題,這使得更深的網絡成為可能。卷積神經網絡除了不斷往深度發展,在寬度上也不斷拓展,兩者結合起來可以創造出更強大的CNN模型。期待更多傑出的工作!

由于筆者水準尚淺,對上面的概念了解或許有偏差,歡迎各位指正,不勝感激。如果覺得這篇文章對您有幫助,請分享給您的朋友,讓更多人一起學習。

本文作者:Non

繼續閱讀