残差神经网络

<image>

残差神经网络（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} }$也不会消失。

## 残差块

<image>

### 基本残差块

基本残差块是原始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块

<image>

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一样的跳跃连接。