开始前,会这些就够了
- 理解向量和加权平均
- 知道 softmax 把分数转成概率式权重
遇到不熟悉的词,先看这 2 个解释
- 上下文
- 模型在当前计算中能够利用的输入信息。文本生成时,通常包括系统要求、选入的历史消息、检索材料和已生成文本;能同时容纳的容量通常按词元数限制。
- 注意力
- 模型按当前需要,给可读取的信息分配不同权重,再把这些信息的数值表示合在一起。常见实现用查询与键计算权重,用值参与汇总,属于模型内部的一种计算。
看到注意力热力图时,很容易说“模型重点读了这一句”。这句话有一点直觉价值,却容易把数值计算想成人的阅读过程。一次注意力计算得到的是信息的加权混合,不是人工判断出的正确来源,也不是一份完整的推理说明。
下面用三个位置的数值做缩小实验。我们直接给出匹配分数,暂时省掉分数如何由模型算出,只观察权重、值和读取限制怎样共同决定结果。
分数最高,也可能不参与计算
三个位置的匹配分数固定为 2、1、9。先保持第三个位置不参与,改变它的值,再允许它参与,比较两次输出。
| 位置 | 分数 | 值 | 权重 | 贡献 |
|---|---|---|---|---|
| 1 | 2 | 10 | 0.731 | 7.311 |
| 2 | 1 | 20 | 0.269 | 5.379 |
| 3(屏蔽) | 9 | 999 | 0.000 | 0.000 |
把各项贡献相加,输出为 12.689。
值简化为单个数字,权重使用允许位置的 softmax。显示结果保留三位小数;这不是完整 Transformer,也没有把权重解释为事实可信度。
查询用来匹配,值用来参与计算
标准注意力里,查询 Query 表达当前要比较的特征,键 Key 提供各位置供匹配的特征,值 Value 是随后被混合的信息。三者都是向量,不一定分别对应一句可直接读懂的人话。查询与键产生分数,分数转成权重,再用权重对值加权求和。
因此,分数高的含义只是当前这次计算给它较大权重。真正进入结果的还取决于值是什么,以及后续层如何处理。多头注意力会有多组这样的计算,不能把某一个头的图直接当成整个模型的唯一阅读顺序。这里借用“读重点”,只是在说明不同位置的贡献权重不同。
被屏蔽的位置,分数再高也不能读
实验给三个位置分数 2、1、9,值为 10、20、999,但只允许读取前两个。先屏蔽第三个,再对允许位置计算 softmax,最后求加权和。这样即使第三个分数最大,也不会进入结果;把它的值改得更大,不应改变本次输出。
这是单次、单组权重的教学计算,值也被简化成一个数。它展示掩码限制连接的作用,不模拟完整 Transformer。自回归自注意力常允许当前位置读取自身及更早的位置;未来位置被屏蔽的规则,与模型训练时共享参数如何更新,是不同层面的事情。
import math
scores = [2.0, 1.0, 9.0]
values = [10.0, 20.0, 999.0]
allowed = [True, True, False]
if not any(allowed):
raise ValueError("this demo needs an allowed position")
peak = max(s for s, ok in zip(scores, allowed) if ok)
weights = [math.exp(s - peak) if ok else 0.0
for s, ok in zip(scores, allowed)]
total = sum(weights)
weights = [w / total for w in weights]
output = sum(w * v for w, v in zip(weights, values))
print("weights", " ".join(f"{w:.3f}" for w in weights))
print("output", f"{output:.3f}")
怎样运行:Python 3.10+;保存为 attention_demo.py,在该目录运行 python attention_demo.py。只用标准库,无需联网。
运行后对照结果
weights 0.731 0.269 0.000
output 12.689一个权重,不能包办事实与解释
加权求和混合的是数值特征,不是按比例复制来源文字。即使某段原文占较大权重,后续模型也可能生成超出原文支持的结论;反过来,某个头里权重较小,也不能单独证明这个位置对最终输出不重要。模型还包含其他头、残差连接和后续计算。
研究者曾在多项 NLP 任务中发现,不同注意力分布也可能产生相近预测。这提醒我们不能只凭一张热力图认定“模型就是因为这个词才这样答”。它不等于宣布所有注意力分析都没价值,而是要求解释结论有额外实验支持,并限定到具体模型与任务。
用于学习时,可以固定权重改值,再固定值改掩码,分别观察结果;用于研究时,还需要明确想检验的假设和干预方法。热力图适合提供线索,事实核对仍需要资料,权限控制仍需要应用规则。把这些职责分开,既能利用注意力的直觉,也不会把它误当成人的意识或可信度评分。
记住这三点
- 注意力由匹配分数生成权重,再对值进行数值混合。
- 掩码限制允许读取的位置,不能仅凭原始分数判断参与结果的位置。
- 单个注意力权重或热力图不是完整的因果解释或事实证明。
别把例子用过头
- 代码省略 Q
/K投影、维度缩放、多头和后续层,只观察加权与掩码。 - 关于解释能力的研究结论有任务范围,不能概括成所有注意力可视化都无用。
自己试一小步
怎样区分权重、值与允许读取范围对结果的影响?
- 保持其他输入不动,只修改第三个被屏蔽位置的值。
- 恢复原值,再只改变前两个允许位置的值。
- 最后修改 allowed,先预测哪些位置会参与,再运行检查。
做到这些,就算完成
- 每轮只改变一个因素。
- 能说明输出变化来自权重还是值,而不是笼统说模型更重视了某段话。
- 结论没有越过单次教学计算的范围。
查原始资料
想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。
- Attention Is All You Need (新标签页)↗
已查看 PDF 第 3.2 节,核对 Q
/K/V、加权求和、多头及非法连接掩码。 - 动手学深度学习:注意力提示 (新标签页)↗
查询、键、值和注意力汇聚的中文教学解释。
- Attention is not Explanation (新标签页)↗
注意力权重未必与其他重要性量度一致,不同分布可能产生相近预测的实证边界。
找一份资料继续练
先选一项,按下面的范围继续学;不必从头读完整门课程。
神经网络与深度学习(课程配套开放教材) (新标签页)↗
只选注意力章节,用三个位置的小输入核对权重怎样参与加权计算,不把权重大小直接解释成答案依据。
查看学习准备与访问说明 →