一句话:Transformer 把「序列必须按顺序处理」这个假设去掉了,让模型可以在一次前向里看到整段文本,并把任意两个位置直接连起来。
为什么 RNN 会成为瓶颈
在 2017 年之前,序列建模的主流是 RNN / LSTM。它有两个结构性问题:
- 串行依赖:第 t 步必须等第 t-1 步算完,训练时无法在时间维度并行,GPU 利用率低。
- 长距离衰减:信息要沿着时间步一步步传递,跨度到几百个 token 时,梯度与记忆都开始失真。
卷积网络(CNN)可以并行,但感受野要靠堆层数线性扩张。Transformer 的答案是:让任意两个位置一步可达。
自注意力:一次前向里的全局关联
每个 token 的向量会被线性投影成三份:
| 名称 | 含义 | 作用 |
|---|---|---|
| Q(Query) | 我在找什么 | 当前 token 发出的查询 |
| K(Key) | 我能提供什么 | 其他 token 的索引标签 |
| V(Value) | 我实际携带的信息 | 被加权聚合的内容 |
注意力权重的计算过程是:用 Q 和所有 K 做点积得到相关性分数,除以 √d_k 防止分数随维度变大而爆炸,再经 softmax 归一化,最后对 V 加权求和。
Attention(Q, K, V) = softmax(QKᵀ / √d_k) · V
这一步的复杂度是 O(n²·d):序列长度翻倍,注意力矩阵的计算量涨四倍。这也解释了为什么「长上下文」在工程上首先是显存和算力问题。
多头:让模型同时看不同的关系
单套 Q/K/V 只能学到一种关联模式。多头注意力把维度切成 h 份,每份独立做注意力,再拼回原维度:
- 有的头学到相邻词搭配(局部语法)
- 有的头学到指代关系(代词 → 实体)
- 有的头学到段落级主题一致性
头之间不共享参数,这是 Transformer 表达力的重要来源。实际模型中 h 常见取 8~64,单头维度 d/h 多为 64 或 128。
位置编码:注意力本身不知道顺序
自注意力对输入是置换不变的——打乱 token 顺序,结果只是跟着换位置。所以必须显式注入位置信息,两条路线:
- 绝对位置编码(原始论文):用不同频率的正弦/余弦函数生成固定向量,加到词嵌入上。
- 相对位置 / RoPE(后续主流):把位置信息编码进 Q、K 的旋转角,注意力分数只依赖相对距离,外推性更好,是目前开源模型的标准做法。
残差、LayerNorm 与前馈层
每个子层外面套 x + Sublayer(x) 的残差连接,再做 LayerNorm:
- 残差保证梯度能直接回传,是堆到几十上百层的前提;
- LayerNorm 稳定激活分布。现代实现多改用 Pre-Norm(先归一化再进子层)或 RMSNorm,训练更稳、开销更小。
每个注意力层后面接一个逐位置的前馈网络(FFN),通常是「升维 4 倍 → 激活 → 降维」。模型的大部分参数其实在 FFN 里,MoE 也正是从这一层做稀疏化的。
工程上的三个关键优化
- KV Cache:自回归生成时,历史 token 的 K/V 不变,缓存下来可把每步计算从 O(n²) 降到 O(n)。代价是显存随上下文线性增长,长上下文场景下 KV Cache 往往比权重更吃显存。
- FlashAttention:不显式存完整的 n×n 注意力矩阵,改为分块计算 + 在线 softmax,把中间结果留在 SRAM,显著降低显存带宽压力。
- MQA / GQA:让多个 Query 头共享同一组 K/V 头,直接压缩 KV Cache 体积,是长上下文推理的常用手段。
小结
Transformer 的核心贡献不是某个公式,而是把序列建模从「必须按顺序」变成了「一次看全、按相关性聚合」。它带来的 O(n²) 代价,催生了后面一整条工程优化线:FlashAttention、GQA、稀疏注意力、线性注意力,以及把上下文窗口从 2K 推到百万级的各种尝试。理解了注意力在算什么,再看这些优化就不是堆名词,而是在回答同一个问题:怎样在有限显存里,让更多 token 互相关联。