Transformer:从结构到自注意力
围绕 Encoder、Decoder、自注意力、位置编码、残差连接和 Mask,梳理 Transformer 的核心机制。
Transformer 是一种基于注意力机制的神经网络结构,最初用于机器翻译任务,后来成为大语言模型的重要基础。
它和循环神经网络的思路不同。RNN 按顺序处理序列,Transformer 则通过注意力机制直接建模序列中任意位置之间的关系。这让模型更适合并行计算,也更容易捕捉长距离依赖。
Transformer 的整体结构
经典 Transformer 由 Encoder 和 Decoder 两部分组成。
-
Encoder 负责理解输入序列。
-
Decoder 负责根据 Encoder 的输出生成目标序列。
机器翻译可以作为直观例子:Encoder 读取源语言句子,Decoder 逐步生成目标语言句子。
图 1:Transformer 的基本结构
flowchart TD
A["输入序列"] --> B["Embedding"]
B --> C["位置编码"]
C --> D["Encoder"]
D --> E["上下文表示"]
E --> F["Decoder"]
F --> G["输出序列"]
Encoder 和 Decoder 内部都由多个相似模块堆叠而成。每个模块通常包含注意力层、前馈网络、残差连接和归一化。
自注意力在解决什么问题
自注意力机制用于判断一个 token 应该关注序列中的哪些位置。
比如句子:
小明把书放进书包,因为它太重了。
这里的“它”更可能指“书”,而不是“书包”。模型需要根据上下文判断词与词之间的关系。自注意力就是用来建立这种关联的。
Q、K、V 的含义
自注意力计算中,每个输入向量会被映射成三类向量:
| 向量 | 含义 | 作用 |
|---|---|---|
| Query | 查询向量 | 当前 token 想找什么信息 |
| Key | 键向量 | 当前 token 能提供什么索引 |
| Value | 值向量 | 当前 token 真正携带的信息 |
计算过程可以理解为:Query 和所有 Key 计算匹配度,再用匹配度加权求和 Value。
Scaled Dot-Product Attention
自注意力的核心公式是:
Attention(Q, K, V) = softmax(QK^T / sqrt(d_k))V
其中:
-
QK^T用来计算 Query 和 Key 的相似度。 -
sqrt(d_k)用来缩放分数,避免数值过大。 -
softmax把分数转换为权重。 -
最后乘以
V,得到加权后的表示。
图 2:自注意力计算链路
flowchart TD
A["输入向量"] --> B["生成 Q、K、V"]
B --> C["计算 Q 与 K 的相似度"]
C --> D["缩放并经过 softmax"]
D --> E["对 V 加权求和"]
E --> F["输出上下文表示"]
多头注意力为什么有用
单个注意力头只能从一个表示空间里看关系。多头注意力会并行使用多个注意力头,让模型从不同角度捕捉关联。
一个头可能更关注语法关系,另一个头可能更关注语义关系,还有的头可能关注远距离依赖。最后再把多个头的结果拼接并映射回统一维度。
位置编码补上顺序信息
Transformer 本身不会像 RNN 那样天然按顺序处理 token。为了让模型知道词在句子里的位置,需要加入位置编码。
位置编码会和词嵌入相加:
输入表示 = 词嵌入 + 位置编码
这样模型既能获得词语含义,也能知道词语所在位置。
Add & Normalize
Transformer 模块里经常出现 Add & Normalize。
Add 指残差连接。它把子层输入和子层输出相加,有助于缓解深层网络训练中的梯度问题。
Normalize 指归一化。它用于稳定数值分布,让训练过程更平稳。
输出 = LayerNorm(输入 + 子层输出)
这种结构在注意力层和前馈网络后都会出现。
Feed Forward 层负责非线性变换
注意力层主要负责信息交互,Feed Forward 层负责对每个位置的表示做进一步变换。
它通常由两个线性层和一个激活函数组成:
FFN(x) = max(0, xW1 + b1)W2 + b2
虽然结构不复杂,但它能提升模型的表达能力。
Decoder 为什么需要 Mask
Decoder 在生成文本时不能提前看到未来 token。比如生成第 3 个词时,只能使用前 1、2 个词的信息。
因此 Decoder 使用 Masked Multi-Head Attention,把未来位置遮住,避免模型偷看答案。
常见 Mask 包括:
| Mask 类型 | 作用 |
|---|---|
| Padding Mask | 遮住补齐用的 padding token |
| Sequence Mask | 遮住未来 token |
Encoder 主要需要处理 padding mask;Decoder 同时需要处理 padding mask 和 sequence mask。
输出层如何生成结果
Decoder 输出的向量会经过线性层和 softmax,转换成词表上的概率分布。
Decoder 输出 -> Linear -> Softmax -> 下一个 token 概率
生成时,模型会根据概率选择下一个 token,再继续生成后续内容。
Transformer 的优缺点
| 维度 | 表现 |
|---|---|
| 优点 | 并行计算能力强,能捕捉长距离依赖,适合大规模训练 |
| 缺点 | 注意力计算开销随序列长度增长,对显存和算力要求较高 |
Transformer 的成功来自结构上的取舍:它放弃了顺序递归,换来了更强的并行能力和上下文建模能力。
Self-Attention 的简化实现
下面的示例只保留关键计算过程:
import torch
import torch.nn.functional as F
x = torch.randn(3, 4)
W_q = torch.randn(4, 4)
W_k = torch.randn(4, 4)
W_v = torch.randn(4, 4)
Q = x @ W_q
K = x @ W_k
V = x @ W_v
scores = Q @ K.T / (K.shape[-1] ** 0.5)
weights = F.softmax(scores, dim=-1)
output = weights @ V
print(output)
这段代码对应的是:生成 Q、K、V,计算注意力分数,经过 softmax 得到权重,再对 V 加权求和。
小结
Transformer 的核心是自注意力机制。它通过 Q、K、V 计算 token 之间的关联,再配合多头注意力、位置编码、残差连接、归一化、前馈网络和 Mask,完成序列建模。
理解 Transformer,不必一开始就陷入所有公式。先抓住“每个 token 根据上下文重新组织自己的表示”这条主线,后面的结构会清晰很多。
我是姚磊
大模型应用开发者,关注 RAG、Agent 和产品化工程。沉淀实践中的判断、踩坑记录和可复用方法。联系我:yaolei_agent@163.com



