神经网络Transformer架构中的归一化前残差连接
-
残差连接基础概念回顾
残差连接是深度神经网络中的一项核心结构,其核心思想是将某一层的输入直接“绕道”与该层的输出相加,作为下一层的输入。其数学形式为:输出 = 非线性激活( 层运算(输入) ) + 输入。在标准Transformer(如原始论文所述)中,残差连接通常应用于每个子层(如自注意力层和前馈网络层)之后,并且是在该子层的输出经过“层归一化”处理之前或之后进行,这构成了关键区别。 -
“归一化前”与“归一化后”的架构差异
这是理解本词条的关键。在原始的Transformer架构(以及许多后续模型如BERT、GPT-2)中,采用的是“归一化后”残差连接,其子层顺序为:层归一化 -> 子层运算(自注意力/前馈网络)-> 残差相加。即输出 = 子层运算( 层归一化(输入) ) + 输入。而“归一化前”残差连接,有时被称为“前置归一化”,其顺序为:子层运算(自注意力/前馈网络)-> 残差相加 -> 层归一化。即输出 = 层归一化( 子层运算(输入) + 输入 )。后者的归一化操作被移到了残差相加之后。 -
“归一化前”残差连接的优势与原理
采用“归一化前”设计主要带来两个核心优势:- 训练稳定性提升:在深层网络中,梯度流经多个层时可能变得不稳定(消失或爆炸)。将层归一化置于残差路径的末端,意味着每个子层的输入在进入非线性运算前不再被显式归一化,但梯度在反向传播时,会流经一个被归一化的变量。这种设计被实践证明(如GPT-3、T5等模型采用)能有效缓解深层Transformer模型的训练不稳定性,允许训练更深的网络。
- 与自适应优化器的更好协同:现代优化器如Adam包含对梯度一阶矩和二阶矩的自适应估计。“归一化前”设计使得网络各层的激活值在训练过程中保持相对稳定的均值和方差(得益于最后的归一化),这有助于自适应优化器做出更一致的更新决策,从而可能带来更快的收敛和更好的最终性能。
-
具体实现与模型实例
在实际的Transformer块中,对于“归一化前”架构,一个典型的编码器层结构序列为:- 自注意力子层:
注意力输出 = 多头注意力(输入),然后进行第一次残差相加与归一化:中间输出 = 层归一化(注意力输出 + 输入)。 - 前馈网络子层:
前馈输出 = 前馈网络(中间输出),然后进行第二次残差相加与归一化:最终输出 = 层归一化(前馈输出 + 中间输出)。
这种模式将层归一化作为信息流在进入下一个计算模块前的“整理”步骤。许多现代大规模模型,如GPT系列、T5、Swin Transformer等,均采用了这种或类似的“归一化前”设计变体。
- 自注意力子层:
-
设计权衡与变体
尽管“归一化前”连接提升了训练稳定性,但也并非没有代价。由于输入在进入子层计算前未被归一化,初始训练阶段可能需要更谨慎的参数初始化来确保稳定性。此外,还存在其他变体,如“三明治”结构(子层前后都进行归一化)或“自适应归一化”等。选择“归一化前”还是“归一化后”是一种架构设计权衡,通常“归一化前”在极深模型或预训练模型中表现更鲁棒,而“归一化后”在某些特定任务或较浅模型中可能仍有其优势。最终选择需通过实验验证。