轉自:https://zhuanlan.zhihu.com/p/72679537
殘差網絡在設計之初,主要是服務於卷積神經網絡(CNN),在計算機視覺領域應用較多,但是隨着CNN結構的發展,在很多文本處理,文本分類里面(n-gram),也同樣展現出來很好的效果。
首先先明確一下幾個深度學習方面的問題?
網絡的深度為什么重要?
我們知道,在CNN網絡中,我們輸入的是圖片的矩陣,也是最基本的特征,整個CNN網絡就是一個信息提取的過程,從底層的特征逐漸抽取到高度抽象的特征,網絡的層數越多也就意味這能夠提取到的不同級別的抽象特征更加豐富,並且越深的網絡提取的特征越抽象,就越具有語義信息。
為什么不能簡單的增加網絡層數?
對於傳統的CNN網絡,簡單的增加網絡的深度,容易導致梯度消失和爆炸。針對梯度消失和爆炸的解決方法一般是正則初始化(normalized initialization)和中間的正則化層(intermediate normalization layers),但是這會導致另一個問題,退化問題,隨着網絡層數的增加,在訓練集上的准確率卻飽和甚至下降了。這個和過擬合不一樣,因為過擬合在訓練集上的表現會更加出色。
在我參考的博客中,作者針對“退化問題”做了實驗並得出如下結論:
按照常理更深層的網絡結構的解空間是包括淺層的網絡結構的解空間的,也就是說深層的網絡結構能夠得到更優的解,性能會比淺層網絡更佳。但是實際上並非如此,深層網絡無論從訓練誤差或是測試誤差來看,都有可能比淺層誤差更差,這也證明了並非是由於過擬合的原因。導致這個原因可能是因為隨機梯度下降的策略,往往解到的並不是全局最優解,而是局部最優解,由於深層網絡的結構更加復雜,所以梯度下降算法得到局部最優解的可能性就會更大。
如何解決退化問題
這里提供了一種想法:既然深層網絡相比於淺層網絡具有退化問題,那么是否可以保留深層網絡的深度,又可以有淺層網絡的優勢去避免退化問題呢?如果將深層網絡的后面若干層學習成恆等映射 ,那么模型就退化成淺層網絡。但是直接去學習這個恆等映射是很困難的,那么就換一種方式,把網絡設計成:
只要 就構成了一個恆等映射
,這里
為殘差。

Resnet提供了兩種方式來解決退化問題:identity mapping以及residual mapping。identity mapping指的是圖中“彎線”部分,residual mapping指的是非“彎線”的剩余部分。 是求和前網絡映射,
是輸入到求和后的網絡映射。
博客中作者舉了這樣一個例子:假設有個網絡參數映射: 和
,這里想把5映射成5.1,那么
,引入殘差的映射
。引入殘差的映射對輸出的變化更加敏感,比如從輸出的5.1再變化到5.2時,映射
的輸出增加了1/51=2%。而殘差結構輸出的話,映射
從0.1到0.2,增加了100%。明顯后者的輸出變化對權重的調整作用更大,所以效果更好。
這種殘差學習結構通過前向神經網絡+shortcut鏈接實現,其中shortcut連接相當於簡單執行了同等映射,不會產生額外的參數,也不會增加計算復雜度。整個網絡依舊可以通過端到端的反向傳播訓練。
公式推導
殘差結構的公式表達:
通過遞歸,可以得到任意深層單元L特征的表達:
對於任意深的單元L的特征 可以表達為淺層單元l的特征
加上一個形如
的殘差函數,表明了任何單元L和l之間都具有殘差特性。
同樣的,對於任意深的單元L,它的特征 ,即為之前所有殘差函數輸出的總和再加上
。
對於反向傳播,假設損失函數為E,根據反向傳播的鏈式法則可以得到:
式子被分為兩個部分:
- 不通過權重層的傳遞
- 通過權重層的傳遞:
前者保證了信號能夠直接傳回到任意的淺層 ,同時這個公式也保證了不會出現梯度消失的現象,因為
不可能為-1。
ResNet結構
連接方式:"shortcut connection"

- shortcut同等維度映射,
與
相加就是逐元素相加
- 如果兩者維度不同,需要給
執行一個線性映射來匹配維度:
卷積層進行殘差學習:以上公式都是基於全連接層的,實際上可以使用卷積層,加法隨之變為對應channel間的兩個feature map逐元素相加。
- 對於輸出feature map大小相同的層,有相同數量的filters,即channel數相同。
- 當feature map大小減半時(池化),filters數量翻倍。對於殘差網絡,維度匹配的shortcut連接為實線,反之為虛線。維度不匹配時,同等映射有兩種可選方案:
- 直接通過zero padding來增加維度(channel)。
- 乘以W矩陣投影到新的空間。實現是用1x1卷積實現的,直接改變1x1卷積的filters數目,這種會增加參數。
博客作者針對兩種方法做了實驗比較:發現投影法會比zero padding表現稍微好一些,因為zero padding的部分沒有參與殘差學習。實驗證明,將維度匹配或不匹配的同等映射全用投影法會取得更好的結果,但是考慮到不增加復雜度和參數的前提下,這種方式則不適用。
關於網絡結構的一些細節問題
(1)如果F(x)和x的channel個數不同,如何進行F(x)和x的維度相加?

?

實線的connection部分,即第1個和第3個矩陣之間都是執行3x3x64的卷積,channel個數一致,計算方式:
虛線的connection部分,第3個矩陣和第5個矩陣分別是3x3x64和3x3x128的卷積操作,他們的channel個數不同(64和128),采用計算方式:
其中W是卷積操作(用128個(3x3x64)的filter),用來調整x的channel維度。
計算細節

這里引入一個兩層神經網絡,
為激活函數,例如relu。

在殘差網絡中,將 直接加到
之后,下一次激活函數
之前,那么
,加上了的這個產生了殘差塊。
網絡以及1x1的卷積
1x1卷積核的作用請參考我的另一篇文章《深度學習——卷積神經網絡》。
ResNet50和ResNet101
這兩個網絡結構是目前比較流行的,給出它們具體的結構:

上面是5種深度的ResNet,分別是18,34,50,101和152,拿ResNet50來看:第一層為7x7x64的卷積,然后是3+4+6+3=16個building block,每個block為3層,所以有16x3=48層。最后有個fc層,所以總共為1+1+48=50層。
普通的平原網絡與深度殘差網絡的最大區別在於,深度殘差網絡有很多旁路的支線將輸入直接連到后面的層,使得后面的層可以直接學習殘差,這些支路就叫做shortcut。傳統的卷積層或全連接層在信息傳遞時,或多或少會存在信息丟失、損耗等問題。ResNet 在某種程度上解決了這個問題,通過直接將輸入信息繞道傳到輸出,保護信息的完整性,整個網絡則只需要學習輸入、輸出差別的那一部分,簡化學習目標和難度。