
系列:开源 AI 论文复现实验与代码解读
日期:2026-08-25
适合读者:研究生、科研新人、希望把 Transformer 内部诊断做扎实的工程读者
检索日期:2026-08-25
摘要
Attention 热力图很容易让人产生一种错觉:颜色越亮,那个 token 就“解释”了模型为什么这样预测。这个说法只对了一半。热力图确实展示了某一层、某个 head 在 softmax 后给不同 Key 位置分配的权重;但它通常不能单独证明输入特征对最终输出的因果贡献。本文的复现目标不是下载一个大模型展示漂亮截图,而是把注意力矩阵的来源、形状、可视化协议和解释边界拆清楚:先用最小脚本生成可检查的 toy attention,再对照 BERTViz、Hugging Face 输出格式和解释性论文,建立一套“能看、会疑、可复查”的实验记录。
本次实际验证受限于本地环境:torch、numpy、matplotlib 均未安装,因此没有运行真实 BERT 或导出 toy PNG 热力图;配套脚本的标准库形状与 mask 检查已通过,图像导出路径需安装依赖后人工核验。文章所需的正式封面和方法图已用内置 imagegen 补齐,并完成视觉检查。
目录
- 为什么 Attention 图值得复现
- 热力图到底画的是什么
- 最小代码:从 score 到矩阵
- 官方工具怎么读:BERTViz 与 Transformers
- 解释边界:诊断不等于因果
- 评测协议与失败排查
- 可以继续研究的问题
- 总结与参考资料
为什么 Attention 图值得复现
注意力机制最初的吸引力之一,是它把序列中“谁看谁”的关系变成了一个概率分布。《Attention Is All You Need》中的 scaled dot-product attention 会对 Query 与所有 Key 的相似度做归一化,再用这些权重加权 Value。于是研究者自然想把权重画成矩阵:行是 Query token,列是 Key token,颜色越深表示该 Query 越多地使用该 Key 的 Value。
这张图的复现价值在于调试,而不是美化论文。对工程读者来说,它能快速暴露三类问题:mask 是否写反,padding 位置是否仍被关注,某些 head 是否退化为只看自己或只看特殊符号。对研究生来说,它是一种提出假设的入口:如果某个 head 总是关注分隔符,它可能承担句边界聚合;如果某个 head 常看相邻位置,它可能近似局部卷积。但这些都只是可检验假设,不是最终解释。
本文把目标限定为“可视化协议复现”。我们不声称复现 BERT 论文中的语法 head 数字,也不把 toy 结果外推到真实语言模型。可信的复现记录应先回答:矩阵从哪里取、形状是什么、softmax 维度是否正确、图中颜色是否保留了数值含义、结论是否经过替代归因方法或干预实验对照。
热力图到底画的是什么
Transformer 自注意力的核心公式是:
$$ A=softmax\left(\frac{QK^T}{\sqrt{d_k}}+M\right) $$
$$ O=AV $$
其中 Q、K、V 分别是 Query、Key、Value;若 batch 大小为 B,序列长度为 T,head 数为 H,每个 head 维度为 D,则 QK^T 的形状是 [B,H,T,T]。最后两个维度最重要:第一个 T 是正在提问的 Query 位置,第二个 T 是可被查看的 Key 位置。M 是 mask,通常在 softmax 前把不可见或 padding 的 Key 加上极小值。
热力图画的是 A 中某一层、某个 head、某个样本的 [T,T] 切片。它不是 embedding 相似度图,也不是梯度图,更不是 token 重要性排行榜。因为最终输出 O 还会经过 Value 向量、输出投影、残差连接、LayerNorm、前馈网络以及后续层。一个 Key 获得高权重,只说明它的 Value 被当前 Query 位置较多混入;它是否推动了最终分类 logit,还要看后续计算。
Hugging Face Transformers 的模型输出文档也把 attentions 描述为每层一个张量,形状为 [batch_size, num_heads, sequence_length, sequence_length],并说明它是 attention softmax 后用于加权平均的权重。这一定义适合作为工程复现实验的接口契约:若你的可视化工具期望同样布局,就能和大多数 Hugging Face 模型对接。

最小代码:从 score 到矩阵
配套脚本位于 code/attention_visualization_toy.py。它不下载模型,也不依赖 PyTorch 计算图,只用标准库构造一组 token、手写 Q/K 向量、计算 scaled dot-product score,并对 [PAD] 列施加 mask。默认检查命令是:
python3 code/attention_visualization_toy.py --check-only
脚本会打印 token 列表、矩阵形状、每行 softmax 是否求和为 1、被屏蔽的 [PAD] 列最大概率是否为 0。这个检查比一张图更基础:如果行和不是 1,说明 softmax 维度或数值稳定性有问题;如果 padding 列不是 0,说明 mask 语义可能写反;如果形状不是 [T,T],说明 Query/Key 维度已经混乱。
安装 matplotlib 后可以导出一个教学热力图:
python3 -m pip install -r code/requirements.txt
python3 code/attention_visualization_toy.py --out-dir code/outputs --save-png
这张图只能说明绘图管线可用,不能说明任何真实模型行为。真实复现时,应把 toy 矩阵替换为模型返回的 outputs.attentions[layer][batch, head],同时保存模型名、revision、tokenizer 版本、输入文本、特殊 token、是否启用 dropout、设备和随机种子。
官方工具怎么读:BERTViz 与 Transformers
BERTViz 是 Jesse Vig 发布的开源 Transformer attention 可视化工具,对应 ACL 2019 系统演示论文。它提供 head view、model view 和 neuron view:head view 适合看单层单头的 token 对齐,model view 适合概览多层多头,neuron view 则进一步追踪 Query 与 Key 向量中特定维度如何贡献 attention score。阅读它的官方仓库时,应先看 README 的数据流:加载 Hugging Face 模型,设置 output_attentions=True,tokenize 输入,运行模型,取出 attention,再把 tokens 与 attention 传给 model_view 或 head_view。
这条路线提醒我们,可视化工具不是“解释器”,而是一个交互式张量浏览器。BERTViz 仓库也明确提示,attention 权重不一定是预测解释;长输入或大模型还会带来响应速度和可视化规模问题。工程复现时不要一次显示所有层和所有头,而应先选择少量输入、固定层头、保存截图和原始矩阵,再逐步扩大范围。
Hugging Face 文档提供了另一个关键约束:模型输出中的 attentions 是 tuple,每层一个张量。不同模型可能有 encoder attention、decoder attention 和 cross attention;句子对任务还会涉及 token type 和特殊符号。如果没有把 token 列表与矩阵轴严格对齐,热力图的行列标签就会错位,后续解释全部失效。
解释边界:诊断不等于因果
Jain 与 Wallace 在 NAACL 2019 的《Attention is not Explanation》中直接挑战了“attention 等于解释”的常见说法。他们报告,学习到的 attention 权重经常与梯度类特征重要性不相关,而且可以找到很不一样的 attention 分布,却产生近似相同的预测。这并不意味着 attention 图毫无价值,而是说明标准 attention 权重不能自动升级为因果解释。
Clark 等人在 BlackboxNLP 2019 对 BERT attention 做了更细的观察:一些 head 会关注分隔符、固定位置偏移或广泛分布,也有 head 与句法、共指等语言现象对应得较好。这里的关键是“对应”与“导致”不同。一个 head 看起来像句法关系,说明模型内部存在可诊断模式;若要证明它对预测必要,还需要遮蔽、置换、head ablation、counterfactual input 或梯度归因等实验。
Captum 这类解释工具提供了另一种视角:它关心某个输出标量相对于输入特征的归因,例如 Integrated Gradients 会沿基线到输入的路径积分梯度。注意力热力图和梯度归因回答的问题不同:前者问“这个模块如何混合 Value”,后者问“输入变化如何影响某个输出”。可信分析最好把两者并列,而不是用其中一个替代另一个。
评测协议与失败排查
Attention 可视化复现至少应记录六项协议。
| 检查项 | 记录内容 | 常见失败 |
|---|---|---|
| 输入 | 原文、token、特殊符号 | WordPiece 后标签错位 |
| 张量 | layer、head、shape | [B,H,T,T] 轴顺序读错 |
| mask | padding 或 causal 规则 | True/1 语义写反 |
| 数值 | 行和、最大值、熵 | softmax 维度错误 |
| 图像 | colormap、归一化范围 | 每张图独立缩放导致误读 |
| 结论 | 诊断、推断、实测区分 | 把亮色格子当因果证据 |
最常见的失败是轴读反。许多图默认把 x 轴画在下方、y 轴画在左侧,但论文或工具可能把 Query 和 Key 的方向说法不同。写文章时必须明确“行是 Query,列是 Key”,并用一个手工构造的矩阵验证方向。
第二类失败是颜色归一化。若每个 head 单独按最大值归一化,弱信号也可能显得很亮;若所有层统一色标,局部结构又可能不明显。科研报告中最好保存原始数值,并说明色标策略。
第三类失败是选择性展示。只挑一张符合叙事的 head 图,很容易制造故事。更稳妥的做法是先定义选择规则,例如固定第 6 层第 3 头,或按熵、对角线权重、特殊 token 权重排序,再报告多个样本。
第四类失败是把模型处于训练态。dropout 会让 attention 权重不稳定;正式可视化前应切到 eval 模式,并记录版本和 seed。本次脚本没有运行真实模型,因此这些真实模型结论均标注为待人工核验。
复现实验记录还应避免“截图即数据”。建议每次可视化同时保存三份材料:一份 JSON 或 CSV 原始矩阵,一份带 token 标签的 PNG,一份简短日志说明输入、模型、层、头、色标范围和选择理由。PNG 适合阅读,矩阵适合复查,日志适合让他人在一个月后知道你当时到底画了什么。若只保存 notebook 输出,后来模型权重、tokenizer 或依赖版本变化时,很难判断差异来自模型行为还是环境漂移。
对于论文报告,最好把结论分成三档。第一档是直接观测,例如“该 head 在这个样本上对 [SEP] 分配了最高权重”。第二档是统计描述,例如“在 200 个样本中,该 head 的分隔符平均注意力更高”。第三档才是解释性推断,例如“该 head 可能承担句边界聚合功能”。只有第三档需要格外谨慎,最好配合 ablation 或替代归因方法;否则读者会把一个可视化现象误读成机制证明。
可以继续研究的问题
- 对同一输入,attention 权重、Integrated Gradients、occlusion 和 head ablation 的排序一致性有多高?
- 哪些 head 的模式跨样本稳定,哪些只是在个例图中看起来有解释性?
- 如果遮蔽最高权重连接,输出变化是否显著大于遮蔽低权重连接?
- 长上下文模型中,attention 可视化是否能帮助诊断 lost-in-the-middle,还是会被稀疏和高效 attention 后端限制?
- 多模态模型的 cross attention 图能否对应图像区域证据,还是同样需要干预实验验证?
这些问题的共同点是:先把可视化变成可复现测量,再讨论解释。热力图是研究入口,不是结论本身。
总结
Attention 热力图最适合承担三件事:检查实现、发现模式、生成假设。它可以告诉我们某层某头如何分配权重,也能帮助定位 mask、token 对齐和特殊符号依赖问题。但它不能单独回答“模型为什么预测这个类别”。从复现角度看,最重要的不是画出漂亮矩阵,而是保存原始 attention、明确 Query/Key 方向、固定可视化协议,并把论文报告、本次实际验证和作者推断分开。
本文的最小脚本已完成标准库 smoke test;正式配图已补齐并通过检查。下一步若要扩展成真实模型复现实验,应在安装依赖后运行 toy heatmap 导出命令,再接入 Hugging Face 模型的 output_attentions=True 输出,保存原始矩阵、PNG 和协议日志。
参考资料
检索日期:2026-08-25。以下链接优先采用论文页面、官方仓库或官方文档;动态文档和仓库内容可能更新,正式实验应记录访问日期、模型 revision 与本地依赖版本。
- Ashish Vaswani et al., Attention Is All You Need, arXiv 2017,当前 arXiv 页面显示 v7 修订于 2023-08-02。
- Sarthak Jain and Byron C. Wallace, Attention is not Explanation, NAACL 2019。
- Kevin Clark et al., What Does BERT Look at? An Analysis of BERT’s Attention, BlackboxNLP 2019。
- Jesse Vig, A Multiscale Visualization of Attention in the Transformer Model, ACL System Demonstrations 2019。
- Jesse Vig, BERTViz official repository,attention 可视化工具与示例。
- Hugging Face, Transformers model outputs documentation,
attentions输出格式说明。 - Captum, Model Interpretability for PyTorch API,梯度、扰动和层归因方法索引。