一文讀懂殘差網絡ResNet

2021-02-12 機器學習算法與自然語言處理

作者:苘鬱蓁

連結: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詳解

相關焦點

  • 「模型解讀」resnet中的殘差連接,你確定真的看懂了?
    它解決了深層網絡的訓練問題,作者的原論文中達到了上千層。殘差連接是何的首創嗎?當然不是,傳統的神經網絡中早就有這個概念,文【2】中則明確提出了殘差的結構,這是來自於LSTM的控制門的思想。首先大家已經形成了一個通識,在一定程度上,網絡越深表達能力越強,性能越好。不過,好是好了,隨著網絡深度的增加,帶來了許多問題,梯度消散,梯度爆炸;在resnet出來之前大家沒想辦法去解決嗎?當然不是。更好的優化方法,更好的初始化策略,BN層,Relu等各種激活函數,都被用過了,但是仍然不夠,改善問題的能力有限,直到殘差連接被廣泛使用。
  • Google最新開源Inception-ResNet-v2,藉助殘差網絡進一步提升圖像...
    為了進一步推進這個領域的進步,今天Google團隊宣布發布Inception-ResNet-v2(一種卷積神經網絡——CNN),它在ILSVRC圖像分類基準測試中實現了當下最好的成績。Inception-ResNet-v2是早期Inception V3模型變化而來,從微軟的殘差網絡(ResNet)論文中得到了一些靈感。
  • 科普丨一文了解殘差網絡
    這一結論導致的結果是,通過引入真正的深度學習模型(層數>50),可以解決複雜的問題。人們開始嘗試深度學習模型,深度達到100層,以在訓練數據上獲得更高的準確度分數。然而,這一關於深度重要性的結論引發了一個有趣的問題:學習更好的網絡是否像堆疊更多層一樣容易?理論上,隨著普通神經網絡中層數的增加,它在識別複雜函數和特徵方面的能力將逐步提高,從而提高準確性和學習能力。
  • 深度學習第19講:CNN經典論文研讀之殘差網絡ResNet及其keras實現
    >深度學習筆記12:卷積神經網絡的Tensorflow實現深度學習筆記13:Tensorflow實戰之手寫mnist手寫數字識別深度學習筆記14:CNN經典論文研讀之Le-Net5及其Tensorflow實現深度學習筆記15:ubuntu16.04 下深度學習開發環境搭建與配置深度學習筆記16:CNN經典論文研讀之AlexNet
  • ResNet——CNN經典網絡模型詳解(pytorch實現)
    2、ResNet詳解在ResNet網絡中有如下幾個亮點:提出residual結構(殘差結構),並搭建超深的網絡結構(突破1000層)使用Batch Normalization加速訓練(丟棄dropout)在ResNet網絡提出之前,傳統的卷積神經網絡都是通過將一系列卷積層與下採樣層進行堆疊得到的。但是當堆疊到一定網絡深度時,就會出現兩個問題。
  • ResNet:用於圖像識別的深度殘差網絡
    摘要一般來說,更深的神經網絡更難訓練。因此本文提出了一種殘差學習框架,以簡化對更深網絡的訓練。該方法顯式地將層重新配置為參考輸入層的學習殘差函數,而不是學習非參考函數。本文提供了充分的經驗證據,這些證據表明,殘差網絡易於深度驗證,並且從大大增加的深度中可以獲得準確性。在ImageNet數據集上,評估深度最大為152層的殘差網絡-比VGG網絡[41]深8倍,但仍具有較低的複雜度。
  • 十分鐘一起學會ResNet殘差網絡
    圖一圖二ResNet簡介ResNet是在2015年有何凱明,張翔宇,任少卿,孫劍共同提出的,ResNet使用了一個新的思想,ResNet的思想是假設我們涉及一個網絡層,存在最優化的網絡層次,那麼往往我們設計的深層次網絡是有很多網絡層為冗餘層的。
  • 快速訓練殘差網絡 ResNet-101,完成圖像分類與預測,精度高達 98%|...
    即在預訓練模型的基礎上,採用101層的深度殘差網絡ResNet-101,對如下圖所示的花數據集進行訓練,快速實現了對原始圖像的分類和預測,最終預測精確度達到了驚人的98%。遷移學習(1) 遷移學習簡介什麼是遷移學習呢?
  • 深度學習入門講解:什麼是殘差網絡Resnet(上)
    微信公眾號:follow_bobo更多精彩內容,在知乎:蔣竺波加公眾號,回復『』殘差網絡『』,可以得得到視頻所有高清
  • 譯文 | Inception-v4,Inception-ResNet 和殘差連接對學習的影響(多圖)
    原文:https://arxiv.org/pdf/1602.07261.pdf——前言:作者認為殘差連接在訓練深度卷積模型是很有必要的。至少在圖像識別上,我們的研究似乎並不支持這一觀點。摘要:    近年來,深度卷積神經網絡對圖像識別性能的巨大提升發揮著關鍵作用。以Inception網絡為例,其以相對較低的計算代價取得出色的表現。
  • 理解並實現 ResNet(Keras)
    -446d7ff84d33ResNet 是殘差網絡(Residual Network)的縮寫,是一種作為許多計算機視覺任務主幹的經典神經網絡。深度革命但是,提升網絡的深度並不是簡單的將網絡層堆疊起來。深層網絡很難訓練的原因,是因為非常煩人的梯度消失問題——隨著梯度反向傳播回前面的網絡層,重複的乘積操作會使得梯度變得非常小。結果呢,隨著網絡越來越深,它的性能就變得飽和了,並開始迅速下降。
  • 重讀經典:完全解析特徵學習大殺器ResNet
    比如如果現在恆等映射(identity mapping)是最優的,那麼似乎通過堆疊一些非線性層的網絡將殘差映射為0,從而擬合這個恆等映射,最種做法是更容易的。回到上面的討論,如果被增加層能夠被構建成identity mapping,那麼深層網絡的性能至少不應該比其對應的淺層版本要差。這個表明:網絡是在使用多層非線性網絡趨近identity mapping做優化這裡出了問題。殘差學習的這種方式,使得「如果identity mapping是最優的,網絡的優化器直接將殘差學習為0」就可以了,這樣做是比較簡單的。
  • DL經典論文系列(二) AlexNet、VGG、GoogLeNet/Inception、ResNet
    論文提出的殘差連接幾乎可以在每一個CNN中看到身影。網絡的深度是提高網絡性能的關鍵,但是隨著網絡深度的加深,梯度消失問題逐漸明顯,甚至出現退化現象。所謂退化就是深層網絡的性能竟然趕不上較淺的網絡。本文提出殘差結構,當輸入為x時其學習到的特徵記為H(x),現在希望可以學習到殘差F(x)= H(x) - x,因為殘差學習相比原始特徵直接學習更容易。
  • 基礎入門,怎樣用PaddlePaddle優雅地寫VGG與ResNet
    針對隨著網絡訓練加深導致準確度下降的問題,ResNet提出了殘差學習方法來減輕訓練深層網絡的困難。在已有設計思路(BN, 小卷積核,全卷積網絡)的基礎上,引入了殘差模塊。每個殘差模塊包含兩條路徑,其中一條路徑是輸入特徵的直連通路,另一條路徑對該特徵做兩到三次卷積操作得到該特徵的殘差,最後再將兩條路徑上的特徵相加。
  • 經典CNN網絡(Lenet、Alexnet、GooleNet、VGG、ResNet、DenseNet)
    卷積部分都是畫成上下兩塊,意思是說把這一層計算出來的feature map分開,但是前一層用到的數據要看連接的虛線。然後各個group卷積完成後將輸出疊在一起(concatenate),作為這一層的輸出channel。局部響應歸一化LRN:利用前後幾層(對應位置的點)對中間這一層做一下平滑約束,增加泛化能力,公式為:
  • 你必須要知道CNN模型:ResNet
    ResNet網絡是參考了VGG19網絡,在其基礎上進行了修改,並通過短路機制加入了殘差單元,如圖5所示。變化主要體現在ResNet直接使用stride=2的卷積做下採樣,並且用global average pool層替換了全連接層。ResNet的一個重要設計原則是:當feature map大小降低一半時,featuremap的數量增加一倍,這保持了網絡層的複雜度。
  • 殘差網絡解決了什麼,為什麼有效?
    除此之外,去除個別神經網絡層,殘差網絡的表現不會受到顯著影響[2],這與傳統的前饋神經網絡大相逕庭。殘差網絡解決了什麼,為什麼有效?殘差網絡在圖像領域已然成為了一種主流模型,雖然這種網絡範式的提出是為了解決網絡退化問題,但是關於其作用的機制,還是多有爭議。
  • 一文帶你讀懂計算機視覺
    使用許多卷積層的神經網絡就是其中之一。一個卷積層利用圖像的2D結構在神經網絡的下一層中生成有用信息。然後採用現有的計算機視覺架構,例如inception(或resnet),再用計算臉部的嵌入層替換目標識別神經網絡的最後一層。對於數據集中的每個人,(使用啟發式方法)選擇三張臉(負樣本,正樣本,第二正樣本)並將其饋送到神經網絡。這產生了3個嵌入embeddings。
  • 深度 | 從AlexNet到殘差網絡,理解卷積神經網絡的不同架構
    該網絡的寬度開始的值很小,只有 64,每經過一次子採樣/池化層就增加 1 倍。VGG 在 ImageNet 上達到了 92.3 % 的 top-5 準確率。但增加深度的問題在於,在網絡末端通過預測值和真值比較得到的權重修改信號,到了之前的層會變得很微弱。這基本上意味著網絡之前的層幾乎沒有進行學習。這被稱為梯度消失現象。而另一個問題在於,需要在巨大的參數空間中執行優化,隨意增加層數會導致更大的訓練誤差。殘差網絡通過使用殘差模型模塊構建網絡,從而訓練此類深層網絡(如下圖所示)。這稱為退化(degradation)問題。
  • 一文簡述ResNet及其多種變體
    按照這種思路,[2] 的作者改進了殘差塊,並提出了一種殘差塊的預激活變體 [7],梯度可以在該模型中暢通無阻地通過快速連接到達之前的任意一層。事實上,使用 [2] 中的原始殘差塊訓練一個 1202 層的 ResNet,其性能比 110 層的模型要差。