大模型技术深入浅出--残差连接和层归一化
本文探讨了Transformer架构中的两个关键技术——残差连接和层归一化。残差连接通过将输入直接加到子层输出,缓解了深度网络的梯度消失和网络退化问题,为梯度传播提供了"捷径"。层归一化则通过标准化每层特征分布,解决了训练过程中的内部协变量偏移问题,提升训练稳定性。这两种技术协同工作:残差连接确保网络能够有效训练深层架构,而层归一化保证训练过程的快速收敛,共同构成了Transf
残差连接和层归一化是 Transformer 架构中至关重要的两个技术,它们如同模型的“稳定器”和“加速器”,确保了深度神经网络的训练能够顺利进行,并显著提升了性能。这两个技术通常是成对出现的,共同作用于每个子层(如多头自注意力层和前馈网络层)的输出。
残差连接 (Residual Connection)
是什么?
残差连接,又称跳跃连接 (Skip Connection),它的核心思想是让模型直接学习“残差”,而不是从头学习完整的特征表示。简单来说,它将一个子层的输入直接加到该子层的输出上。
用公式表示就是:
这里的 Sublayer
可以是自注意力机制或前馈网络。
为什么需要它?
当神经网络的层数非常深时,会面临两个主要问题:
-
梯度消失 (Vanishing Gradient):在反向传播时,梯度会逐层相乘,导致梯度值指数级减小,使得深层的网络参数几乎无法更新,模型训练停滞。
-
网络退化 (Degradation):即使没有梯度消失,随着网络层数增加,模型的训练误差反而会上升,这表明深层网络更难训练,而不是说它更容易过拟合。这主要是因为深层网络比浅层网络更难优化。
它的作用是什么?
残差连接通过引入一个“恒等映射” (Identity Mapping),巧妙地解决了上述问题:
-
缓解梯度消失:在反向传播时,梯度不仅通过权重矩阵传递,还可以直接通过残差连接这条“捷径”反向传播。这相当于在每层都加了一条梯度直通车,确保了梯度可以有效地流向网络深处,从而解决了梯度消失问题。
-
简化学习任务:如果一个子层需要学习一个恒等映射(即输入和输出完全相同),那么残差连接会让这个任务变得非常简单:子层只需要学习将输出设为 0。这大大降低了模型的学习难度,因为它不再需要从头学习复杂的映射关系。
想象一下,你正在建造一座高楼。残差连接就像在每层都安装了一个外部电梯,无论楼有多高,你都可以直接坐电梯到达顶部,而不需要一步步爬楼梯。
通过一个简化且具体的例子,结合数学公式和直观的类比,来详细解释残差连接在反向传播中是如何“抄近路”的。
概念回顾:没有残差连接的反向传播
首先,我们考虑一个没有残差连接的简单网络层。
假设有一个网络层
, 它的输入是
, 输出是
。当进行反向传播时, 我们计算梯度
, 其中
是损失函数。根据链式法则, 梯度从上一层传到这一层, 计算公式是:
这里的
就是网络层
的梯度。
现在,想象一个由 N 层堆叠而成的深度网络。要计算最深处(输入层)的梯度,梯度需要逐层相乘:
问题:如果每一层的梯度的值都小于 1(这是非常常见的),那么随着层数 N 增加,所有这些小于 1 的数相乘的结果会指数级地趋近于零。这就是梯度消失。最终,最深处的参数梯度变得非常小,几乎无法更新。
残差连接如何改变反向传播?
现在,我们引入残差连接。一个带有残差连接的网络层可以表示为:
其中是输入,
是子层(如自注意力或前馈网络)的输出。
让我们看看在这种情况下, 梯度会如何计算。我们再次使用链式法则计算:
关键来了: 计算的部分。由于
, 我们可以对它进行求导:
将这个结果代回到梯度公式中:
这个公式非常重要,它揭示了残差连接的本质: 反向传播的梯度不再只依赖于子层 f(x) 的梯度,而是分成了两部分:
1. 直接传递的部分:。这部分梯度直接从
传回
, 就像坐了直达电梯, 没有经过任何权重矩阵的相乘。
2. 通过子层传递的部分:。这部分是传统的梯度流, 需要通过子层
。
直观类比和总结
想象一下,你有一条消息(梯度),需要从大楼的顶层(输出层)传到地下室(输入层)。
-
没有残差连接时:你只能通过楼梯(权重矩阵)一层层向下走。如果每层楼梯的台阶都很滑(梯度值小于 1),你每走一层,消息就会丢失一部分,等到底层时,消息已经微弱到无法辨认(梯度消失)。
-
有了残差连接时:除了楼梯,每层还安装了一个外部电梯。你的消息可以兵分两路:
-
一路:继续走楼梯(通过子层
)。
-
另一路:直接坐电梯(通过 +x 的恒等映射),跳过楼层的内部计算,直达下一层。
-
正是这条“电梯捷径”确保了即使子层的梯度很小,梯度信号也能完整、有效地传递到网络的深处。它为梯度流提供了一条“绿色通道”,保证了训练的稳定性和效率。
因此,残差连接的真正作用,就是在反向传播时,为梯度提供一条加性的、不受权重矩阵影响的路径,从而从根本上解决了深度网络中的梯度消失问题。
层归一化 (Layer Normalization)
是什么?
层归一化,顾名思义,是对神经网络的每一层进行归一化处理。它将一个训练样本的所有特征(即一个样本的每个 token 的所有维度)进行归一化,使得这些特征的均值为 0,方差为 1。
它与我们更熟悉的 批量归一化 (Batch Normalization) 有所不同:
-
批量归一化:对一个批次中所有样本的同一特征维度进行归一化。
-
层归一化:对一个样本的所有特征维度进行归一化。
在自然语言处理中,句子长度是不固定的,批量归一化难以应用,而层归一化则不受批次大小和序列长度的影响,因此更适合 Transformer 这种处理序列数据的模型。
为什么需要它?
在深度神经网络中,每个子层的输出分布都会在训练过程中发生变化,这种现象被称为 “内部协变量偏移” (Internal Covariate Shift)。这导致每一层都需要不断适应前面层的新分布,使得训练变得不稳定且收敛缓慢。
它的作用是什么?
层归一化通过在每个子层之后立即进行归一化,带来了以下核心优势:
-
稳定训练过程:它将每层的输入分布都稳定在一个相对固定的范围内,减轻了内部协变量偏移,使得模型训练更加稳定和高效。
-
加速收敛:稳定的分布让模型可以使用更高的学习率进行训练,从而加速了模型的收敛速度。
-
平滑损失函数:归一化使得损失函数变得更加平滑,这有助于梯度下降算法更快地找到最优解。
层归一化就像一个“标准化检查站”,在每层计算结束后,它都会对结果进行统一处理,确保输入到下一层的数据格式始终保持一致。
总结:两者如何协同工作
在 Transformer 架构中,一个标准的子层(例如自注意力层)的计算流程是:
1. 子层计算:
2. 残差连接:
3. 层归一化:
残差连接解决了梯度消失和网络退化问题,使网络能够“深”得起来;层归一化则解决了训练不稳定的问题,使网络能够“快”得起来。
更多推荐
所有评论(0)