Transformer 架构底层原理详解

1930 字
10 分钟
Transformer 架构底层原理详解

为什么需要 Transformer#

在 Transformer 出现之前,处理序列数据主要靠两类模型:

  • RNN / LSTM:按时间步逐个处理 token,第 t 个词的输出依赖前 t-1 个词的隐藏状态,天生无法并行,且长距离信息会随步数增长而衰减(梯度消失)
  • CNN:虽然可以并行,但感受野有限,捕捉长距离依赖需要堆叠很多层

2017 年 Google 发表《Attention Is All You Need》,提出 Transformer,核心思路是:抛弃循环结构,只用注意力机制(Attention)建模序列中任意两个位置之间的关系。任意两个 token 之间的距离都是 1,长距离依赖问题迎刃而解,而且可以完全并行计算。

模型总览#

一个标准的 Transformer 编码器层由以下几部分组成:

Transformer 架构图(Encoder-Decoder 结构)
Transformer 架构图(Encoder-Decoder 结构)

  1. 输入嵌入(Embedding):把 token 映射为向量
  2. 位置编码(Positional Encoding):注入位置信息
  3. 多头自注意力(Multi-Head Self-Attention):建模 token 间关系
  4. 前馈网络(Feed-Forward Network):逐位置的非线性变换
  5. 残差连接与层归一化(Residual + LayerNorm):稳定训练

下面逐层拆解。

输入嵌入与位置编码#

Token 嵌入#

词表大小为 V,每个 token 通过查表得到一个 d 维向量(d 通常为 512~4096+)。嵌入矩阵是一个 V × d 的可学习参数矩阵。

为什么需要位置编码#

注意力机制本身是置换不变的:把”我打你”换成”你打我”,如果不加位置信息,模型看到的两组向量完全相同,无法区分语序。因此必须把位置信息加进去。

原始的 Transformer 使用正弦/余弦函数生成位置编码:

PE(pos, 2i) = sin(pos / 10000^(2i/d))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d))

其中 pos 是位置,i 是维度下标。这种编码有几个好处:

  • 每个位置的编码唯一
  • 任意两个位置的相对距离可以通过线性变换表达(因为 sin(a+b) 可以展开)
  • 不需要学习,长度外推性较好(现代模型多用可学习的绝对位置编码或 RoPE 旋转位置编码,各有取舍)

自注意力机制(Self-Attention)#

从查询-键-值说起#

自注意力的灵感来自检索系统:想象你在图书馆查资料,你手里有一个查询(Query),书架上每本书都有一个键(Key),你通过”查询和键的相似度”找到最相关的书,然后取走这本书的**值(Value)**内容。

对输入序列的每个 token,模型学习三个矩阵 W_Q、W_K、W_V,把嵌入向量 x 投影成三个向量:

q = x · W_Q
k = x · W_K
v = x · W_V

注意力分数的计算#

对于第 i 个 token,它要决定”我该关注序列里哪些 token”:

  1. 计算它自己的 q_i 与所有 token 的 k_j 的点积,得到相似度
  2. 除以 √d_k 做缩放(防止点积过大导致 softmax 梯度消失)
  3. 过 softmax 归一化成权重
  4. 用权重加权求和所有 v_j,得到输出

公式如下:

Attention(Q, K, V) = softmax(QKᵀ / √d_k) · V

为什么除以 √d_k#

当维度 d_k 较大时,点积的方差会随之增大,导致 softmax 输出接近 one-hot,梯度极小。除以 √d_k 可以把方差拉回到 1 附近,保持梯度稳定。

缩放点积注意力的计算复杂度#

注意力矩阵是 n×n(n 为序列长度),因此计算和显存开销都是 O(n²)。这就是为什么长上下文模型需要 FlashAttention、稀疏注意力、滑动窗口注意力等优化手段——它们本质上都是在降低这个 n² 的代价。

多头注意力(Multi-Head Attention)#

单头注意力只能捕捉一种”关系模式”。多头注意力把 d 维空间切成 h 个头,每个头在各自的子空间里独立做注意力,最后拼接:

MultiHead(Q, K, V) = Concat(head₁, ..., head_h) · W_O
head_i = Attention(Q·W_Qᵢ, K·W_Kᵢ, V·W_Vᵢ)

h 通常取 8~32,每个头的维度 d_k = d / h,总计算量不变。

多头带来的好处:

  • 多角度建模:不同的头可以分别关注语法关系、指代关系、语义相似性等
  • 集成效应:多个头相当于多个”专家”投票,鲁棒性更好
  • 并行计算:各个头互不依赖,可以并行

前馈网络(FFN)#

每个 token 经过注意力后,还要过一个逐位置(position-wise)的两层 MLP:

FFN(x) = max(0, x·W₁ + b₁)·W₂ + b₂

中间用 ReLU(现代模型常用 GELU / SwiGLU)激活,中间维度通常是 d 的 4 倍左右。注意这个 FFN 对每个位置独立作用,不跨 token 共享信息——跨 token 的信息交换全靠注意力层完成。

为什么要 FFN?注意力是线性的加权求和(权重非负且和为 1),线性组合无法表达复杂的非线性映射。FFN 提供非线性变换能力,让模型能学到更复杂的特征。

残差连接与层归一化#

残差连接#

每一层子层(注意力、FFN)都套上残差:

x' = x + Sublayer(x)

好处:

  • 梯度可以直接从输出流回输入,缓解深层网络的梯度消失
  • 即使某层学不到东西,也至少可以退化成恒等映射

层归一化(LayerNorm)#

对每个 token 的 d 维向量做归一化:

LayerNorm(x) = (x - μ) / √(σ² + ε) · γ + β

μ 和 σ 是该 token 自己那一维向量的均值和标准差。γ、β 是可学习的缩放和平移参数。LayerNorm 让每层输入的分布稳定,训练更快更稳。

现代模型(如 GPT、Llama)普遍采用 Pre-Norm 结构,即先归一化再进子层,这样更深层也能稳定训练。

从编码器到解码器#

Transformer 原始论文是 Encoder-Decoder 架构:

  • 编码器:双向注意力(每个 token 能看到全序列),适合理解任务(BERT 就是纯编码器)
  • 解码器:带掩码的因果注意力(只能看到自己及之前的 token),适合生成任务(GPT 就是纯解码器)

因果注意力的实现很简单:在算完 QKᵀ 后,把上三角部分置为 -∞,softmax 后这些位置的权重就变成 0,模型便”看不到未来”。

交叉注意力#

解码器除了自注意力,还有一层交叉注意力(Cross-Attention):Q 来自解码器,K、V 来自编码器输出。这让解码器在生成时能”查阅”编码器理解过的完整输入。

训练目标与损失#

  • 语言模型(GPT 类)用自回归方式训练:给定前文,预测下一个 token,用交叉熵损失
  • 掩码语言模型(BERT 类)随机遮住 15% 的 token 让模型预测

为什么 Transformer 能”理解”语言#

严格说,Transformer 并不”理解”语言,它学到的是 token 之间的统计规律分布式表示。但正因为注意力机制能让每个词充分参考上下文,加上足够多的数据和参数,模型涌现出语法、常识、推理等能力——这就是大模型”智能”的底层来源。

小结#

组件作用
嵌入 + 位置编码把 token 变成带位置信息的向量
多头自注意力建模任意 token 之间的关系(O(n²))
前馈网络逐位置非线性变换
残差 + LayerNorm稳定深层网络训练
因果掩码让解码器只能看过去

理解了这一层,再去看 RAG、Agent、知识库这些上层应用,你会发现它们都建立在”Transformer 能高效处理海量文本”这个地基之上。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Transformer 架构底层原理详解
https://nanxiaoxiong.com/posts/transformer-principles/
作者
小熊
发布于
2026-08-16
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
小熊
Hello, I'm xiaoxiong.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
4
分类
1
标签
9
总字数
8,596
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录