作者:苘鬱蓁
連結:https://zhuanlan.zhihu.com/p/91385516
專欄:鬱蓁的機器學習筆記
本文的內容包括殘差網絡的基礎知識以及相關輔助理解的知識點,希望有一定深
度學習基礎的同學能夠平滑上手理解ResNet。
本文包括什麼:
殘差網絡的由來,為什麼需要殘差網絡?
殘差網絡是什麼,怎麼定義?
殘差網絡為什麼好用?優越性在哪裡?
有沒有一個簡單的例子來直觀看懂什麼是殘差網絡?
殘差網絡的由來殘差操作這一思想起源於論文《Deep Residual Learning for Image Recognition》,目前的引用量已達3萬多。這篇文章發現,如果存在某個層的網絡是當前最優的網絡,那麼可以構造一個更深的網絡,其最後幾層僅是該網絡第層輸出的恆等映射(Identity Mapping),就可以取得與一致的結果;也許還不是所謂「最佳層數」,那麼更深的網絡就可以取得更好的結果。總而言之,與淺層網絡相比,更深的網絡的表現不應該更差。但是如下圖所示,56層的神經網絡表現明顯要比20層的差。證明更深的網絡在訓練過程中的難度更大,因此作者提出了殘差網絡的思想。
網絡層數加深導致的訓練問題殘差網絡的定義殘差網絡依舊讓非線形層滿足 ,然後從輸入直接引入一個短連接到非線形層的輸出上,使得整個映射變為
這就是殘差網路的核心公式,換句話說,殘差是網絡搭建的一種操作,任何使用了這種操作的網絡都可以稱之為殘差網絡。
一個具體的殘差模塊的定義如下圖:
殘差模塊(由於先敲公式後引得圖,容易混淆,圖中的F(x)就是上文所說的H(x,w),下面也一樣替換)殘差網絡的優勢殘差模塊為什麼有效,有很多的解釋,這裡提供兩個方面的理解,一方面是殘差網絡更好的擬合分類函數以獲得更高的分類精度,另一方面是殘差網絡如何解決網絡在層數加深時優化訓練上的難題。
1.殘差網絡擬合函數的優越性
首先從萬能近似定理(Universal Approximation Theorem)入手。這個定理表明,一個前饋神經網絡(feedforward neural network)如果具有線性輸出層,同時至少存在一層具有任何一種「擠壓」性質的激活函數(例如logistic sigmoid激活函數)的隱藏層,那麼只要給予這個網絡足夠數量的隱藏單元,它就可以以任意的精度來近似任何從一個有限維空間到另一個有限維空間的波萊爾可測函數(Borel Measurable Function)。
萬能近似定理意味著我們在構建網絡來學習什麼函數的時候,我們知道一定存在一個多層感知機(Multilayer Perceptron Model,MLP)能夠表示這個函數。然而,我們不能保證訓練算法能夠學得這個函數。因為即使多層感知機能夠表示該函數,學習也可能會失敗,可能的原因有兩種。
(1)用於訓練的優化算法可能找不到用於期望函數的參數值。
(2)訓練算法可能由於過擬合而選擇了錯誤的函數。
第二種過擬合情況不在我們的討論範圍之內,因此我們聚焦在前一種情況,為何殘差網絡相比簡單的多層網絡能更好的擬合分類函數,即找到期望函數的參數值。
對於普通的不帶短連接的神經網絡來說,存在這樣一個命題。
命題1:假設 為普通的帶激活函數的全連接網絡 。 為 的正等值面,假如 的每個層的激活函數都至多只有 個神經元,那麼
為勒貝格測度。換句話說,這樣狹窄的全連接網絡表示的函數要麼沒有邊界約束,要麼恆為0。因此,即使層數無限加深,整個網絡的表現力也受網絡的寬度限制而無法近似一個帶邊界的區域。而對於殘差網絡來講,擬合函數的能力則完全不受網路寬度的影響,上述命題1對於殘差網絡並不適用。
下面從一個簡單的二維例子來說明這一點,這樣可以進行方便的可視化。我們隨機生成一組測試點 ,滿足
我們手動構造一個清晰的分類邊界使得整個任務更容易一點,損失函數採用邏輯回歸損失 ,其中 為網絡對於樣本 的實際輸出。經過訓練後,分析網絡不同深度下得到的訓練邊界,如圖3.5可以發現寬度比輸入維度小的殘差網絡的訓練邊界明顯更加接近真實邊界,也不受命題1的限制。
圖3.5 不同網絡結構擬合函數邊界的結果。左上角為函數的真實邊界。第一行是簡單的全連接網絡,每層的神經元個數為2;第二行為帶短連接的網絡,每層神經元個數為1。從左到右的網絡層數依次遞增,分別為1-5層。事實上對於高維函數,這一特點依然適用。因此,當函數的輸入維度非常高時,這一做法就變的非常有意義。儘管在高維空間這一特點很難被可視化,但是這個理論給了一個很合理的啟發,就是原則上,帶短連接的網絡的擬合高維函數的能力比普通連接的網絡更強。這部分我們討論了殘差網絡有能力擬合更高維的函數,但是在實際的訓練過程中仍然可能存在各種各樣的問題使得學習到最優的參數非常困難,因此下一小節討論殘差在訓練過程中的優越性。
2.殘差網絡訓練過程的優越性
這個部分我們討論為什麼殘差能夠緩解深層網絡的訓練問題,以及探討可能的短連接方式和我們最終選擇的殘差的理由。正如本章第三部分討論的一樣,整個殘差卷積神經網絡是由以上的殘差卷積子模塊堆積而成。如上一小節所定義的,假設第 層的殘差卷積字子模塊的映射為
是第 層的輸入, 是第 層的參數, 是殘差單元層數。
那麼第 層的輸入為
因此得到
循環帶入這個式子 ,我們可以得到
(1)
對於任何深度的L來講,上述式子(1)顯示了一些良好的特性。
(1)第層的特徵可以分為兩個部分,第一部分是淺層的網絡表示加上一個殘差函數映射 ,表明模型在任意單元內都是一個殘差的形式。
(2)對於任意深度 的特徵 來講,它是前面所有殘差模塊的和,這與簡單的不加短連接的網絡完全相反。原因是,不加短連接的網絡在第 層的特徵 是一系列的向量乘的結果,即 (在忽略batch normalization和激活函數的情況下)。
同樣,上述式子顯示有非常好的反向傳播特性,假設損失為 ,根據鏈式求導法則,我們可以得到
(2)
顯示梯度由兩個部分組成,一部分 是不用經過任何權重加權的信息流,另一部分是通過加權層的 ,兩部分連接的線形特性保證了信息可以直接反向傳播到淺層。同時式子還說明對於小的batch而言,梯度 不太可能會消失,因為通常 對於小的batch來講不會總是為1,那麼這表示即使權重非常小,梯度也不會為0,不存在梯度消失的問題。
總之,式子(1)和(2)表明信號無論是在前向傳播還是反向傳播的過程中,都是可以直接通過的。
殘差模塊的實現例子大家可以對照圖看具體的實現:
import torch.nn as nn
import torch
from torch.nn.init import kaiming_normal, constant
class BasicConvResBlock(nn.Module):
def __init__(self, input_dim=128, n_filters=256, kernel_size=3, padding=1, stride=1, shortcut=False, downsample=None):
super(BasicConvResBlock, self).__init__()
self.downsample = downsample
self.shortcut = shortcut
self.conv1 = nn.Conv1d(input_dim, n_filters, kernel_size=kernel_size, padding=padding, stride=stride)
self.bn1 = nn.BatchNorm1d(n_filters)
self.relu = nn.ReLU()
self.conv2 = nn.Conv1d(n_filters, n_filters, kernel_size=kernel_size, padding=padding, stride=stride)
self.bn2 = nn.BatchNorm1d(n_filters)
def forward(self, x):
residual = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
if self.shortcut:
out += residual
out = self.relu(out)
return out
碼字不易,覺得有收穫記得點讚哦~
推薦閱讀:
淺談 Transformer-based 模型中的位置表示
方程組的幾何解釋 [MIT線代第一課pdf下載]
PaddlePaddle實戰NLP經典模型 BiGRU + CRF詳解