(pytorch-深度学习系列)ResNet残差网络的理解-学习笔记
ResNet殘差網絡的理解
ResNet伴隨文章 Deep Residual Learning for Image Recognition 誕生,該文章是MSRA何凱明團隊在2015年ImageNet上使用的網絡,在當年的classification、detection等比賽中,ResNet均獲了第一名,這也導致了ResNet聲名鵲起。
1. 提出ResNet的背景:出了什么問題
該思想的起源是訓練深度網絡中發現的一個問題,即在一定的深度下,深層網絡的訓練誤差可能大于淺層網絡的訓練誤差。
?(Fshallow(output),target)<?(Fdeep(output,target))\ell(F_{shallow}(output),target)<\ell(F_{deep}(output,target))?(Fshallow?(output),target)<?(Fdeep?(output,target))
我們一般認為,在一定的范圍內,網絡深度增加對擬合模型是有積極效應的,但是作者通過實驗證明,在同一個問題場景下(基于CIFAR-10數據集),訓練的20層和56層的網絡在性能上,56層的網絡的訓練誤差和測試誤差均大于20層的網絡,這說明了并不是網絡深度增加帶來的過擬合導致的誤差提升,那么問題出在哪呢?
?train(F20(output),target)<?train(F56(output,target))\ell_{train}(F_{20}(output),target)<\ell_{train}(F_{56}(output,target))?train?(F20?(output),target)<?train?(F56?(output,target))
?test(F20(output),target)<?test(F56(output,target))\ell_{test}(F_{20}(output),target)<\ell_{test}(F_{56}(output,target))?test?(F20?(output),target)<?test?(F56?(output,target))
如果假設20層的網絡結構在這個數據集上是最佳的網絡層數,那么理論上來說增加了網絡層數不會提升性能,但至少不會導致性能下降,哪怕該網絡前20層網絡實現與20層的網絡結構相同的輸出,后面36層網絡都只進行恒等映射也是可以達到與20層的網絡模型相同的擬合效果的(當然這種情況只是一個便于理解的假設)。
恒等映射就是:對于映射F(x)F(x)F(x):
F(x)→xF(x) \rightarrow xF(x)→x
即輸入等于輸出
不難理解,問題很可能是因為,在56層的網絡結構中,沒有很好的實現恒等映射,即網絡層很難擬合恒等映射函數F(x)→xF(x)\rightarrow xF(x)→x
2. 什么是殘差網絡
假設F(x)F(x)F(x)代表包含幾層網絡的映射,該網絡試圖將該映射擬合到一個目標映射H(x)H(x)H(x),即使得F(x)F(x)F(x)逼近H(x)H(x)H(x)
F(x)→H(x)F(x) \rightarrow H(x)F(x)→H(x)
前面說到,問題可能是由于網絡層不能很好的擬合恒等映射,但是如果我們將思路轉變為F(x)+xF(x) + xF(x)+x逼近H(x)H(x)H(x),即
F(x)+x→H(x)F(x) + x \rightarrow H(x)F(x)+x→H(x)
那么就相當于手動將恒等映射作為網絡的一部分,也就相當于使得F(x)F(x)F(x)逼近H(x)?xH(x) - xH(x)?x,即
F(x)→H(x)?xF(x) \rightarrow H(x) - xF(x)→H(x)?x
以此為理解的residual block如下圖所示:
在輸入激活函數前,將前層網絡的輸入與當前層網絡層的輸出進行結合,這樣在手動加入恒等映射的同時,還使得網絡中的數據可以跨層流動,這樣,對于過于deep的網絡,就存在了較好的自主變換為淺層網絡的可能性。
下圖為原始的網絡層間輸入輸出,可見其不同
3. 如何理解殘差網絡解決問題的方式
讓我們思考一下一般的情況,在一般情況下,網絡層數增加是會給網絡模型的性能帶來積極的影響。但是實驗又證明深層網絡可能會帶來負作用,那很可能意味著,我們要得到一個最佳的、適應性最強的網絡結構,就無法避免多余的網絡層帶來的影響。
殘差結構手動引入了恒等映射,那么當網絡結構是深的時,恒等映射部分就可以將一些網絡層引向F(x)→0F(x) \rightarrow 0F(x)→0的方向,即F(x)+x→xF(x) + x \rightarrow xF(x)+x→x
4. 為什么ResNet容易優化
ResNet就是通過殘差恒等映射,只學習輸入與輸出之間的殘差與輸入間的關系,構建了一個更容易優化的模型
假設當前層數的網絡已經達到了最優的網絡狀態,如果此時加深網絡,模型的效果反而會變差,如果只是學習residual mapping,那么就可能會將這條通路變為0,而另一條路徑identity mapping就會變成直連的,模型就仍是最優狀態。
而對于非殘差的結構,則需要在幾個堆疊的非線性層學習出一個近似恒等映射,來保證模型性能不變,這必然是低效的。
簡單來說,學習殘差模塊變為直連這個過程是相對簡單的(對比于擬合恒等映射)
5. 為什么ResNet不容易出現梯度問題
網絡越深,梯度就越容易出問題,shotcut的方式一定程度上縮短了損失的反向傳播路徑,減小了梯度風險
對于殘差塊:
xL=xl+∑i=lL?1F(xi,Wi)x_L = x_l + \sum_{i=l}^{L-1}F(x_i, W_i)xL?=xl?+i=l∑L?1?F(xi?,Wi?)
輸入為xxx,F(x)F(x)F(x)是正向傳播的映射
如果進行求梯度操作:
???xl=???xL?xL?xl=???xL(1+??xl∑i=lL?1F(xi,Wi))\frac{\partial \ell}{\partial x_l} = \frac{\partial \ell}{\partial x_L}\frac{\partial x_L}{\partial x_l}= \frac{\partial \ell}{\partial x_L}\left(1+\frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i,W_i)\right)?xl????=?xL?????xl??xL??=?xL????(1+?xl???i=l∑L?1?F(xi?,Wi?))
反向傳播的梯度由2項組成:
111
??xl∑i=lL?1F(xi,Wi)\frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i,W_i)?xl???i=l∑L?1?F(xi?,Wi?)
即使網絡的梯度為0(??xl∑i=lL?1F(xi,Wi)=0\frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i,W_i)=0?xl???∑i=lL?1?F(xi?,Wi?)=0),輸出結果也不會差于直接輸出xxx,這就避免了梯度消失的問題。
總結
以上是生活随笔為你收集整理的(pytorch-深度学习系列)ResNet残差网络的理解-学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的前半生面试过300精英+学霸,总结出
- 下一篇: “用于无监督图像生成解耦的正交雅可比正则