Transformer 架构底层原理详解
为什么需要 Transformer
在 Transformer 出现之前,处理序列数据主要靠两类模型:
- RNN / LSTM:按时间步逐个处理 token,第 t 个词的输出依赖前 t-1 个词的隐藏状态,天生无法并行,且长距离信息会随步数增长而衰减(梯度消失)
- CNN:虽然可以并行,但感受野有限,捕捉长距离依赖需要堆叠很多层
2017 年 Google 发表《Attention Is All You Need》,提出 Transformer,核心思路是:抛弃循环结构,只用注意力机制(Attention)建模序列中任意两个位置之间的关系。任意两个 token 之间的距离都是 1,长距离依赖问题迎刃而解,而且可以完全并行计算。
模型总览
一个标准的 Transformer 编码器层由以下几部分组成:
- 输入嵌入(Embedding):把 token 映射为向量
- 位置编码(Positional Encoding):注入位置信息
- 多头自注意力(Multi-Head Self-Attention):建模 token 间关系
- 前馈网络(Feed-Forward Network):逐位置的非线性变换
- 残差连接与层归一化(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_Qk = x · W_Kv = x · W_V注意力分数的计算
对于第 i 个 token,它要决定”我该关注序列里哪些 token”:
- 计算它自己的 q_i 与所有 token 的 k_j 的点积,得到相似度
- 除以 √d_k 做缩放(防止点积过大导致 softmax 梯度消失)
- 过 softmax 归一化成权重
- 用权重加权求和所有 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_Ohead_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 能高效处理海量文本”这个地基之上。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!


