残差连接和层归一化是 Transformer 架构中至关重要的两个技术,它们如同模型的“稳定器”和“加速器”,确保了深度神经网络的训练能够顺利进行,并显著提升了性能。这两个技术通常是成对出现的,共同作用于每个子层(如多头自注意力层和前馈网络层)的输出。

残差连接 (Residual Connection)

是什么?

        残差连接,又称跳跃连接 (Skip Connection),它的核心思想是让模型直接学习“残差”,而不是从头学习完整的特征表示。简单来说,它将一个子层的输入直接加到该子层的输出上。

用公式表示就是:

Output=Input+Sublayer(Input)

这里的 Sublayer 可以是自注意力机制或前馈网络。

为什么需要它?

当神经网络的层数非常深时,会面临两个主要问题:

  1. 梯度消失 (Vanishing Gradient):在反向传播时,梯度会逐层相乘,导致梯度值指数级减小,使得深层的网络参数几乎无法更新,模型训练停滞。

  2. 网络退化 (Degradation):即使没有梯度消失,随着网络层数增加,模型的训练误差反而会上升,这表明深层网络更难训练,而不是说它更容易过拟合。这主要是因为深层网络比浅层网络更难优化。

它的作用是什么?

残差连接通过引入一个“恒等映射” (Identity Mapping),巧妙地解决了上述问题:

  • 缓解梯度消失:在反向传播时,梯度不仅通过权重矩阵传递,还可以直接通过残差连接这条“捷径”反向传播。这相当于在每层都加了一条梯度直通车,确保了梯度可以有效地流向网络深处,从而解决了梯度消失问题。

  • 简化学习任务:如果一个子层需要学习一个恒等映射(即输入和输出完全相同),那么残差连接会让这个任务变得非常简单:子层只需要学习将输出设为 0。这大大降低了模型的学习难度,因为它不再需要从头学习复杂的映射关系。

        想象一下,你正在建造一座高楼。残差连接就像在每层都安装了一个外部电梯,无论楼有多高,你都可以直接坐电梯到达顶部,而不需要一步步爬楼梯。

        通过一个简化且具体的例子,结合数学公式和直观的类比,来详细解释残差连接在反向传播中是如何“抄近路”的。

概念回顾:没有残差连接的反向传播

首先,我们考虑一个没有残差连接的简单网络层。

假设有一个网络层f(x), 它的输入是x, 输出是y = f(x)。当进行反向传播时, 我们计算梯度\frac{\partial \mathcal{L}}{\partial x}, 其中\mathcal{L} 是损失函数。根据链式法则, 梯度从上一层传到这一层, 计算公式是:

\frac{\partial \mathcal{L}}{\partial x} = \frac{\partial \mathcal{L}}{\partial y} \cdot \frac{\partial y}{\partial x} = \frac{\partial \mathcal{L}}{\partial y} \cdot \frac{\partial f(x)}{\partial x}

这里的\frac{\partial f(x)}{\partial x} 就是网络层f 的梯度。

现在,想象一个由 N 层堆叠而成的深度网络。要计算最深处(输入层)的梯度,梯度需要逐层相乘:

\frac{\partial \mathcal{L}}{\partial x_0} = \frac{\partial \mathcal{L}}{\partial x_N} \cdot \frac{\partial x_N}{\partial x_{N-1}} \cdot \frac{\partial x_{N-1}}{\partial x_{N-2}} \dots \frac{\partial x_1}{\partial x_0}

问题:如果每一层的梯度\frac{\partial x_{i+1}}{\partial x_i}的值都小于 1(这是非常常见的),那么随着层数 N 增加,所有这些小于 1 的数相乘的结果会指数级地趋近于零。这就是梯度消失。最终,最深处的参数梯度变得非常小,几乎无法更新。

残差连接如何改变反向传播?

现在,我们引入残差连接。一个带有残差连接的网络层可以表示为:

y=x+f(x)

其中x是输入,f(x) 是子层(如自注意力或前馈网络)的输出。

让我们看看在这种情况下, 梯度会如何计算。我们再次使用链式法则计算\frac{\partial \mathcal{L}}{\partial x}:

\frac{\partial \mathcal{L}}{\partial x} = \frac{\partial \mathcal{L}}{\partial y} \cdot \frac{\partial y}{\partial x}

关键来了: 计算\frac{\partial y}{\partial x}的部分。由于y = x + f(x), 我们可以对它进行求导:

\frac{\partial y}{\partial x} = \frac{\partial (x + f(x))}{\partial x} = \frac{\partial x}{\partial x} + \frac{\partial f(x)}{\partial x} = \mathbf{1} + \frac{\partial f(x)}{\partial x}

将这个结果代回到梯度公式中:

  • \frac{\partial \mathcal{L}}{\partial x} = \frac{\partial \mathcal{L}}{\partial y} \cdot \left(\mathbf{1} + \frac{\partial f(x)}{\partial x}\right)

  • \frac{\partial \mathcal{L}}{\partial x} = \frac{\partial \mathcal{L}}{\partial y} \cdot \mathbf{1} + \frac{\partial \mathcal{L}}{\partial y} \cdot \frac{\partial f(x)}{\partial x}

  • \frac{\partial \mathcal{L}}{\partial x} = \frac{\partial \mathcal{L}}{\partial y} + \frac{\partial \mathcal{L}}{\partial y} \cdot \frac{\partial f(x)}{\partial x}

这个公式非常重要,它揭示了残差连接的本质: 反向传播的梯度不再只依赖于子层 f(x) 的梯度,而是分成了两部分:

1. 直接传递的部分:\frac{\partial \mathcal{L}}{\partial y}这部分梯度直接从y传回x, 就像坐了直达电梯, 没有经过任何权重矩阵的相乘

2. 通过子层传递的部分:\frac{\partial \mathcal{L}}{\partial y} \cdot \frac{\partial f(x)}{\partial x}这部分是传统的梯度流, 需要通过子层f(x)

直观类比和总结

想象一下,你有一条消息(梯度),需要从大楼的顶层(输出层)传到地下室(输入层)。

  • 没有残差连接时:你只能通过楼梯(权重矩阵)一层层向下走。如果每层楼梯的台阶都很滑(梯度值小于 1),你每走一层,消息就会丢失一部分,等到底层时,消息已经微弱到无法辨认(梯度消失)。

  • 有了残差连接时:除了楼梯,每层还安装了一个外部电梯。你的消息可以兵分两路:

    • 一路:继续走楼梯(通过子层f(x))。

    • 另一路直接坐电梯(通过 +x 的恒等映射),跳过楼层的内部计算,直达下一层。

正是这条“电梯捷径”确保了即使子层的梯度很小,梯度信号也能完整、有效地传递到网络的深处。它为梯度流提供了一条“绿色通道”,保证了训练的稳定性和效率。

因此,残差连接的真正作用,就是在反向传播时,为梯度提供一条加性的、不受权重矩阵影响的路径,从而从根本上解决了深度网络中的梯度消失问题。

层归一化 (Layer Normalization)

是什么?

层归一化,顾名思义,是对神经网络的每一层进行归一化处理。它将一个训练样本的所有特征(即一个样本的每个 token 的所有维度)进行归一化,使得这些特征的均值为 0,方差为 1。

它与我们更熟悉的 批量归一化 (Batch Normalization) 有所不同:

  • 批量归一化:对一个批次所有样本同一特征维度进行归一化。

  • 层归一化:对一个样本所有特征维度进行归一化。

在自然语言处理中,句子长度是不固定的,批量归一化难以应用,而层归一化则不受批次大小和序列长度的影响,因此更适合 Transformer 这种处理序列数据的模型。

为什么需要它?

在深度神经网络中,每个子层的输出分布都会在训练过程中发生变化,这种现象被称为 “内部协变量偏移” (Internal Covariate Shift)。这导致每一层都需要不断适应前面层的新分布,使得训练变得不稳定且收敛缓慢。

它的作用是什么?

层归一化通过在每个子层之后立即进行归一化,带来了以下核心优势:

  • 稳定训练过程:它将每层的输入分布都稳定在一个相对固定的范围内,减轻了内部协变量偏移,使得模型训练更加稳定和高效。

  • 加速收敛:稳定的分布让模型可以使用更高的学习率进行训练,从而加速了模型的收敛速度。

  • 平滑损失函数:归一化使得损失函数变得更加平滑,这有助于梯度下降算法更快地找到最优解。

层归一化就像一个“标准化检查站”,在每层计算结束后,它都会对结果进行统一处理,确保输入到下一层的数据格式始终保持一致。

总结:两者如何协同工作

在 Transformer 架构中,一个标准的子层(例如自注意力层)的计算流程是:

1. 子层计算:\text{Sublayer}(\text{Input})

2. 残差连接:\text{Output}_{residual} = \text{Input} + \text{Sublayer}(\text{Input})

3. 层归一化:\text{Output}_{normalized} = \text{LayerNorm}(\text{Output}_{residual})

残差连接解决了梯度消失和网络退化问题,使网络能够“深”得起来;层归一化则解决了训练不稳定的问题,使网络能够“快”得起来。

Logo

更多推荐