2.1 Self-Attention 机制详解 Self-Attention(自注意力)是 Transformer 的灵魂。这一节我们从「序列建模为什么需要注意力」开始,一步步推出 $\text{softmax}(QK^\top/\sqrt{dk})V$ 这个公式,并解释公式中每一项的物理意义。 一、为什么需要注意力:RNN 的痛点 在 Transformer 出现之前,序列建模主要靠 RNN / LSTM。它们的工作方式是逐 token 处理: 这种结构有两个根本痛点: 痛点一:无法并行 RNN 必须先算出 $h1$ 才能算 $h2$,整条序列只能顺序处理。这导致 GPU 这种为并行计算设计的硬件无法发挥,训练大模型变得非常慢。
Self-Attention(自注意力)是 Transformer 的灵魂。这一节我们从「序列建模为什么需要注意力」开始,一步步推出 \text{softmax}(QK^\top/\sqrt{d_k})V 这个公式,并解释公式中每一项的物理意义。
在 Transformer 出现之前,序列建模主要靠 RNN / LSTM。它们的工作方式是逐 token 处理:
token_1 → [RNN] → h_1 → [RNN] → h_2 → [RNN] → h_3 → ...
这种结构有两个根本痛点:
RNN 必须先算出 h_1 才能算 h_2,整条序列只能顺序处理。这导致 GPU 这种为并行计算设计的硬件无法发挥,训练大模型变得非常慢。
信息要靠隐藏状态 h_t 一站站传递,传递越长越容易丢失。即便 LSTM 引入门控缓解,到几十 token 之外,模型也很难再记得开头说了什么。
Self-Attention 用一种完全不同的思路解决这两个问题:让序列中每个位置同时与所有其他位置计算相似度,根据相似度加权汇总信息。这样既能并行(一次矩阵乘法搞定),又让任意两个 token 之间的「距离」永远是 1。
Self-Attention 的核心隐喻来自信息检索。想象你在一个图书馆找书:
Self-Attention 把序列中每个 token 同时扮演查询者和被查询者两个角色:
形式化地,给定输入序列的嵌入矩阵 X \in \mathbb{R}^{N \times d}(N 是序列长度,d 是隐藏维度),我们用三个可学习的权重矩阵 W^Q, W^K, W^V \in \mathbb{R}^{d \times d_k} 把它投影成三份:
每个矩阵的形状都是 \mathbb{R}^{N \times d_k}。
接下来要计算「查询与每个 key 的匹配程度」。最自然的选择是点积(dot product)——两个向量方向越一致,点积越大。
把所有位置一次性算出来,就是一个矩阵乘法:
矩阵 S 的第 i 行第 j 列就是「位置 i 对位置 j 的关注程度」。这个 N \times N 的矩阵叫注意力矩阵(Attention Matrix)。
直接对 S 做 softmax 会遇到一个数值稳定性问题。当 d_k 较大时(比如 64 或 128),Q_i \cdot K_j 是 d_k 个独立项之和,其方差大致与 d_k 成正比。如果点积结果数值很大,softmax 会进入梯度饱和区——某些位置的权重接近 1,其他位置接近 0,梯度几乎为零,训练停滞。
解决方法是除以 \sqrt{d_k},把方差控制在 1 附近:
这个看似不起眼的缩放因子,是 Transformer 训练稳定性的关键工程细节之一。
把缩放后的分数通过 softmax 转成概率分布,让所有关注权重之和为 1:
A_{ij} 表示「位置 i 把多少注意力分配给位置 j」。最后用这个注意力矩阵对 Value 加权求和:
输出第 i 行就是位置 i 综合了所有位置 Value 后的新表示。完整公式:
这就是 Transformer 论文 Attention Is All You Need 给出的著名公式。
很多初学者卡在形状变化上,我们把它走一遍(假设 N=4, d=8, d_k=4):
X : [4, 8] W^Q, W^K, W^V : [8, 4] Q = X @ W^Q : [4, 4] K = X @ W^K : [4, 4] V = X @ W^V : [4, 4] S = Q @ K^T : [4, 4] # 注意力分数矩阵 S_scaled = S / sqrt(4) : [4, 4] A = softmax(S_scaled, dim=-1) : [4, 4] Out = A @ V : [4, 4] # 与输入 X 同维(如 d_k = d)
整个过程只有矩阵乘法 + softmax,全部可以在 GPU 上高效并行。
Self-Attention 的优势是并行与全局视野,代价是计算与内存复杂度都是 O(N^2 d)——序列长度翻倍,开销变 4 倍。这就是为什么:
后续我们会看到,多模态大模型在处理高分辨率图像或长视频时,视觉 token 数量很容易超过几千——这就是 LLaVA-NeXT、Qwen2-VL 等模型不得不引入动态分辨率、token 压缩等技术的原因。
把整个公式翻译成一句话:
每个位置生成一个查询,去问所有位置「你跟我相关吗」;用 softmax 把答案变成概率;按概率把大家的内容加权汇总,作为我自己的新表示。
一个有用的几何直觉:Self-Attention 是一种「软路由」。每个 token 看了看四周,决定从哪些 token 那里「借」多少信息过来。它跟 CNN 的「固定局部卷积」、RNN 的「逐站传递」都不同,是一种动态、全局、内容驱动的信息聚合方式。
考虑句子「The cat sat on the mat because it was tired」。处理到「it」这个 token 时:
这就是 Self-Attention 解决指代消解(coreference resolution)这类任务的内在机制。
Self-Attention 用一个公式 \text{softmax}(QK^\top/\sqrt{d_k})V 完成了序列内全局信息流动。它的精髓是让每个位置动态决定关注谁,从而兼顾并行性、长距离依赖、内容驱动三个目标。
下一节(2.2)我们把 Self-Attention 包装成完整的 Transformer 层——加上多头、残差、LayerNorm、前馈网络,看一个真正的 Transformer 块是如何组装的。