ResNets要解決的是深度神經網絡的「退化」問題。github
什麼是「退化」?算法
咱們知道,對淺層網絡逐漸疊加layers,模型在訓練集和測試集上的性能會變好,由於模型複雜度更高了,表達能力更強了,能夠對潛在的映射關係擬合得更好。而「退化」指的是,給網絡疊加更多的層後,性能卻快速降低的狀況。spring
訓練集上的性能降低,能夠排除過擬合,BN層的引入也基本解決了plain net的梯度消失和梯度爆炸問題。若是不是過擬合以及梯度消失致使的,那緣由是什麼?網絡
按道理,給網絡疊加更多層,淺層網絡的解空間是包含在深層網絡的解空間中的,深層網絡的解空間至少存在不差於淺層網絡的解,由於只需將增長的層變成恆等映射,其餘層的權重原封不動copy淺層網絡,就能夠得到與淺層網絡一樣的性能。更好的解明明存在,爲何找不到?找到的反而是更差的解?app
顯然,這是個優化問題,反映出結構類似的模型,其優化難度是不同的,且難度的增加並非線性的,越深的模型越難以優化。ide
有兩種解決思路,一種是調整求解方法,好比更好的初始化、更好的梯度降低算法等;另外一種是調整模型結構,讓模型更易於優化——改變模型結構其實是改變了error surface的形態。函數
ResNet的做者從後者入手,探求更好的模型結構。將堆疊的幾層layer稱之爲一個block,對於某個block,其能夠擬合的函數爲\(F(x)\),若是指望的潛在映射爲\(H(x)\),與其讓\(F(x)\) 直接學習潛在的映射,不如去學習殘差\(H(x) - x\),即\(F(x) := H(x) - x\),這樣本來的前向路徑上就變成了\(F(x) + x\),用\(F(x)+x\)來擬合\(H(x)\)。做者認爲這樣可能更易於優化,由於相比於讓\(F(x)\)學習成恆等映射,讓\(F(x)\)學習成0要更加容易——後者經過L2正則就能夠輕鬆實現。這樣,對於冗餘的block,只需\(F(x)\rightarrow 0\)就能夠獲得恆等映射,性能不減。性能
Instead of hoping each few stacked layers directly fit a desired underlying mapping, we explicitly let these layers fit a residual mapping. Formally, denoting the desired underlying mapping as \(H(x)\), we let the stacked nonlinear layers fit another mapping of \(F(x) := H(x) - x\). The original mapping is recast into \(F(x)+x\). We hypothesize that it is easier to optimize the residual mapping than to optimize the original, unreferenced mapping. To the extreme, if an identity mapping were optimal, it would be easier to push the residual to zero than to fit an identity mapping by a stack of nonlinear layers.
下面的問題就變成了\(F(x)+x\) 該怎麼設計了。
\(F(x)+x\)構成的block稱之爲Residual Block,即殘差塊,以下圖所示,多個類似的Residual Block串聯構成ResNet。
一個殘差塊有2條路徑\(F(x)\)和\(x\),\(F(x)\)路徑擬合殘差,不妨稱之爲殘差路徑,\(x\)路徑爲identity mapping恆等映射,稱之爲」shortcut」。圖中的\(\oplus\)爲element-wise addition,要求參與運算的\(F(x)\)和\(x\)的尺寸要相同。因此,隨之而來的問題是,
在原論文中,殘差路徑能夠大體分紅2種,一種有bottleneck結構,即下圖右中的\(1\times 1\) 卷積層,用於先降維再升維,主要出於下降計算複雜度的現實考慮,稱之爲「bottleneck block」,另外一種沒有bottleneck結構,以下圖左所示,稱之爲「basic block」。basic block由2個\(3\times 3\)卷積層構成,bottleneck block由\(1\times 1\)
shortcut路徑大體也能夠分紅2種,取決於殘差路徑是否改變了feature map數量和尺寸,一種是將輸入\(x\)原封不動地輸出,另外一種則須要通過\(1\times 1\)卷積來升維 or/and 降採樣,主要做用是將輸出與\(F(x)\)路徑的輸出保持shape一致,對網絡性能的提高並不明顯,兩種結構以下圖所示,
至於Residual Block之間的銜接,在原論文中,\(F(x)+x\)通過\(ReLU\)後直接做爲下一個block的輸入\(x\)。
對於\(F(x)\)路徑、shortcut路徑以及block之間的銜接,在論文Identity Mappings in Deep Residual Networks中有更進一步的研究,具體在文章後面討論。
ResNet爲多個Residual Block的串聯,下面直觀看一下ResNet-34與34-layer plain net和VGG的對比,以及堆疊不一樣數量Residual Block獲得的不一樣ResNet。
ResNet的設計有以下特色:
ResNet結構很是容易修改和擴展,經過調整block內的channel數量以及堆疊的block數量,就能夠很容易地調整網絡的寬度和深度,來獲得不一樣表達能力的網絡,而不用過多地擔憂網絡的「退化」問題,只要訓練數據足夠,逐步加深網絡,就能夠得到更好的性能表現。
下面爲網絡的性能對比,
上面的實驗說明,不斷地增長ResNet的深度,甚至增長到1000層以上,也沒有發生「退化」,可見Residual Block的有效性。ResNet的動機在於認爲擬合殘差比直接擬合潛在映射更容易優化,下面經過繪製error surface直觀感覺一下shortcut路徑的做用,圖片截自Loss Visualization。
能夠發現:
論文Identity Mappings in Deep Residual Networks進一步研究ResNet,經過ResNet反向傳播的理論分析以及調整Residual Block的結構,獲得了新的結構,以下
注意,這裏的視角與以前不一樣,這裏將shortcut路徑視爲主幹路徑,將殘差路徑視爲旁路。
新提出的Residual Block結構,具備更強的泛化能力,能更好地避免「退化」,堆疊大於1000層後,性能仍在變好。具體的變化在於
下面具體解釋一下。
令\(h(x_l)\)爲shortcut路徑上的變換,\(f\)爲addition以後的變換,原Residual Block中\(f=ReLU\),當\(h\)和\(f\)均爲恆等映射時,能夠獲得任意兩層\(x_L\)和\(x_l\)之間的關係,此時信息能夠在\(x_l\)和\(x_L\)間無損直達,以下前向傳播中的\(x_l\)以及反向傳播中的\(1\)。
\[ \begin{aligned}\mathbf{y}_{l}&= h\left(\mathbf{x}_{l}\right)+\mathcal{F}\left(\mathbf{x}_{l}, \mathcal{W}_{l}\right) \\ \mathbf{x}_{l+1}&=f\left(\mathbf{y}_{l}\right) \\\mathbf{x}_{l+1}&=\mathbf{x}_{l}+\mathcal{F}\left(\mathbf{x}_{l}, \mathcal{W}_{l}\right) \\\mathbf{x}_{L}&=\mathbf{x}_{l}+\sum_{i=l}^{L-1} \mathcal{F}\left(\mathbf{x}_{i}, \mathcal{W}_{i}\right) \\\frac{\partial \mathcal{E}}{\partial \mathbf{x}_{l}}=\frac{\partial \mathcal{E}}{\partial \mathbf{x}_{L}} \frac{\partial \mathbf{x}_{L}}{\partial \mathbf{x}_{l}}&=\frac{\partial \mathcal{E}}{\partial \mathbf{x}_{L}}\left(1+\frac{\partial}{\partial \mathbf{x}_{l}} \sum_{i=l}^{L-1} \mathcal{F}\left(\mathbf{x}_{i}, \mathcal{W}_{i}\right)\right)\end{aligned} \]
反向傳播中的這個\(1\)具備一個很好的性質,任意兩層間的反向傳播,這一項都是\(1\),能夠有效地避免梯度消失和梯度爆炸。若是\(h\)和\(f\)不是恆等映射,就會讓這一項變得複雜,如果令其爲一個大於或小於1的scale因子,反向傳播連乘後就可能致使梯度爆炸或消失,層數越多越明顯,這也是ResNet比highway network性能好的緣由。須要注意的是,BN層解決了plain net的梯度消失和爆炸,這裏的1能夠避免short cut 路徑上的梯度消失和爆炸。
shortcut路徑將反向傳播由連乘形式變爲加法形式,讓網絡最終的損失在反向傳播時能夠無損直達每個block,也意味着每一個block的權重更新都部分地直接做用在最終的損失上。看上面前向傳播的公式,能夠看到某種ensemble形式,信息雖然能夠在任意兩層之間直達,但這種直達實際上是隱含的,對某個block而言,它只能看到加法的結果,而不知道加法中每一個加數是多數,從信息通路上講尚不完全——由此也誕生了DenseNet。
對於殘差路徑的改進,做者進行了不一樣的對比實驗,最終獲得了將BN和ReLU統一放在weight前的full pre-activation結構。
ResNet的動機在於解決「退化」問題,殘差塊的設計讓學習恆等映射變得容易,即便堆疊了過量的block,ResNet可讓冗餘的block學習成恆等映射,性能也不會降低。因此,網絡的「實際深度」是在訓練過程當中決定的,即ResNet具備某種深度自適應的能力。
深度自適應能解釋不會「退化」,但爲何能夠更好?
經過可視化error surface,咱們看到了shortcut的平滑做用,但這只是結果,背後的根由是什麼?
也許完全搞懂ResNet還須要進一步地研究,但已有不少不一樣的理解角度,
經過不一樣側面嘗試解釋,能得到對ResNet更深入更全面的認識,限於篇幅,本文再也不展開。以上。
PS:實際是筆者還沒整理出清晰完整的思路(逃