注意力可视化:解读 Transformer 的内部对齐

FreeGuideOnline 最新 2026-06-14

注意力可视化:解读 Transformer 的内部对齐

1. 为什么需要注意力可视化?

Transformer 模型凭借自注意力机制在自然语言处理中取得了巨大成功。然而,其内部运行机制就像一个黑箱——输入一段文本,输出一个结果,中间发生了哪些“对齐”和“聚焦”却难以理解。 注意力可视化正是打开这个黑箱的钥匙。通过将注意力权重绘制成图形,我们可以:

  • 验证模型是否学到了合理的语言结构(如主语-谓语对齐、指代消解)。
  • 诊断模型错误(某些头是否关注了无关词)。
  • 理解多头注意力的分工,不同头可能捕捉不同的语言特征。
  • 解释模型决策,为预测提供可读的证据。

本教程将带你从零开始,掌握 Transformer 注意力可视化的核心方法与解读技巧。

2. 什么是注意力权重?

在 Transformer 中,自注意力计算可以简化为:

Attention(Q, K, V) = softmax(QK^T / √d_k) V

对每个头,输入的序列中每个词都会与所有词计算一个“亲和度”分数(未归一化的相似度),经过 softmax 后得到一组和为 1 的权重。这些权重就是注意力权重,表示在当前位置编码时,应把多少“注意力”分配给其他词(包括自己)。

例如,在编码“猫 吃 了 它 的 猫粮”时,处理“它”这个词时,注意力权重可能会很高地分配给“猫”,表明模型学会了解析指代关系。

3. 可视化的基础工具与环境

进行注意力可视化,推荐使用 Hugging Face 的 Transformers 库配合 BertViz 这个专用可视化库。它可以展示单个头、层内所有头以及跨层的注意力模式。

安装:

pip install transformers bertviz

加载模型并获取注意力:

from transformers import AutoTokenizer, AutoModel
import torch

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name, output_attentions=True)

text = "The cat sat on the mat"
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)

attentions = outputs.attentions  # 元组,每层一个注意力权重张量
# 形状: (层数, 批大小, 头数, 序列长度, 序列长度)
print(f"层数: {len(attentions)}, 单层注意力形状: {attentions[0].shape}")

4. 注意力热图:逐头的对齐视图

最经典的可视化形式是注意力热图。横轴通常表示被关注的位置(Key),纵轴表示关注起始位置(Query)。每个单元格的颜色深浅代表权重高低。

使用 BertViz 绘制一个特定层的所有头:

from bertviz import head_view

head_view(attentions, tokenizer, sentence_a=text)

解读要点:

  • 对角线:词对自身的注意通常很强,尤其是底层。
  • 垂直条纹:某个词被几乎所有其他词关注(如分隔符 [SEP])。
  • 水平条纹:某个查询词广泛关注所有词(如句首 [CLS] 在分类任务中)。
  • 离散亮点:指向特定相关词,如指代、修饰关系。

5. 按层与按头的分析模式

5.1 不同层的不同角色

Transformer 的底层、中层和高层注意力通常表现出不同倾向:

  • 底层(1-4层):注意力较发散,多为局部窗口模式,词主要关注自身及其邻居;模型在提取基础语法特征。
  • 中层(5-8层):开始出现更长距离的依赖,如动词关注其主语或宾语,出现句法结构模式。
  • 高层(9-12层):注意力高度任务相关,可能聚焦于与分类或生成直接相关的关键词,模式更具语义抽象性。

用 BertViz 的 model_view 可以跨层对比:

from bertviz import model_view

model_view(attentions, tokenizer, sentence_a=text)

5.2 不同头的功能分化

即使在同一层,不同头也学出了互补的行为。常见功能头包括:

  • 前向头:每个词主要关注它右边的词(符合语言生成顺序)。
  • 后向头:主要关注左边的词。
  • 局部头:只关注邻近的 2~3 个词。
  • 分隔标记头:所有词都强烈关注 [SEP][CLS]
  • 代词消解头:“他/她/它”明确指向先行词。

通过可视化可以快速定位这些特殊行为的头。

6. 解读“内部对齐”:从图到语言洞察

学习可视化不只是画图,更重要的是把模式转化为对模型行为的理解。

  • 主语-谓语对齐:在编码动词时,注意力强地分配到对应主语的名词上,说明模型能抽取主谓关系。
  • 名词修饰共指:形容词注意力指向所修饰的名词(如“漂亮的”关注“花”)。
  • 无效锚定警报:如果所有头都强烈注意一个无意义的标点或高频虚词(“的”、“是”),可能暗示模型过拟合到表面统计,而没学到深层语义。
  • 跨句关联:在句子对任务中,注意从第二句的单词指向第一句的相关词,显示了推理链条。

构建一个自检问题列表:针对每条注意力热图问自己:

  1. 这个词应该关注哪些词?模型关注了吗?
  2. 是否出现不合理的强注意(如总是关注句号)?
  3. 不同头之间的分工是否清晰?
  4. 高层注意是否与任务目标一致?

7. 实践:用可视化调试一个分类任务

假设你微调了一个情感分类 BERT,想理解模型为何误判某句子。

步骤:

  1. 加载微调模型和文本。
  2. 获取注意力并可视化高层(最后 2~3 层)。
  3. 重点观察 [CLS] 标记的注意力分布,因为许多分类任务用它的输出做预测。
  4. 检查 [CLS] 是否过度关注某个与情感无关的词,或者完全忽略了情感关键词。

这可以帮助定位模型是否学到了错误的关联,进而通过数据增强或对抗训练修正。

8. 局限性与注意事项

注意力可视化极具洞察力,但也要避免过度解读:

  • 注意力 ≠ 解释:高注意力不一定意味着该词对预测有因果作用。它只是模型编码时权重分配的体现。
  • 注意力的不稳定性:不同随机种子、不同数据都可能改变具体模式。
  • 信息饱和的图:长序列时热图信息过载,需结合具体分析目标切片查看。
  • 注意力的可操纵性:注意力权重可以被攻击生成任意图案而不改变预测,所以不能单独作为可信赖的解释依据。

理性使用可视化:将其作为形成假说的工具,再结合消融实验或梯度方法进行验证。

9. 进阶探索方向

掌握了基本可视化之后,可以延伸到:

  • 跨模型对比:比较 BERT、RoBERTa 和 GPT-2 在相同文本上的注意力分布差异。
  • 跨语言分析:多语言模型如何在不同语言间对齐概念。
  • 动态注意力流:如 Transformer-XL 的循环记忆单元的长程注意传递。
  • 量化工具:使用注意力熵、稀疏度等指标批量描述头行为。

现在你已经具备了从黑箱模型中提取“注意力地图”并解读其内部对齐的能力。开始用你自己的数据试验,让 Transformer 的内部逻辑为你所见吧!