Skip to content

3.1 Transformer 全景

2017 年,Vaswani 等人在 "Attention Is All You Need" 中提出了 Transformer 架构。这一模型彻底摒弃了循环(Recurrence)和卷积(Convolution)结构,完全依赖注意力机制来捕捉序列内的依赖关系。由于不存在循环依赖,Transformer 的计算可以高度并行化,极大地缩短了在现代 GPU 上的训练时间,为训练规模空前的语言模型铺平了道路。今天几乎所有大型语言模型——BERT、GPT 系列、T5、LLaMA 等——都建立在 Transformer 架构或其变体之上。

本节将以原始 Transformer 的 Encoder-Decoder 架构为主线,从宏观到微观,完整追踪一条数据从输入到输出的全部流程。理解这条数据流是掌握所有后续变体(Encoder-only、Decoder-only)的前提。

Transformer 完整架构示意图

图 3-1:Transformer 的 Encoder-Decoder 架构。左侧为编码器栈,右侧为解码器栈,二者通过编码器-解码器注意力连接。编码器栈的每一层包含多头自注意力和前馈网络两个子层;解码器栈的每一层在此基础上增加了掩码自注意力子层。每个子层都配有残差连接和层归一化。

3.1.1 宏观结构:编码器与解码器

Transformer 遵循经典的编码器-解码器(Encoder-Decoder)框架。编码器负责将输入序列转换为一组连续的表示向量,解码器则基于这些表示向量,逐步生成输出序列。二者都由 N 个结构相同的层堆叠而成——原始论文中 N=6

在宏观层面,数据的流动可以概括为以下路径:

输入词元嵌入 + 位置编码编码器栈上下文表示解码器栈线性层 + Softmax输出概率分布

接下来,我们沿着这条路径逐步展开。

3.1.2 输入表示:词嵌入与位置编码

词嵌入(Token Embedding)。 输入序列首先经过分词器(Tokenizer)被切分为离散的词元(Token),每个词元被映射为一个词汇表中的整数索引。嵌入层(Embedding Layer)将这些整数索引转换为 dmodel 维的连续向量。在原始论文中,dmodel=512。为了使嵌入值的量级与后续叠加的位置编码相匹配,嵌入向量会乘以 dmodel 进行缩放。

位置编码(Positional Encoding)。 自注意力机制本身是置换不变的——它并不关心输入词元的顺序。这对于自然语言处理是致命的,因为 "猫追狗" 和 "狗追猫" 的语义截然不同。为此,必须额外注入位置信息。原始 Transformer 使用正弦-余弦函数定义的固定位置编码:

PE(pos,2i)=sin(pos100002i/dmodel),PE(pos,2i+1)=cos(pos100002i/dmodel)

其中 pos 为词元在序列中的绝对位置,i 为维度索引。每个位置被编码为一个 dmodel 维向量,与词嵌入逐元素相加,作为编码器(或解码器)的输入:

X=TokenEmbedding(tokens)dmodel+PositionalEncoding(positions)

这一设计使得不同位置的向量在向量空间中具有可区分的表示,同时保留了相对位置关系的某些数学性质。

3.1.3 编码器栈

编码器由 N 个相同的层顺序堆叠而成。每一层包含两个子层(Sublayer),数据依次通过它们。

子层 1:多头自注意力(Multi-Head Self-Attention)。 这是 Transformer 的核心引擎。输入序列中的每个位置都可以"关注"序列中的所有位置(包括自身),从而捕捉任意距离的依赖关系。具体而言,输入 X 被线性投影为查询(Query)、键(Key)、值(Value)三组矩阵:

Q=XWQ,K=XWK,V=XWV

然后计算缩放点积注意力(参见 2.3 节)。"多头"(Multi-Head)意味着上述过程被并行执行 h 次,每次使用不同的投影矩阵,将 dmodel 维空间拆分为 hdk=dmodel/h 维的子空间。每个"头"在不同的子空间中学习不同的注意力模式——有的头可能专注于局部语法关系,有的头可能捕捉长距离语义关联。h 个头的输出被拼接(Concatenate)后,再经过一个线性投影回到 dmodel 维:

MultiHead(Q,K,V)=Concat(head1,,headh)WO

在编码器的自注意力中,QKV 全部来自上一层的输出(对于第一层,则来自嵌入层的输出),因此称为"自"注意力。

子层 2:位置前馈网络(Position-wise Feed-Forward Network, FFN)。 自注意力完成了位置之间的信息交互,而 FFN 则对每个位置独立地施加非线性变换。它是一个简单的两层全连接网络:

FFN(x)=ReLU(xW1+b1)W2+b2

其中中间层的维度 dff 通常为 dmodel 的 4 倍(原始论文中 dff=2048)。"Position-wise" 的含义是,序列中所有位置共享同一组权重 W1,W2,但每个位置的计算彼此独立。FFN 为模型提供了必要的逐位置非线性表达能力。

残差连接与层归一化(Add & Norm)。 每个子层都包裹在一个残差连接中,其后紧跟层归一化(Layer Normalization)。形式上:

LayerNorm(x+Sublayer(x))

残差连接确保了梯度可以直接回传到浅层,缓解深层网络的梯度消失问题。层归一化在特征维度上对每个样本独立地重新中心化和缩放,稳定训练过程。为了使残差加法可行,所有子层的输出维度必须与输入维度一致,即始终保持 dmodel 维——编码器的每一层都不改变张量的形状

经过 N 层编码器之后,原始输入序列被变换为一组上下文感知的表示向量 HRn×dmodeln 为序列长度),这些向量将被传递给解码器。

3.1.4 解码器栈

解码器同样由 N 个相同的层堆叠而成,但每一层比编码器多出一个子层,总共三个子层。

子层 1:掩码多头自注意力(Masked Multi-Head Self-Attention)。 与编码器的自注意力结构相同,但增加了"掩码"(Mask)机制。在生成位置 t 的输出时,掩码阻止注意力机制关注位置 t 之后的任何位置。这一限制确保了模型的自回归(Autoregressive)特性:预测第 t 个词元时,只能依赖位置 1,2,,t1 已生成的词元以及位置 t 自身,不能"偷看"未来。

实现上,掩码是一个上三角矩阵,在计算注意力分数之后、softmax 之前,将所有未来位置对应的分数设为 ,使其在 softmax 后的权重为零。

子层 2:编码器-解码器注意力(Encoder-Decoder Attention)。 这是连接编码器和解码器的桥梁。在这一层中,查询(Q)来自上一个解码器子层的输出,而键(K)和值(V)来自编码器栈的最终输出 H。这使得解码器在每一步都能访问输入序列的完整信息,动态地决定应当关注源序列的哪些部分。

这种设计与 2.3 节介绍的 Bahdanau 注意力在功能上是一致的——都是让解码器能够有选择地"回看"编码器的输出。不同之处在于,Transformer 的编码器-解码器注意力使用多头缩放点积机制,而非加性注意力。

子层 3:位置前馈网络(FFN)。 与编码器中的 FFN 完全相同。

每个子层同样采用残差连接和层归一化。注意,原始 Transformer 中层归一化放在子层之后(Post-Norm),这是一个重要的设计细节,将在后续章节讨论其与 Pre-Norm 的区别。

3.1.5 输出层:从隐状态到概率分布

解码器栈的输出是一个 Rm×dmodel 的张量(m 为目标序列长度)。这个张量经过一个线性层(Linear Layer)投影到词汇表大小 V 的维度,再经过 Softmax 函数转化为概率分布:

P(yty<t,x)=Softmax(htWvocab+bvocab)

其中 htRdmodel 是解码器在位置 t 的输出,WvocabRdmodel×V 是投影矩阵。每个位置输出一个 V 维的概率向量,表示该位置上每个词元出现的概率。训练时使用交叉熵损失来优化整个模型。

3.1.6 完整数据流:从输入到输出

下面我们将上述所有环节串联起来,追踪一条完整的数据流。以机器翻译为例,将英文句子 "The cat sits on the mat" 翻译为法文。

Transformer 数据流可视化

图 3-2:Transformer 内部数据流可视化。图示展示了词元从输入嵌入层出发,经过多头自注意力和前馈网络的逐层变换,最终输出下一词元概率分布的全过程。

编码器侧的数据流:

  1. 分词:输入句子被分词为词元序列 ["The","cat","sits","on","the","mat"],经查表转为整数索引。
  2. 嵌入 + 位置编码:每个索引通过嵌入层转为 dmodel 维向量,乘以 dmodel 后与对应位置的正弦-余弦编码相加,形成初始表示矩阵 X0R6×dmodel
  3. 第 1 层编码器X0 首先进入多头自注意力子层。每个词元(如 "sits")同时关注所有 6 个位置,通过 h 个注意力头在不同子空间中计算注意力权重并汇聚信息。输出经残差连接和层归一化后,送入 FFN 子层进行逐位置的非线性变换,再次经过残差连接和层归一化,得到 X1R6×dmodel。张量形状不变,但每个位置的向量已经融合了来自其他位置的上下文信息。
  4. 第 2 至第 N 层编码器:重复上述过程。随着层数加深,每个位置的表示越来越丰富——浅层可能捕捉局部语法特征,深层可能编码全局语义关系。
  5. 编码器输出:最终得到 HR6×dmodel,这是输入句子的完整上下文表示,将作为解码器中编码器-解码器注意力的键和值。

解码器侧的数据流:

  1. 目标输入准备:训练时,目标序列 ["<BOS>","Le","chat",] 向右移位一个位置,作为解码器的输入。推理时则逐步生成:先输入 "<BOS>",生成第一个词,再将已生成的序列作为输入,如此循环。
  2. 嵌入 + 位置编码:与编码器侧相同的流程,生成解码器的初始表示。
  3. 第 1 层解码器
    • 子层 1(掩码自注意力):解码器对已生成的词元序列施加自注意力,但通过掩码确保每个位置只能看到它自身及之前的位置。
    • 子层 2(编码器-解码器注意力):查询来自子层 1 的输出,键和值来自编码器输出 H。这一步让解码器得以"查阅"源句子的完整信息,例如在生成 "chat"(法文的"猫")时,注意力会集中在编码器输出中 "cat" 对应的位置。
    • 子层 3(FFN):逐位置的非线性变换。
    • 每个子层均有残差连接和层归一化。
  4. 第 2 至第 N 层解码器:逐层深化表示。
  5. 线性层 + Softmax:解码器栈的输出经过线性投影和 Softmax,在每个位置产生词汇表上的概率分布。训练时,所有位置的预测可以并行计算(因为目标序列是已知的,掩码保证了因果性)。推理时则逐位置生成,每步取概率最高的词元(或使用束搜索等策略)。

下表总结了数据在 Transformer 各主要组件中的维度变化:

组件输入维度输出维度说明
词嵌入层(B,n) 整数索引(B,n,dmodel)查表操作
位置编码(B,n,dmodel)(B,n,dmodel)逐元素相加,维度不变
编码器层 ×N(B,n,dmodel)(B,n,dmodel)每一层保持维度不变
解码器层 ×N(B,m,dmodel)(B,m,dmodel)每一层保持维度不变
输出线性层(B,m,dmodel)(B,m,V)投影到词汇表大小
Softmax(B,m,V)(B,m,V)归一化为概率分布

表 3-1:Transformer 数据流中的维度变化。B 为批大小,n 为源序列长度,m 为目标序列长度,V 为词汇表大小。

3.1.7 原始设计的关键超参数

原始论文 "Attention Is All You Need" 中使用的 Base 模型配置如下:

超参数符号
模型维度dmodel512
FFN 内部维度dff2048
注意力头数h8
每头维度dk=dv64
编码器/解码器层数N6
Dropout 率0.1

表 3-2:原始 Transformer Base 模型的超参数配置。

这些超参数之间存在内在关联:dk=dmodel/h=512/8=64dff=4×dmodel。这些比例关系成为后续几乎所有 Transformer 变体的默认设定。

3.1.8 小结

本节完整梳理了 Transformer 的 Encoder-Decoder 架构及其数据流。核心要点如下:

  1. 架构对称性:编码器和解码器都由 N 个相同的层堆叠而成,每层的核心组件是多头注意力和前馈网络,辅以残差连接和层归一化。
  2. 三种注意力:编码器使用自注意力;解码器使用掩码自注意力(确保自回归性)和编码器-解码器注意力(连接编码器与解码器)。
  3. 维度不变性:从输入嵌入到解码器输出,张量的隐藏维度始终保持 dmodel 不变,直到最后的线性投影层。
  4. 位置编码的必要性:自注意力本身是置换不变的,位置编码是使 Transformer 能够感知词序的唯一机制。
  5. 并行性:编码器可以对所有位置并行计算;解码器在训练时借助掩码实现并行,在推理时则逐步生成。

原始 Transformer 采用的 Post-Norm 层归一化、ReLU 激活函数和正弦-余弦位置编码在后续研究中逐渐被 Pre-Norm、SwiGLU 和旋转位置编码(RoPE)等改进所取代,我们将在后续章节逐一介绍这些演进。