注意力机制

注意力根据当前查询为不同信息分配权重,再把它们组合成新的表示,是一种可学习的信息读取方式。

返回概念图谱 →

理解与应用

注意力机制用当前需要的信息来决定“从哪些位置读多少内容”。在常见的缩放点积注意力中,查询向量 Q 与各个键向量 K 计算匹配分数,分数按键的维度缩放后经过 softmax,得到总和为 1 的权重,再对值向量 V 做加权求和。Q、K、V 通常由输入表示经过学习得到的投影产生。

例如处理“报销单已退回,因为它缺少发票”时,“它”所在位置的表示需要结合前文,才能表达所指对象。注意力给这一位置提供了读取其他位置的途径:键参与匹配,值提供被带回的信息。这个例子只是帮助理解信息流向,实际网络不一定有一个专门识别代词指向的注意力头,也不能由词面直接确定权重。

查询、键和值来自同一序列时叫自注意力;如果查询来自一个序列,键和值来自另一个序列,就是交叉注意力的常见形式。多头注意力则在多个投影空间分别计算,再合并结果,使同一位置可以同时接收不同形式的信息。遮罩进一步规定哪些位置根本不能参与,比如填充位置或自回归预测中的未来位置。

注意力与只选一个搜索结果不同:即使第一项分数最高,其他项也可能参与输出。这种软聚合让信息可以组合,也可能把干扰内容混进来。某个权重很大,只能说明它在这一次加权计算中占比高,不能单凭一张热力图就断言它是最终回答的原因。

关系速览
Transformer 架构包含 →注意力机制

Transformer 的注意力子层用于按输入相关性混合表示;它不是模型全部结构。

动手试一试:算出两个位置各自贡献多少

向量由人工指定,计算本身使用缩放点积和 softmax。第一项获得较高权重,但结果仍受第二项影响;减去最高分后再取指数,是避免指数过大的一种数值实现方式。

将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。

Python 代码

from math import exp, sqrt
query = [1.0, 0.0]
keys = [[1.0, 0.0], [0.0, 1.0]]
values = [10.0, 20.0]
scores = [sum(q * k for q, k in zip(query, key)) / sqrt(2) for key in keys]
peak = max(scores)
unnormalized = [exp(score - peak) for score in scores]
weights = [weight / sum(unnormalized) for weight in unnormalized]
result = sum(weight * value for weight, value in zip(weights, values))
print("权重:", [round(weight, 3) for weight in weights])
print("加权结果:", round(result, 3))

运行结果

权重: [0.67, 0.33]
加权结果: 13.302

常见误区

  • 注意力权重并不是词语对最终答案的完整因果解释。
  • 注意力输出是加权组合,不等同于把最高分位置原样取出。
  • 遮罩错误会改变可见信息,训练时甚至可能让未来答案泄漏到当前位置。

前置与延伸

建议先读

相关概念

参考与版本

Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。

  • Attention Is All You Need ↗

    核对原论文的架构、缩放点积、多头注意力和因果遮罩;不由原论文推断所有现代模型的结构或模态。 · 核验:2026-10-10