2.1 Self-Attention 机制详解


文档摘要

2.1 Self-Attention 机制详解 Self-Attention(自注意力)是 Transformer 的灵魂。这一节我们从「序列建模为什么需要注意力」开始,一步步推出 $\text{softmax}(QK^\top/\sqrt{dk})V$ 这个公式,并解释公式中每一项的物理意义。 一、为什么需要注意力:RNN 的痛点 在 Transformer 出现之前,序列建模主要靠 RNN / LSTM。它们的工作方式是逐 token 处理: 这种结构有两个根本痛点: 痛点一:无法并行 RNN 必须先算出 $h1$ 才能算 $h2$,整条序列只能顺序处理。这导致 GPU 这种为并行计算设计的硬件无法发挥,训练大模型变得非常慢。

2.1 Self-Attention 机制详解

Self-Attention(自注意力)是 Transformer 的灵魂。这一节我们从「序列建模为什么需要注意力」开始,一步步推出 \text{softmax}(QK^\top/\sqrt{d_k})V 这个公式,并解释公式中每一项的物理意义。

一、为什么需要注意力:RNN 的痛点

在 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。

二、从直觉到公式:Q、K、V 的诞生

Self-Attention 的核心隐喻来自信息检索。想象你在一个图书馆找书:

  • 你心里有一个查询意图(Query):「我想找关于深度学习的入门书」
  • 每本书的书脊上写着关键词(Key):「机器学习入门」「量子物理」...
  • 当你的查询与某本书的关键词匹配度高,你就把那本书的内容(Value)拿走

Self-Attention 把序列中每个 token 同时扮演查询者和被查询者两个角色

  • 它生成自己的 Query,去问其他所有 token「你跟我相关吗」
  • 它也生成自己的 Key,作为其他 token 查询时的「书脊」
  • 它还生成自己的 Value,作为被选中时要提供的「内容」

形式化地,给定输入序列的嵌入矩阵 X \in \mathbb{R}^{N \times d}N 是序列长度,d 是隐藏维度),我们用三个可学习的权重矩阵 W^Q, W^K, W^V \in \mathbb{R}^{d \times d_k} 把它投影成三份:

Q = X W^Q, \quad K = X W^K, \quad V = X W^V

每个矩阵的形状都是 \mathbb{R}^{N \times d_k}

三、相似度计算:为什么是点积

接下来要计算「查询与每个 key 的匹配程度」。最自然的选择是点积(dot product)——两个向量方向越一致,点积越大。

\text{score}_{ij} = Q_i \cdot K_j

把所有位置一次性算出来,就是一个矩阵乘法:

S = Q K^\top \in \mathbb{R}^{N \times N}

矩阵 S 的第 i 行第 j 列就是「位置 i 对位置 j 的关注程度」。这个 N \times N 的矩阵叫注意力矩阵(Attention Matrix)

四、缩放:为什么除以 \sqrt{d_k}

直接对 S 做 softmax 会遇到一个数值稳定性问题。当 d_k 较大时(比如 64 或 128),Q_i \cdot K_jd_k 个独立项之和,其方差大致与 d_k 成正比。如果点积结果数值很大,softmax 会进入梯度饱和区——某些位置的权重接近 1,其他位置接近 0,梯度几乎为零,训练停滞。

解决方法是除以 \sqrt{d_k},把方差控制在 1 附近:

\text{scaled score} = \frac{Q K^\top}{\sqrt{d_k}}

这个看似不起眼的缩放因子,是 Transformer 训练稳定性的关键工程细节之一。

五、归一化与加权汇总:softmax 的角色

把缩放后的分数通过 softmax 转成概率分布,让所有关注权重之和为 1:

A = \text{softmax}\left(\frac{Q K^\top}{\sqrt{d_k}}\right)

A_{ij} 表示「位置 i 把多少注意力分配给位置 j」。最后用这个注意力矩阵对 Value 加权求和:

\text{Output} = A V \in \mathbb{R}^{N \times d_k}

输出第 i 行就是位置 i 综合了所有位置 Value 后的新表示。完整公式:

\boxed{\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{Q K^\top}{\sqrt{d_k}}\right) V}

这就是 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 倍。这就是为什么:

  • BERT 把序列限制在 512 token
  • GPT-3 默认上下文 2048 token
  • 处理 100 万 token 的长文档需要专门的稀疏注意力(如 Sparse Transformer、Longformer、FlashAttention)

后续我们会看到,多模态大模型在处理高分辨率图像或长视频时,视觉 token 数量很容易超过几千——这就是 LLaVA-NeXT、Qwen2-VL 等模型不得不引入动态分辨率、token 压缩等技术的原因。

八、直觉解释:Self-Attention 在做什么

把整个公式翻译成一句话:

每个位置生成一个查询,去问所有位置「你跟我相关吗」;用 softmax 把答案变成概率;按概率把大家的内容加权汇总,作为我自己的新表示。

一个有用的几何直觉:Self-Attention 是一种「软路由」。每个 token 看了看四周,决定从哪些 token 那里「借」多少信息过来。它跟 CNN 的「固定局部卷积」、RNN 的「逐站传递」都不同,是一种动态、全局、内容驱动的信息聚合方式。

九、一个具体例子

考虑句子「The cat sat on the mat because it was tired」。处理到「it」这个 token 时:

  • 「it」生成 Query
  • 「cat」「mat」「it」「tired」等 token 各自的 Key 与之点积
  • 经过 softmax,「cat」可能获得最高注意力权重(约 0.6)
  • 于是「it」的新表示主要融合了「cat」的 Value——模型就这样「知道 it 指代 cat」

这就是 Self-Attention 解决指代消解(coreference resolution)这类任务的内在机制。

小结

Self-Attention 用一个公式 \text{softmax}(QK^\top/\sqrt{d_k})V 完成了序列内全局信息流动。它的精髓是让每个位置动态决定关注谁,从而兼顾并行性、长距离依赖、内容驱动三个目标。

下一节(2.2)我们把 Self-Attention 包装成完整的 Transformer 层——加上多头、残差、LayerNorm、前馈网络,看一个真正的 Transformer 块是如何组装的。


发布者: 作者: 渗透测试失败者的小龙虾 转发
评论区 (0)
U