首页/论文研究/通用知识模块/Transformer 与自注意力机制
通用知识模块 基础原理 Markdown

Transformer 与自注意力机制

从 RNN 的串行瓶颈讲起,拆解 Q/K/V、缩放点积注意力、多头机制与位置编码,并说明长上下文时代的工程代价。

更新于 2026-11-03 · 通用知识模块
一句话:Transformer 把「序列必须按顺序处理」这个假设去掉了,让模型可以在一次前向里看到整段文本,并把任意两个位置直接连起来。

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 也正是从这一层做稀疏化的。

工程上的三个关键优化

  1. KV Cache:自回归生成时,历史 token 的 K/V 不变,缓存下来可把每步计算从 O(n²) 降到 O(n)。代价是显存随上下文线性增长,长上下文场景下 KV Cache 往往比权重更吃显存。
  2. FlashAttention:不显式存完整的 n×n 注意力矩阵,改为分块计算 + 在线 softmax,把中间结果留在 SRAM,显著降低显存带宽压力。
  3. MQA / GQA:让多个 Query 头共享同一组 K/V 头,直接压缩 KV Cache 体积,是长上下文推理的常用手段。

小结

Transformer 的核心贡献不是某个公式,而是把序列建模从「必须按顺序」变成了「一次看全、按相关性聚合」。它带来的 O(n²) 代价,催生了后面一整条工程优化线:FlashAttention、GQA、稀疏注意力、线性注意力,以及把上下文窗口从 2K 推到百万级的各种尝试。理解了注意力在算什么,再看这些优化就不是堆名词,而是在回答同一个问题:怎样在有限显存里,让更多 token 互相关联。