趋近智
编码器堆栈由多个相同层组成,常表示为 N 层(例如,在原始 Transformer 论文中 N=6)。每个编码器层的主要作用是将输入嵌入序列转换为语境化表示序列。这些表示纳入了整个输入序列的信息,使模型能够理解每个元素在其语境中的作用。
单个编码器层由两个主要子层构成:
尤其重要的是,每个子层都包裹在残差连接和层归一化之中。这种“添加与归一化”模式是 Transformer 架构的一个典型特点,对于有效训练深度模型来说非常必要。我们来查看单个编码器层内的结构和数据流。
假设编码器层的输入是向量序列 X=(x1,x2,...,xn),且 n 是序列长度,每个 xi 是一个向量(例如,对于第一层,是词元嵌入和位置编码的和,或前一个编码器层的输出)。
多头自注意力: 输入序列 X 首先通过多头自注意力子层。如第三章所述,这种机制使序列中的每个位置 i 能够关注序列 X 中的所有位置(包括自身)。它根据从 X 本身得到的查询、键和值计算注意力分数,产生一个输出序列,其中每个向量是值向量的加权和,反映语境信息。将此子层的输出表示为 MultiHeadAttention(X)。
添加与归一化(第一块): 自注意力子层的输出随后通过残差连接(相加)与原始输入 X 结合。这有助于避免深度网络中的梯度消失问题,通过允许梯度直接流经网络。为了正则化,通常在加法步骤之前将 Dropout 应用于自注意力子层的输出。加法之后,应用层归一化。层归一化稳定激活并改善训练动态。此块的操作可以表示为:
子层输出1=层归一化(X+Dropout(多头注意力(X)))结果 子层输出1 是一个与 X 维度相同的中间表示序列。
按位置前馈网络(FFN): 该中间序列 子层输出1 随后输入到按位置前馈网络。该网络由两个线性变换构成,其间带有一个激活函数(通常是 ReLU 或 GELU)。重要的是,相同的 FFN(具有相同的权重)独立地应用于序列 子层输出1 中的每个位置 i。它提供非线性变换,进一步处理表示。将输出表示为 FFN(子层输出1)。其结构通常是:
FFN(z)=max(0,zW1+b1)W2+b2其中 z 是特定位置的输入向量,而 W1,b1,W2,b2 是两个线性层的可学习参数。内部维度通常大于模型的嵌入维度 dmodel。
添加与归一化(第二块): 与第一个子层相似,FFN 的输出通过残差连接与它的输入(子层输出1)结合,随后是 dropout 和层归一化。
层输出=层归一化(子层输出1+Dropout(FFN(子层输出1)))层输出 是此编码器层的最终向量输出序列。此输出与输入 X 具有相同的维度,并作为堆栈中下一个相同编码器层的输入。
以下图表说明了一个遵循此描述的单个编码器层结构(通常称为 Post-LN,即归一化发生在加法之后):
标准 Transformer 编码器层(Post-LN 变体)的结构。输入流经多头注意力,与残差输入相加,并归一化。这个结果随后流经前馈网络,再次与它的残差输入(第一个归一化的输出)相加,并再次归一化以产生该层的输出。在每次加法之前应用 Dropout。
值得注意的是,有一种常见的架构修改称为 Pre-LN Transformer。在此变体中,层归一化步骤在输入进入每个子层(自注意力和 FFN)之前应用,而残差连接将子层的输出直接添加到其输入。
Pre-LN 的流程如下所示:
Pre-LN 通常带来更稳定的训练,特别是对于非常深的 Transformer,并且与原始 Post-LN 结构相比,可能需要较少仔细的学习率预热。理解这两种配置很有帮助,因为实现和研究论文可能使用任一变体。
堆栈中最后一个编码器层(第 N 层)的输出作为解码器堆栈中每一层交叉注意力机制的键(K)和值(V)输入,我们接下来将讨论这个。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造