编程与 AI11 分钟阅读更新于 2026-08-03

Attention 是什么:从相关性分数到加权信息

用一个具体句子理解注意力如何判断相关性、分配权重并汇总信息,再区分普通注意力、自注意力和交叉注意力。

相关工具

注意力到底在“注意”什么

Attention 可以先理解成一种信息分配方法:当模型正在处理一个位置时,它会查看其他位置,并判断哪些信息更相关。相关的位置得到更高权重,不太相关的位置得到较低权重,最后把这些信息按权重汇总,形成当前位置的新表示。

它和人阅读句子的方式有一点相似。看到“学习”这个词时,我们可能会关注“喜欢”“语言”等词,判断它们之间的关系;但这只是帮助理解的比喻,模型实际做的是向量计算,不是像人一样有意识地选择。

Transformer 相关概念 用代词指代来说明这个问题:句子中的 it 到底指向 animal 还是 street。自注意力让模型在处理 it 时可以同时参考句子中其他位置,而不是只依赖前一步传来的隐藏状态。

当前词根据相关性分数分配注意力权重并汇总信息的示意图
注意力的直观理解

当前词根据相关性给其他词分配不同关注权重,再把这些词的信息加权汇总。

它不是简单地挑出一个最相关的词

注意力通常不是从句子里挑一个词,然后把其他词全部丢掉。它会得到一组权重,并根据权重同时参考多个位置。某个词的权重可能是 0.5,另一个词是 0.3,其他词加起来是 0.2,最后的表示就是这些信息的加权组合。

这样做的好处是保留了上下文的细节。当前词可能同时需要知道主语、动作、时间和限定条件,只关注一个位置往往不够。权重分布让模型有机会根据任务,把不同来源的信息混合起来。

权重也不是固定的。相同的词放在不同句子里,前后文不同,相关性分数就可能不同。模型不是提前写好“某个词永远关注某个词”的规则,而是在输入和参数共同作用下计算当前关系。

从向量开始,而不是从词语本身开始

模型不能直接拿“我”“喜欢”“学习”这些汉字做乘法。输入文字会先经过分词,再通过词嵌入转换成向量。向量包含模型学习到的数值表示,注意力机制就在这些向量之间计算关系。

同一个词的向量不是完整含义的最终答案。它只是进入模型的起点,经过多层注意力和前馈网络之后,当前词的表示会不断吸收上下文。位置编码也会加入其中,帮助模型区分词语出现的先后。

因此,注意力图里的每个方格或箭头,表示的是向量之间的计算关系,不是把原文中的词直接连线。看图时要记住这层转换,才能避免把模型机制理解得过于拟人化。

Q、K、V 是三种不同的角色

在注意力计算中,输入向量会分别乘上三组训练得到的参数,得到 Query、Key 和 Value。它们来自同一批输入,却承担不同工作。理解这三个角色,比死记英文全称更重要。

Query 可以看成当前处理位置提出的问题,Key 可以看成每个位置提供的可匹配线索,Value 则是匹配成功后真正要带走的信息。当前 Query 和所有 Key 做比较,得到一组分数,再用这些分数决定从各个 Value 中汇总多少内容。

在自注意力里,Q、K、V 都来自同一个序列,所以每个位置既可以发起查询,也可以提供线索和内容。在编码器-解码器注意力里,查询通常来自解码器,Key 和 Value 来自编码器输出,两个序列的来源不同。

缩放点积注意力分成五步

第一步,把输入映射成 Q、K、V。第二步,用 Q 和 K 的转置做点积,得到当前查询与各个位置之间的相关性分数。第三步,除以 Key 的维度平方根,避免维度较大时分数过大。

第四步,对缩放后的分数使用 Softmax,把它们变成一组权重。权重一般为正,并且总和为 1,便于解释成“从不同位置取多少信息”。第五步,用权重对 V 做加权求和,得到注意力输出。

公式可以写成 Attention(Q, K, V) = softmax(QK^T / √d_k)V。公式的阅读顺序是:先比较 Q 和 K,再把分数变成权重,最后用权重汇总 V。不要把 Q、K、V 的计算顺序和文字顺序混在一起。

缩放点积注意力从 Q K V 到 Softmax 和加权汇总的计算流程
缩放点积注意力的计算流程

从生成 Q/K/V 到计算分数、归一化权重,再到加权汇总 Value。

为什么要先缩放再 Softmax

点积的数值会受到向量维度影响。维度越高,点积可能越大,分数之间的差距也可能被放大。直接把很大的分数送进 Softmax,容易得到过于尖锐的权重分布:某个位置几乎拿走全部权重,其余位置几乎没有影响。

除以 √d_k 的目的,是把分数拉回更稳定的范围,让 Softmax 不至于过早饱和。它不是为了改变“谁更相关”的方向,而是为了让训练过程更容易保持有效的梯度。

Softmax 本身也不是在判断事实真伪。它只是把一组分数变成相对权重。某个词得到高权重,说明在当前参数和输入下它与查询更匹配,不等于它就是唯一正确的解释。

普通注意力、自注意力和交叉注意力

Attention 是一个总称,表示查询根据 Key/Value 选择和汇总信息。Self-Attention 的特点是 Q、K、V 来自同一个序列,当前序列中的每个位置都可以参考同一序列的其他位置。

交叉注意力则让一个序列去查询另一个序列。原始 Transformer 的解码器会用自己的隐藏状态产生查询,再去参考编码器输出的 Key 和 Value。机器翻译时,正在生成的目标词可以据此找到输入句子中更相关的部分。

三者的核心计算形式相近,区别主要在 Q、K、V 的来源和可见范围。先问“查询来自哪里、被查询的内容来自哪里”,通常就能判断当前使用的是哪种注意力。

Attention、自注意力和交叉注意力的结构对比图
三种注意力的关系

普通注意力描述计算方式,自注意力在同一序列内部建立关系,交叉注意力连接两个不同序列。

注意力为什么能帮助理解长距离关系

在顺序模型里,句首信息要经过多个时间步才能影响句尾;在自注意力里,两个位置可以直接参与一次相关性计算。路径变短后,模型更容易把相距很远的词放在同一个关系判断中。

这不表示长句就一定能被正确理解。输入质量、训练数据、上下文长度和模型能力都会影响结果。注意力只是提供了更直接的信息交互方式,最终学会哪些关系,还要依靠大量训练和合适的任务目标。

如果输入很长,注意力计算的开销也会增加。后续模型会使用局部注意力、稀疏注意力、滑动窗口或其他优化,试图在信息范围和计算成本之间取得平衡。

看注意力图时要保持一点距离

注意力权重可以帮助观察模型在某一层、某个位置上关注了哪些内容,但它不是完整的解释报告。不同层、不同头可能关注不同关系,最终输出还会经过残差连接、前馈网络和后续层变换。

因此,不能仅凭某一张注意力图就断言模型“真正理解了”某个概念,也不能把高权重直接当成因果证明。更稳妥的做法是结合输入、输出、对照样本和任务结果一起检查。

学习 Attention 时,最应该掌握的是一条可复述的计算链:当前表示产生查询,与其他位置的线索比较,得到权重,再从对应内容中汇总信息。理解这条链,后面学习多头注意力和掩码就有了基础。

一条适合初学者的注意力学习顺序

先用一句话理解“当前词参考其他词”,再把相关性分数、权重和加权求和分开。等这三个概念稳定后,再看 Q、K、V 的向量来源和缩放点积公式。

接下来区分自注意力和交叉注意力,观察它们的 Q、K、V 分别来自哪里。最后再学习掩码、多头注意力和不同层之间的表示变化。每一步都用一个小例子验证,而不是只背定义。

Attention 看起来像一个公式,真正难的是把公式和语言任务对应起来。只要能回答“谁在查询、查询谁、取回什么、为什么这样分配权重”,就已经抓住了它的主干。

Attention 的四个理解入口
步骤 1
当前词

先确定当前正在生成或编码的是哪个位置。

步骤 2
相关性

理解 Query 如何与不同 Key 比较并得到分数。

步骤 3
关注权重

理解 Softmax 如何把分数变成相对权重。

步骤 4
信息汇总

理解权重如何作用于 Value,形成新的表示。

常见问题

Attention 是不是只关注一个最重要的词?

通常不是。它会得到一组权重,并按不同程度参考多个位置,再把这些位置的 Value 加权汇总。

为什么 Q、K、V 要分成三种向量?

它们让查询、匹配线索和被汇总的信息承担不同角色。同一输入经过不同参数变换后,可以更灵活地计算关系和传递内容。

自注意力和交叉注意力最简单的区别是什么?

自注意力的 Q、K、V 来自同一个序列;交叉注意力通常让一个序列产生 Q,去查询另一个序列提供的 K 和 V。