殘差神經網絡

殘差神經網絡（Residual Neural Network，簡稱ResNet）屬於深度學習模型的一種，其核心在於讓網路的每一層不直接學習預期輸出，而是學習與輸入之間的殘差關係。這種網路通過添加「跳躍連接」，即跳過某些網路層的連接來實現恆等映射，再與網路層的輸出相加合併。其運作機制與高速神經網路類似，通過極大的正偏置權重來打開「門控」。這一設計使得擁有幾十上百層的深度學習模型可以更易於訓練，增加模型深度時還能保持甚至提高準確度。所謂的「殘差連接」即「直連跳過」，這一概念也被應用於1997年的長短期記憶模型LSTM、 Transformer模型（比如BERT和GPT系列，ChatGPT等）、AlphaGo Zero、AlphaStar以及AlphaFold等。

殘差神經網絡由何愷明、張祥雨、任少卿和孫劍開發，這一成果在2015年的ImageNet大規模視覺識別挑戰賽中奪冠。

## 基本原理

### 背景介紹

2012年，針對ImageNet競賽開發的AlexNet模型是一個包含8層的卷積神經網絡。到了2014年，牛津大學的視覺幾何組（VGG）通過疊加3x3卷積層將網路深度增加到了19層。

但是，層級的增加卻導致訓練精度的迅速下降，這種現象被稱為「性能退化」問題。

理論上，如果一個更深的網路僅僅是通過在一個較淺網路的基礎上增加額外層來構建的，那麼這個更深的網路不應該比其較淺的網路有更高的訓練損失。如果這些額外層具有恆等映射的能力，那麼更深的網路應該能夠實現與其較淺網路相同的功能。但這裡存在一個假設，即優化器不能有效地將這些參數化的網路層調整為恆等映射。

### 殘差學習

在多層神經網路模型里，設想一個包含若干層的子網絡。這個子網絡的函數用$H(x)$來表示，其中$x$是子網絡的輸入。殘差學習是通過重新設定這個子網絡的參數，讓參數層表達一個殘差函數$F(x):=H(x)-x$。因此，這個子網絡的輸出$y$可以表示為：

$$\begin{align} y & = F(x) + x \end{align}$$

這一原理同樣適用於1997年提出的長短期記憶LSTM單元，在隨時間反向傳播里計算$y_{t+1} = F(x_{t}) + x_t$，簡化為$y = F(x) + x$。

函數$F(x)$常通過矩陣乘法實現，並結合激活函數以及規範化操作（如批量規範化或層規範化）。

這類子網絡被稱作「殘差塊」。通過疊加這樣的殘差塊，形成深度殘差網路。

在"$y = F(x) + x$"公式中的"$+\ x$"操作是通過一個相當於恆等映射的跳躍連接來完成，它將殘差塊的輸入直接與輸出連接。在隨後的研究中，這種連接常被稱作「殘差連接」。

### 信號傳遞

恆等映射的引入有利於信號在前向傳播路徑和反向傳播路徑中的傳遞。

#### 向前傳播

如果第$\ell$個殘差塊的輸出是第$(\ell+1)$個殘差塊的輸入（這裡假設塊與塊之間沒有激活函數），可以得到：

$$\begin{align} x_{\ell+1} & = F(x_{\ell}) + x_{\ell} \end{align}$$

若遞歸應用此公式，例如，$\begin{align} x_{\ell+2} = F(x_{\ell+1}) + x_{\ell+1} = F(x_{\ell+1}) + F(x_{\ell}) + x_{\ell} \end{align}$，可以推導出：

$$\begin{align} x_{L} & = x_{\ell} + \sum_{i=l}^{L-1} F(x_{i}) \\ \end{align}$$

這裡$L$表示任意後續殘差塊的索引（比如處於最末尾的塊），$\ell$代表任意靠前的塊對應的索引。該公式說明了總有一個信號能夠直接從淺層塊$\ell$傳遞到深層塊$L$。

#### 反向傳播

殘差學習的公式還在一定程度上緩解了梯度消失問題。然而，梯度消失並不是導致性能退化問題的根源，因為通過引入規範化層（如批量規範化）可在一定程度上解決此問題。根據上面的前向傳播過程，對$x_{\ell}$進行求導，可以得到：

$$\begin{align} \frac{\partial \mathcal{E} }{\partial x_{\ell} } & = \frac{\partial \mathcal{E} }{\partial x_{L} }\frac{\partial x_{L} }{\partial x_{\ell} } \\ & = \frac{\partial \mathcal{E} }{\partial x_{L} } \left( 1 + \frac{\partial }{\partial x_{\ell} } \sum_{i=l}^{L-1} F(x_{i}) \right) \\ & = \frac{\partial \mathcal{E} }{\partial x_{L} } + \frac{\partial \mathcal{E} }{\partial x_{L} } \frac{\partial }{\partial x_{\ell} } \sum_{i=l}^{L-1} F(x_{i}) \\ \end{align}$$

這裡$\mathcal{E}$ 是最小化損失函數。以上表明，淺層的梯度計算$\frac{\partial \mathcal{E} }{\partial x_{\ell} }$總會直接加上一個項$\frac{\partial \mathcal{E} }{\partial x_{L} }$。因此，由於額外項$\frac{\partial \mathcal{E} }{\partial x_{L} }$的存在，即使$F(x_{i})$的梯度很小，總梯度$\frac{\partial \mathcal{E} }{\partial x_{\ell} }$也不會消失。

## 殘差塊

### 基本殘差塊

基本殘差塊是原始ResNet研究中最簡單的部分。它包括兩個串行的3x3卷積層以及一個殘差連接。這兩層的輸入輸出尺寸保持一致。

### 瓶頸殘差塊

瓶頸殘差塊包含三個串聯的卷積層和一個殘差連接。該塊的第一層是1x1卷積，用於降維，比如降至輸入維度的1/4；第二層是3x3卷積；最後一層是另一個1x1卷積，用於恢復維度。ResNet-50、ResNet-101和ResNet-152模型都基於瓶頸塊構建。

### 預激活殘差塊

預激活殘差塊在應用殘差函數$F$之前，先使用激活函數，如非線性和規範化的處理。預激活殘差塊的計算可以表述為：

$$\begin{align} x_{\ell+1} & = F(\phi(x_{\ell})) + x_{\ell} \end{align}$$

這裡的$\phi$可以是如線性整流函數等任意非線性激活或歸一化操作。這種設計減少了殘差塊間非恆等映射的數量，被用於訓練200層到1000多層的模型。

從GPT-2開始，Transformer塊常被用於預激活塊，這在Transformer模型的相關文獻中被稱為「預規範化」。

### Transformer塊

Transformer塊是由兩個殘差塊組成，每個殘差塊都設有一個殘差連接。

第一個殘差塊為多頭注意力塊，使用了自注意力運算，隨後連接一個線性映射層。第二個殘差塊是一個前饋式的多層感知器（MLP）塊，這個塊在某種程度上像是一個「反向」的瓶頸塊，它通過一個線性映射層（在卷積神經網絡中相當於1x1的卷積）來擴大維度，然後通過另一個線性映射層來減少維度。

一個Transformer塊包含了四層線性映射。GPT-3模型擁有96個這樣的Transformer塊（在Transformer領域的文獻中，通常將一個Transformer塊稱作一個「Transformer層」）。因此，該模型包含了大約400層的映射層，包括Transformer塊內的96x4層，以及一些額外的層用於輸入嵌入和輸出預測。

若沒有殘差連接，訓練網路深度極高的Transformer模型將無法取得成功。

## 相關研究

1961年，在弗蘭克·羅森布拉特出版的書籍中介紹了一個含有跳躍連接的三層多層感知器（MLP）模型（詳見第15章，第313頁）。這種模型被稱作「交叉耦合系統」，其跳躍連接實際上是交叉耦合連接的一種形式。

在1994年和1996年出版的書籍中提出了在前饋MLP模型中使用的「跳層」連接：「MLP一般允許存在多個隱藏層，並且支持從輸入直接到輸出的『跳層』連接」（詳見第261頁，第144頁），「...這使得非線性單元能夠調整線性函數形式」（詳見第262頁）。這種說法其實已經暗示了非線性MLP的表現就像是在一個線性函數上加上了一個殘差函數。

塞普·霍赫賴特在1991年分析了梯度消失問題，並認為這是深度學習效果不佳的原因。為解決這一問題，長短期記憶（LSTM）網路在每個LSTM單元中引入了權重為1.0的跳躍或殘差連接，計算公式為$y_{t+1} = F(x_{t}) + x_t$。在隨時間反向傳播中，這個公式轉化為前饋神經網絡中的殘差公式$y = F(x) + x$，從而實現了深層循環神經網絡的有效訓練。2000年發布的一種LSTM版本通過「遺忘門」來調節連接，這些門的權重不再固定為1.0，而是可以學習的。在實際實驗中，遺忘門通過正偏置權重進行初始化，從而解決梯度消失問題。

2015年，高速神經網路將上述原理應用於前饋神經網絡，被媒體報導稱為「首個具有數百層深度的前饋神經網絡」。原有的高速神經網路論文不僅提出了非常深的前饋網路的基本架構，還展示了20層、50層和100層網路的實驗結果，並提及正在進行的深達900層的實驗。50層或100層的網路相較於它們常用的神經網路有更低的訓練誤差，但與20層的訓練結果相比，誤差並無降低（詳見MNIST數據集中的圖1）。在超過19層的網路上，並未有訓練精度的提高。然而，ResNet的研究證明了多於20層以上的訓練結果同樣有效。它指出跳躍連接中的調節可能導致前向和反向傳播中信號的消失（詳見第3節）。這也解釋了為什麼2000年的LSTM的遺忘門要通過正偏置權重初始化為開啟狀態：只要門處於開啟狀態，它就如同1997年的LSTM。同樣，高速神經網路如果通過強正偏置權重保持門的開啟狀態，就表現得如同ResNet一樣。現在的神經網路（如Transformer）中使用的跳躍連接主要就是恆等映射。

2016年出現的DenseNets被設計為一種深層的神經網路，旨在將每一層與其他所有層連接。DenseNets通過使用恆等映射作為跳躍連接來實現這一目標。與ResNet不同，DenseNets通過拼接而非加法將層輸出與跳躍連接合併。

利用殘差網路架構，實現了具有隨機深度的神經網路。通過隨機丟棄一部分網路層，讓信號通過跳躍連接進行傳播。這種做法也被稱為「路徑丟棄」。這是訓練大型深層模型，如視覺Transformer（ViT）的一種十分有效的正則化方法。

## 與生物學的聯繫

雖然最初的殘差網路研究並未受生物學啟發，但後來的研究卻發現殘差網路與生物學有關。

2023年《科學》雜誌上發表的一項研究展示了果蠅幼蟲大腦的完整神經連接組。這項研究發現了類似於人工神經網絡中如ResNet一樣的跳躍連接。