从 Token 到 Transformer · 06 / 10
“小林把报告交给陈老师,因为他明天要出差。”
读到“他”时,我们会回看前文,判断它更可能指向谁。模型也需要把当前位置与其他位置联系起来,但它没有一个写死的语法回看规则。Attention 提供的是一套可训练的信息路由:当前 token 发出查询,与其他 token 匹配,再把有用信息按权重取回来。
“注意力”这个译名容易让人联想到人类意识。更准确的工程描述是:根据当前表示,动态计算位置之间的加权信息交换。
三步完成一次信息汇聚
对序列中的每个位置,模型从当前 hidden state 生成 Query、Key 和 Value。先暂时把它们理解为查询、索引和内容。
Scaled dot-product attention 可以写成:
textAttention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V
这行公式包含三步。
- 打分:Query 与所有 Key 做点积,得到当前位置和其他位置的匹配程度;
- 归一化:除以
sqrt(d_k)稳定数值,再用 softmax 把分数变成权重; - 汇聚:用这些权重对 Value 加权求和,形成当前位置的新上下文表示。
输出不是“选中了某个词”,而是多个位置 Value 的混合。权重可以很集中,也可以分散到标点、局部短语和更远的依赖上。
Self-attention 的“Self”是什么
Self-attention 中,Q、K、V 都来自同一段序列的当前表示。每个位置既提出问题,也向其他位置提供可匹配的索引和可取回的内容。
Cross-attention 则让 Query 来自一组表示,Key 和 Value 来自另一组表示。原始 Transformer 的解码器用它读取编码器输出;多模态模型也可以用类似方式让文本查询图像特征。
两者共享同一种计算,差别在于信息从哪里来。
Mask 决定哪些关系不允许出现
Attention 不是对所有位置无条件开放。模型会在 softmax 之前加入 mask,把某些分数设为不可选。
- Padding mask 屏蔽为了批次对齐而补出的空位;
- Causal mask 阻止生成模型看到未来 token;
- 其他结构化 mask 可以限制局部窗口或特定连接。
对 GPT 这类自回归模型,causal mask 至关重要。训练时整段答案虽然同时存在于张量中,但每个位置只能使用它左侧的内容,否则模型会偷看正确答案。
Attention 为什么改变了序列建模
RNN 必须沿序列逐步传递状态,远距离信息要经过很多步才能抵达。Self-attention 可以在一层中直接建立任意两个可见位置之间的连接,而且整段序列在训练时能够并行计算。
这带来两个重要能力:
- 关系不是固定窗口,而是随输入动态变化;
- 远距离 token 不必经过一条很长的递归链路才能交换信息。
但“能直接连接”不等于“必然找得准”。模型仍然需要训练数据教会它哪些连接有用,长上下文中也会出现注意力稀释和检索失败。
它为什么昂贵
标准全量 attention 要构造位置两两之间的分数矩阵。序列长度为 N 时,矩阵大小约为 N x N。这也是上下文扩大后计算与显存迅速增长的主要原因之一。
FlashAttention 改善了内存访问与实际效率,滑动窗口、稀疏注意力等方法减少需要计算的连接,但这些是对实现或连接模式的优化,并没有让所有长文本问题自动消失。
Attention 权重就是解释吗
权重能展示某一层、某个头在一次前向计算中的路由分布,但不能直接等同于模型的因果解释。信息还会经过多头混合、残差路径、FFN 和后续层;改变某个权重是否会改变最终输出,需要额外干预验证。
把 attention map 当作调试线索是有价值的,把它当作“模型为什么这样回答”的完整证据则过于乐观。
小结
Attention 的核心不是模仿人类“注意”,而是让每个位置根据当前输入动态选择信息来源。Query 与 Key 决定取多少,Value 决定取回什么,mask 决定哪些关系根本不允许。
下一篇会把 Q、K、V 单独拆开。它们不是为了让公式显得复杂,而是刻意把“怎么匹配”和“传递什么”分成了不同的可学习通道。
