Transformer 是深度学习领域的里程碑式架构,由 Vaswani 等人在 2017 年的论文《Attention Is All You Need》中提出。它彻底抛弃了传统的循环和卷积结构,仅依赖注意力机制来实现序列建模,奠定了 GPT、BERT、T5 等现代大语言模型的基础。
在 Transformer 出现之前,序列建模主要由两种架构主导:
RNN / LSTM :按时间步依次处理输入,无法并行计算,长序列存在梯度消失/爆炸问题
CNN :可以并行,但感受野受限,需要堆叠多层才能捕获长距离依赖
Transformer 的创新在于:完全放弃循环结构,仅用注意力机制来建立任意位置之间的依赖关系 。这意味着:
并行计算 :整个序列可以同时处理,训练效率远超 RNN
全局感受野 :每个位置可以直接"看到"所有其他位置
长程依赖 :没有梯度传递路径上的信息衰减
Transformer 采用编码器-解码器(Encoder-Decoder)结构:
输入序列 → [编码器 × N] → 隐含表示 → [解码器 × N] → 输出序列
原始论文中 N = 6 N = 6N = 6 ,即堆叠 6 层编码器和 6 层解码器。
编码器层 包含两个子层:
多头自注意力 (Multi-Head Self-Attention):每个位置关注序列中所有其他位置
前馈神经网络 (Feed-Forward Network):对每个位置独立应用非线性变换
每个子层后都接残差连接 和层归一化 :LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x + \text{Sublayer}(x))LayerNorm ( x + Sublayer ( x ) )
解码器层 包含三个子层:
掩码多头自注意力 (Masked Multi-Head Self-Attention):防止当前位置看到未来信息
交叉注意力 (Cross-Attention):解码器关注编码器输出的隐含表示
前馈神经网络
Self-Attention 的核心思想可以理解为一种可微分的寻址机制 :
查询(Query, Q QQ ) :当前"关注者"的表示,想知道应该关注哪些位置
键(Key, K KK ) :每个位置的"标签",用于与查询匹配
值(Value, V VV ) :每个位置的"内容",被加权聚合后输出
从信息检索的角度类比:你在搜索引擎输入查询(Query),系统将你的查询与所有文档的键(Key)进行匹配,然后返回加权后的值(Value)结果。
计算公式如下:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V
Attention ( Q , K , V ) = softmax ( d k Q K T ) V
其中:
Q ∈ R n × d k Q \in \mathbb{R}^{n \times d_k}Q ∈ R n × d k :查询矩阵,n nn 为序列长度
K ∈ R m × d k K \in \mathbb{R}^{m \times d_k}K ∈ R m × d k :键矩阵
V ∈ R m × d v V \in \mathbb{R}^{m \times d_v}V ∈ R m × d v :值矩阵
d k d_kd k :查询和键的维度
为什么需要缩放因子 d k \sqrt{d_k}d k ?
当 d k d_kd k 较大时,点积的数值范围会变大。假设 q qq 和 k kk 的每个分量是独立的均值为 0、方差为 1 的随机变量,则点积 q ⋅ k = ∑ i = 1 d k q i k i q \cdot k = \sum_{i=1}^{d_k} q_i k_iq ⋅ k = ∑ i = 1 d k q i k i 的均值为 0、方差为 d k d_kd k 。
较大的方差意味着某些点积值会非常大,导致 softmax 后梯度极小(softmax 进入饱和区),影响训练效果。除以 d k \sqrt{d_k}d k 将方差归一化到 1,保持梯度稳定。
Self-Attention 的计算过程可以分解为以下步骤:
步骤 1:线性投影
每个输入 Token x i x_ix i 通过三个不同的权重矩阵投影到 Q、K、V 空间:
q i = x i W Q , k i = x i W K , v i = x i W V q_i = x_i W^Q, \quad k_i = x_i W^K, \quad v_i = x_i W^V
q i = x i W Q , k i = x i W K , v i = x i W V
其中 W Q , W K ∈ R d model × d k W^Q, W^K \in \mathbb{R}^{d_{\text{model}} \times d_k}W Q , W K ∈ R d model × d k ,W V ∈ R d model × d v W^V \in \mathbb{R}^{d_{\text{model}} \times d_v}W V ∈ R d model × d v 。
在原始 Transformer 中,d model = 512 d_{\text{model}} = 512d model = 5 1 2 ,d k = d v = 64 d_k = d_v = 64d k = d v = 6 4 。
步骤 2:计算注意力分数
计算所有查询与所有键之间的点积,得到注意力分数矩阵 S = Q K T S = QK^TS = Q K T 。S i j S_{ij}S i j 表示第 i ii 个查询对第 j jj 个键的关注程度。
步骤 3:缩放与 Softmax
对注意力分数进行缩放并应用 softmax,得到注意力权重矩阵:
A = softmax ( S d k ) A = \text{softmax}\left(\frac{S}{\sqrt{d_k}}\right)
A = softmax ( d k S )
A i j A_{ij}A i j 表示第 i ii 个位置对第 j jj 个位置的注意力权重,所有权重之和为 1。
步骤 4:加权求和
用注意力权重对值进行加权求和,得到每个位置的输出:
Output i = ∑ j = 1 n A i j v j \text{Output}_i = \sum_{j=1}^{n} A_{ij} v_j
Output i = j = 1 ∑ n A i j v j
Self-Attention 让模型动态地决定"关注什么"。例如,在句子 "The animal didn't cross the street because it was too tired" 中,当处理 "it" 这个 Token 时,模型可以通过注意力机制将 "it" 与 "animal" 关联起来,理解 "it" 的指代对象。
单头注意力只能在一个子空间中捕获一种类型的依赖关系。但实际语言中存在多种不同类型的依赖:
语法依赖(主谓一致)
语义依赖(指代消解)
位置依赖(远近邻关系)
句法角色(主语-宾语关系)
多头注意力让模型在不同的表示子空间中并行学习不同类型的注意力模式。
Multi-Head Attention 将 Q、K、V 分别投影到 h hh 个不同的低维子空间,在每个子空间中独立计算注意力,然后拼接结果并做线性变换:
MultiHead ( Q , K , V ) = Concat ( head 1 , head 2 , … , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \text{head}_2, \dots, \text{head}_h) W^O
MultiHead ( Q , K , V ) = Concat ( head 1 , head 2 , … , head h ) W O
其中每个头(head)的计算为:
head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(Q W_i^Q, K W_i^K, V W_i^V)
head i = Attention ( Q W i Q , K W i K , V W i V )
原始论文中 h = 8 h = 8h = 8 ,每个头的维度 d k = d v = d model / h = 64 d_k = d_v = d_{\text{model}} / h = 64d k = d v = d model / h = 6 4 ,所以总计算量与单头 d model = 512 d_{\text{model}} = 512d model = 5 1 2 相当。
多视角学习 :不同的头可以学习关注不同的语言特征
互补性 :一个头可能关注局部语法关系,另一个头关注长程语义关系
鲁棒性 :即使某个头未能学到有效模式,其他头可以弥补
研究论文中的可视化表明,不同头确实学会了不同类型的注意力模式:
某些头关注相邻词的语法关系
某些头关注句子中相隔较远的语义关联
某些头关注特定词性(如动词与其主语)
Self-Attention 是置换不变 (Permutation Invariant)的——如果打乱输入 Token 的顺序,输出也会以相同方式打乱。但自然语言是序列数据,"我打你"和"你打我"是完全不同的意思。
Transformer 在输入嵌入上叠加位置编码,为模型提供位置信息:
Input i = TokenEmbedding ( x i ) + PositionalEncoding ( i ) \text{Input}_i = \text{TokenEmbedding}(x_i) + \text{PositionalEncoding}(i)
Input i = TokenEmbedding ( x i ) + PositionalEncoding ( i )
原始论文使用不同频率的正弦和余弦函数:
P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)
P E ( p o s , 2 i ) = sin ( 1 0 0 0 0 2 i / d model p o s )
P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)
P E ( p o s , 2 i + 1 ) = cos ( 1 0 0 0 0 2 i / d model p o s )
其中 p o s posp o s 是位置索引,i ii 是维度索引。
这种设计的精妙之处:
有界性 :正弦/余弦值域在 [ − 1 , 1 ] [-1, 1][ − 1 , 1 ] ,不会随位置变长而发散
相对位置表示 :对任意偏移 k kk ,P E p o s + k PE_{pos+k}P E p o s + k 可以表示为 P E p o s PE_{pos}P E p o s 的线性函数,模型可以学到相对位置关系
无需学习 :编码是确定的,不需要额外的参数
除了正弦波编码,许多后续工作使用可学习的位置嵌入(如 BERT、GPT),在训练过程中通过反向传播更新位置编码向量。
对比:
方案
优点
缺点
正弦波编码
可外推到更长序列,无需参数
灵活性不如可学习
可学习编码
更灵活,可适应任务
无法外推到训练时未见过的长度
RoPE(旋转位置编码)
相对位置感知,支持外推
实现相对复杂
ALiBi(线性偏置)
简单高效,极强外推能力
没有位置向量表示
RoPE(Rotary Position Embedding)是目前最流行的位置编码方案之一,被 LLaMA、Mistral、Qwen 等主流模型采用。
核心思想:通过旋转矩阵对 Query 和 Key 施加位置信息 ,使得注意力分数自然地依赖于相对位置。
q m = R Θ , m W Q x m , k n = R Θ , n W K x n q_m = R_{\Theta, m} W^Q x_m, \quad k_n = R_{\Theta, n} W^K x_n
q m = R Θ , m W Q x m , k n = R Θ , n W K x n
其中 R Θ , m R_{\Theta, m}R Θ , m 是旋转矩阵:
R Θ , m = ( cos m θ 1 − sin m θ 1 ⋯ 0 0 sin m θ 1 cos m θ 1 ⋯ 0 0 ⋱ 0 0 ⋯ cos m θ d / 2 − sin m θ d / 2 0 0 ⋯ sin m θ d / 2 cos m θ d / 2 ) R_{\Theta, m} = \begin{pmatrix}
\cos m\theta_1 & -\sin m\theta_1 & \cdots & 0 & 0 \\
\sin m\theta_1 & \cos m\theta_1 & \cdots & 0 & 0 \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
0 & 0 & \cdots & \cos m\theta_{d/2} & -\sin m\theta_{d/2} \\
0 & 0 & \cdots & \sin m\theta_{d/2} & \cos m\theta_{d/2}
\end{pmatrix} R Θ , m = ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ cos m θ 1 sin m θ 1 ⋮ 0 0 − sin m θ 1 cos m θ 1 ⋮ 0 0 ⋯ ⋯ ⋱ ⋯ ⋯ 0 0 ⋮ cos m θ d / 2 sin m θ d / 2 0 0 ⋮ − sin m θ d / 2 cos m θ d / 2 ⎠ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎞
RoPE 的优势在于:q m ⋅ k n q_m \cdot k_nq m ⋅ k n 只依赖于相对位置 m − n m - nm − n ,且支持外推到训练时未见过的序列长度。
编码器和解码器中的每个注意力子层之后都接一个位置独立的前馈网络:
FFN ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \max(0, xW_1 + b_1) W_2 + b_2
FFN ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2
这是一个两层 MLP,中间使用 ReLU 激活函数。输入和输出维度为 d model = 512 d_{\text{model}} = 512d model = 5 1 2 ,中间层维度为 d f f = 2048 d_{ff} = 2048d f f = 2 0 4 8 (4 倍扩展)。
增加非线性表达能力 :注意力机制本质上是线性加权求和,FFN 引入了非线性变换
独立处理每个位置 :与注意力不同,FFN 不混合位置之间的信息
扩大模型容量 :FFN 中的参数占整个模型的大部分
变体
公式
特点
SwiGLU
SwiGLU ( x ) = ( x W 1 ) ⊙ σ ( x W 2 ) ⋅ ( x W 3 ) \text{SwiGLU}(x) = (xW_1) \odot \sigma(xW_2) \cdot (xW_3)SwiGLU ( x ) = ( x W 1 ) ⊙ σ ( x W 2 ) ⋅ ( x W 3 )
PaLM、LLaMA 使用
GeGLU
GeGLU ( x ) = ( x W 1 ) ⊙ GELU ( x W 2 ) ⋅ ( x W 3 ) \text{GeGLU}(x) = (xW_1) \odot \text{GELU}(xW_2) \cdot (xW_3)GeGLU ( x ) = ( x W 1 ) ⊙ GELU ( x W 2 ) ⋅ ( x W 3 )
GPT-J 使用
GLU 变体
GLU ( x ) = ( x W 1 ) ⊙ σ ( x W 2 ) \text{GLU}(x) = (xW_1) \odot \sigma(xW_2)GLU ( x ) = ( x W 1 ) ⊙ σ ( x W 2 )
门控线性单元
SwiGLU 相对于原始 ReLU FFN 有更稳定的训练过程和更好的下游任务表现,但代价是多了一个权重矩阵 W 3 W_3W 3 ,参数量增加约 50%。
每个子层后都添加残差连接:Output = x + Sublayer ( x ) \text{Output} = x + \text{Sublayer}(x)Output = x + Sublayer ( x ) 。
作用:
缓解梯度消失问题,使得深度网络可训练
让信息可以直接流过整个网络
Transformer 使用 Layer Normalization 而非 Batch Normalization。原因在于:
序列长度可变 :BatchNorm 依赖于批次统计量,在序列长度变化时表现不稳定
位置独立 :LayerNorm 对每个样本独立计算统计量,更适合序列任务
训练和推理一致 :不像 BatchNorm 在训练和推理时行为不同
LayerNorm 的计算:
LayerNorm ( x ) = γ ⊙ x − μ σ 2 + ϵ + β \text{LayerNorm}(x) = \gamma \odot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta
LayerNorm ( x ) = γ ⊙ σ 2 + ϵ x − μ + β
其中 μ \muμ 和 σ 2 \sigma^2σ 2 是对特征维度计算的均值和方差,γ \gammaγ 和 β \betaβ 是可学习的缩放和偏移参数。
原始 Transformer 采用 Post-LN(残差连接后归一化),但后来发现 Post-LN 在深层网络中训练不稳定。现代实现(如 GPT、BERT、LLaMA)普遍采用 Pre-LN(先归一化再进入子层):
Post-LN :LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x + \text{Sublayer}(x))LayerNorm ( x + Sublayer ( x ) )
Pre-LN :x + Sublayer ( LayerNorm ( x ) ) x + \text{Sublayer}(\text{LayerNorm}(x))x + Sublayer ( LayerNorm ( x ) )
Pre-LN 的梯度流更直接,对学习率的选择更宽容,训练更稳定。
编码器将输入序列映射为连续的隐含表示,供解码器使用。
流程:
输入 Token 经过词嵌入(Token Embedding)和位置编码
经过 N NN 层编码器层
每一层包含:多头自注意力 + FFN,均带残差连接和层归一化
输出与输入序列长度相同的隐含表示序列
编码器的自注意力中,每个位置可以关注输入序列的所有位置(包括自身)。
解码器以编码器的输出为条件,自回归地生成目标序列。
三个子层:
掩码自注意力(Masked Self-Attention) :确保当前位置只能关注之前的位置,防止信息泄露。实现方式是在计算注意力分数时,将未来位置的分数设为 − ∞ -\infty− ∞
交叉注意力(Cross-Attention) :K KK 和 V VV 来自编码器的输出,Q QQ 来自解码器的隐含表示。这样解码器可以关注输入序列的相关部分
前馈网络
掩码自注意力中的掩码矩阵是一个上三角矩阵:
M i j = { 0 if i ≥ j − ∞ if i < j M_{ij} = \begin{cases}
0 & \text{if } i \geq j \\
-\infty & \text{if } i < j
\end{cases} M i j = { 0 − ∞ if i ≥ j if i < j
经过 Softmax 后,− ∞ -\infty− ∞ 对应的位置权重为 0,即当前位置看不到任何未来位置的信息。
解码器在推理时自回归生成序列:
初始输入为 <BOS>(句首标记)
每步生成一个 Token
将新生成的 Token 拼接回输入序列
重复直到生成 <EOS>(句尾标记)
在训练时,使用教师强制 (Teacher Forcing):无论模型生成什么,都使用真实的目标序列作为输入。
论文使用 Adam 优化器,并配合学习率预热 (Learning Rate Warmup):
lr = d model − 0.5 ⋅ min ( step − 0.5 , step ⋅ warmup_steps − 1.5 ) \text{lr} = d_{\text{model}}^{-0.5} \cdot \min(\text{step}^{-0.5}, \text{step} \cdot \text{warmup\_steps}^{-1.5})
lr = d model − 0 . 5 ⋅ min ( step − 0 . 5 , step ⋅ warmup_steps − 1 . 5 )
学习率先在前 4 , 000 4{,}0004 , 0 0 0 步线性增长,然后按步数的平方根衰减。
Dropout :在每个子层的输出上应用 Dropout(P drop = 0.1 P_{\text{drop}} = 0.1P drop = 0 . 1 )
标签平滑 (Label Smoothing):ϵ l s = 0.1 \epsilon_{ls} = 0.1ϵ l s = 0 . 1 ,将正确的 one-hot 标签转换为平滑分布
原始论文中的 Base 模型配置:
参数
值
d model d_{\text{model}}d model
512
d f f d_{ff}d f f
2048
h hh (注意力头数)
8
d k d_kd k (每个头维度)
64
N NN (层数)
6
总参数量
~65M
Batch size
~25,000 个 Token
Big 模型(Transformer-Big)将 d model d_{\text{model}}d model 设为 1024,d f f d_{ff}d f f 设为 4096,注意力头数增至 16,参数量约 213M。
Transformer 架构在后续工作中经历了多次关键演变:
Encoder-Only(BERT 系列)
只使用编码器部分
双向上下文建模
擅长理解任务(分类、抽取、问答)
Decoder-Only(GPT 系列)
只使用解码器部分
自回归(从左到右)建模
擅长生成任务
成为现代 LLM 的主流架构
Encoder-Decoder(T5 系列)
保持完整的编码器-解码器结构
适合序列到序列任务(翻译、总结)
在需要同时理解输入和生成输出的场景表现优异
简洁统一 :一种架构处理所有任务
零样本泛化 :自回归方式天然支持 in-context learning
可扩展性 :decoder-only 在规模化时表现更稳定
高效推理 :KV Cache 使得 incremental decoding 高效
注意力机制的优化
改进
描述
代表模型
Grouped Query Attention (GQA)
分组查询注意力,减少 KV 头数
LLaMA 2/3, Mistral
Multi-Query Attention (MQA)
所有查询共享 KV
PaLM
Sliding Window Attention
只关注局部窗口
Mistral
Flash Attention
IO 感知的精确注意力实现
GPT-4, LLaMA
Sparse Attention
稀疏的注意力模式
Longformer, BigBird
Flash Attention 是最重要的工程改进之一。它通过分块计算和重排来减少 GPU HBM(高带宽内存)与 SRAM 之间的数据读写,在保持数学精确性的前提下实现了 2-4 倍的速度提升和显著的内存节省。
Kaplan 等人的研究表明,Transformer 的语言建模损失随模型参数量、数据量和计算量的增加而呈幂律下降。这直接驱动了"打不过就加参数"的规模化范式:
GPT-3(175B)→ PaLM(540B)→ LLaMA(65B→405B)→ GPT-4
上下文长度:512 → 2K → 8K → 32K → 128K → 1M+
训练数据量:从几十 GB 到数万亿 Token
KV Cache
在自回归解码中,每一步都需要重新计算之前所有位置的 K KK 和 V VV 。KV Cache 将历史 K KK 和 V VV 缓存起来,避免重复计算,是 decoder-only 模型推理加速的核心技术。
实现要点:
初始化时分配固定大小的缓存(最大序列长度)
每步只计算当前 Token 的 K KK 和 V VV ,追加到缓存中
支持批处理(batch dimension)
KV Cache 的内存占用 是长上下文推理的主要瓶颈。对于 7B 模型,batch size 为 1 时,8K 上下文的 KV Cache 约占用 2GB 显存。
推测解码(Speculative Decoding)
使用小型草稿模型快速生成候选 Token,再由目标模型验证,在保持质量的同时提升解码速度。
原生 Transformer 的注意力复杂度为 O ( n 2 ) O(n^2)O ( n 2 ) ,限制了上下文长度。解决方案包括:
稀疏注意力 :只关注部分位置(Longformer、BigBird)
Ring Attention :分布式分块计算,支持超长上下文
位置编码外推 :RoPE 通过频率缩放实现长度外推(NTK-aware scaling)
上下文压缩 :将长历史压缩为紧凑表示
混合精度训练(FP16/BF16)中,注意力分数可能溢出。Flash Attention 通过分块和在线 softmax 重排来保证数值稳定。
Transformer 的核心贡献可以概括为:
注意力即一切 :证明纯注意力架构可以超越 RNN 和 CNN
并行训练 :解决了序列模型训练效率的根本瓶颈
可扩展性 :随数据量和参数量的增加持续提升
其影响力远超 NLP 领域——Transformer 架构已被成功应用于计算机视觉(ViT)、语音识别(Whisper)、多模态(CLIP)、蛋白质折叠(AlphaFold 2)等广泛领域。
理解 Transformer 是理解现代 AI 的起点。从 self-attention 的数学原理到多头机制的设计理念,从位置编码的精巧构造到规模化定律的驱动逻辑,每一个设计选择都深刻影响了今天 AI 的能力边界。
此页面为 AI 知识体系 的一部分,内容持续更新中。