qinghuan
← 回到知识探索

AI 直觉 / 动手实验

注意力是在“读重点”,还是混合数字?

用三个候选位置做加权实验,理解注意力能读取什么,以及权重为何不是完整解释。

展开本文目录
  1. 先动手看看
  2. 查询用来匹配,值用来参与计算
  3. 被屏蔽的位置,分数再高也不能读
  4. 一个权重,不能包办事实与解释
  5. 记住这三点
  6. 别把例子用过头
  7. 自己试一小步
  8. 查原始资料
  9. 找一份资料继续练
开始前,会这些就够了
  • 理解向量和加权平均
  • 知道 softmax 把分数转成概率式权重
遇到不熟悉的词,先看这 2 个解释
上下文
模型在当前计算中能够利用的输入信息。文本生成时,通常包括系统要求、选入的历史消息、检索材料和已生成文本;能同时容纳的容量通常按词元数限制。
注意力
模型按当前需要,给可读取的信息分配不同权重,再把这些信息的数值表示合在一起。常见实现用查询与键计算权重,用值参与汇总,属于模型内部的一种计算。
打开完整术语小抄 ↗

看到注意力热力图时,很容易说“模型重点读了这一句”。这句话有一点直觉价值,却容易把数值计算想成人的阅读过程。一次注意力计算得到的是信息的加权混合,不是人工判断出的正确来源,也不是一份完整的推理说明。

下面用三个位置的数值做缩小实验。我们直接给出匹配分数,暂时省掉分数如何由模型算出,只观察权重、值和读取限制怎样共同决定结果。

分数最高,也可能不参与计算

三个位置的匹配分数固定为 2、1、9。先保持第三个位置不参与,改变它的值,再允许它参与,比较两次输出。

允许参与本次计算的位置
先决定能否读取,再计算权重与贡献
位置分数值权重贡献
12100.7317.311
21200.2695.379
3(屏蔽)99990.0000.000

把各项贡献相加,输出为 12.689。

值简化为单个数字,权重使用允许位置的 softmax。显示结果保留三位小数;这不是完整 Transformer,也没有把权重解释为事实可信度。

查询用来匹配,值用来参与计算

标准注意力里,查询 Query 表达当前要比较的特征,键 Key 提供各位置供匹配的特征,值 Value 是随后被混合的信息。三者都是向量,不一定分别对应一句可直接读懂的人话。查询与键产生分数,分数转成权重,再用权重对值加权求和。

因此,分数高的含义只是当前这次计算给它较大权重。真正进入结果的还取决于值是什么,以及后续层如何处理。多头注意力会有多组这样的计算,不能把某一个头的图直接当成整个模型的唯一阅读顺序。这里借用“读重点”,只是在说明不同位置的贡献权重不同。

被屏蔽的位置,分数再高也不能读

实验给三个位置分数 2、1、9,值为 10、20、999,但只允许读取前两个。先屏蔽第三个,再对允许位置计算 softmax,最后求加权和。这样即使第三个分数最大,也不会进入结果;把它的值改得更大,不应改变本次输出。

这是单次、单组权重的教学计算,值也被简化成一个数。它展示掩码限制连接的作用,不模拟完整 Transformer。自回归自注意力常允许当前位置读取自身及更早的位置;未来位置被屏蔽的规则,与模型训练时共享参数如何更新,是不同层面的事情。

小实验 · python
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 投影、维度缩放、多头和后续层,只观察加权与掩码。
  • 关于解释能力的研究结论有任务范围,不能概括成所有注意力可视化都无用。

自己试一小步

怎样区分权重、值与允许读取范围对结果的影响?

  1. 保持其他输入不动,只修改第三个被屏蔽位置的值。
  2. 恢复原值,再只改变前两个允许位置的值。
  3. 最后修改 allowed,先预测哪些位置会参与,再运行检查。

做到这些,就算完成

  • 每轮只改变一个因素。
  • 能说明输出变化来自权重还是值,而不是笼统说模型更重视了某段话。
  • 结论没有越过单次教学计算的范围。

查原始资料

想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。

  • Attention Is All You Need (新标签页)↗Vaswani 等,NeurIPS 2017 · 英文

    已查看 PDF 第 3.2 节,核对 Q/K/V、加权求和、多头及非法连接掩码。

    论文及 PDF 公开;本篇没有复刻完整模型或报告训练结果。

  • 动手学深度学习:注意力提示 (新标签页)↗《动手学深度学习》作者团队 · 中文

    查询、键、值和注意力汇聚的中文教学解释。

    作者维护的开放教材,页面包含多个框架代码;本篇只采用概念,不安装其依赖。

  • Attention is not Explanation (新标签页)↗Jain 与 Wallace,NAACL 2019 / ACL Anthology · 英文

    注意力权重未必与其他重要性量度一致,不同分布可能产生相近预测的实证边界。

    公开论文页面;结论限定其研究问题,不推广成所有解释方法都无效。

找一份资料继续练

先选一项,按下面的范围继续学;不必从头读完整门课程。