你可能也这么以为过:Transformer 里的注意力权重,就是模型在看输入哪里。我最早也这么想,甚至拿热力图去发过朋友圈。直到有一天我做了个实验:把一个注意力头完全掩盖,模型的输出几乎没变化;但另一个头,明明注意力分数很低,把它砍掉后结果崩了。我才意识到,注意力权重被高估了。

问题出在一个基本机制上。注意力层不是一个简单的选词。每个 token 会先算一组注意力权重,然后用这组权重对所有位置经过线性变换后的 value 向量做加权求和。权重只是阀门的开合度,真正传递信息的是经过变换后的内容。同一个阀门,后面接的水管粗细不同,实际流量就差很多。关于这个结构的原始定义,可以看Vaswani 等人的 Transformer 论文。
更麻烦的是,Transformer 还有残差连接。每一层的输出是上一层的表示 + 注意力结果 + MLP 结果。这意味着信息可以从多层之间绕来绕去,根本不会沿着注意力权重画出的'最短路径'走。
注意力归因矩阵:把层层变换摊开算总账
所以我们需要一个不同的矩阵——不是单层注意力权重,而是输入端每个 token 对输出端每个位置的总影响力。这种矩阵就是注意力归因矩阵。它的核心思想是:要么沿着注意力边逐层累积,要么用梯度直接测量敏感度。
路线一:Attention Rollout——把注意力矩阵连乘起来
2020 年的论文Quantifying Attention Flow in Transformers提出了一个相当直观的方法。他们假定:信息通过注意力连接从一层传到下一层,就像水流过树状管道。那么,把每层的注意力矩阵乘起来,就能得到端到端的流动矩阵。
- 把每一层的多头注意力权重平均成一个矩阵,并加上残差连接对应的单位矩阵,得到该层的'转移矩阵'。
- 从第一层开始,每往后一层,就把当前累积矩阵跟这一层的转移矩阵做矩阵乘法。
- 处理到最后一层,得到最终矩阵,就是每个 token 对每个位置的累积贡献得分。
矩阵乘法这个操作我一开始没想通,后来明白:在第 n 层,某个位置的信息可能来自第 n-1 层的很多位置,而这些位置又来自第 n-2 层……逐层累乘,自然就能追溯到源头。所谓'路径积分'。
但 Attention Rollout 有个硬伤:它只用了注意力权重,完全忽略 value 矩阵和 MLP 带来的变化。等于说,它假设信息流过每个注意力头时不会被放大或扭曲,只是按比例分叉。显然这在真实模型里不成立。
路线二:用梯度做归因——Attention Attribution
更好的办法是直接问:如果把某个源 token 的表示变动一点点,最终输出会变多少?这个变化率就是梯度。把梯度沿从基线到实际输入的路径做积分,就得到每个组件的'责任',这种方法叫积分梯度(Integrated Gradients)。
应用到 Transformer 上,就是对每个注意力头或每个 token 的输入计算积分梯度,然后把各层的归因值聚合起来。这样得到的矩阵不仅考虑了注意力权重,还包含了 value 变换和 MLP 的效应,因为梯度是通过整条计算图反向传播的。
一张表说清三种'注意力'的区别
| 方法 | 是否跨层累积 | 是否考虑值变换 | 计算代价 | 解释力 |
|---|---|---|---|---|
| 注意力权重 | 否 | 否 | 低 | 局部近似 |
| Attention Rollout | 是 | 否 | 中 | 路径近似 |
| 注意力归因(积分梯度) | 是 | 是 | 高 | 完整敏感度 |
这些方法真的可靠吗?我踩过的坑
我第一次用 Rollout 看 BERT 的结果时,觉得好合理,浅层看句法,深层看语义。后来读了两篇批评性论文,才冷静下来。Attention is not Explanation指出:注意力权重与大部分归因方法在任务上的一致性很低。你在热力图里看到的红块,完全可能只是模型计算的一个无关紧要的步骤。
即便换成积分梯度,也远非完美。归因是'局部敏感度',不是'因果必要性'。你删掉一个被归因很高的 token,模型可能照样预测正确,因为信息在残差流里本来就冗余。换句话说,归因矩阵告诉我们'该位置参与拉动预测杠杆',但没说'这个杠杆非它不可'。
真正能追踪信息路径的,不是矩阵,而是电路
如果你要问'信息到底走了哪条具体路径',矩阵类方法只能给你一个全局的汇总。要看见个别的'信息高速公路',需要换一种工具。Transformer Circuits 框架从残差流抽象里提出了另一种视角:把注意力头和 MLP 看作是对残差流这个共享车厢的读写操作,信息流动是可组合的。
这套框架做了非常细的电路分解,能具体到'第 5 层第 3 个头复制了主语,第 11 层第 7 个头把这些信息移动到宾语位置'。但它需要人工介入和启发式剪枝,没法像归因矩阵那样一键输出一个干净的矩阵。两者正好互补:归因矩阵适合全局扫描,电路分析适合局部深挖。
所以,注意力归因矩阵在什么时候真正有用?
我的判断是:它适合用来做诊断和筛选,不适合作为因果证据。比如你想知道某个模型在句子中是否过度依赖少见词,用归因矩阵能迅速圈出关键 token;你想判断一个注意力头是否有害,用归因分数排序再逐一删掉验证,比盲目暴力搜索高效得多。
但它不能回答'为什么模型依赖这个词'——因为归因矩阵丢掉了非线性交互的所有细节。别指望它能给你一个人可理解的解释,它只是一个计算指标。
凡是以'注意力归因'命名的矩阵,都不是来自模型内部,而是我们对模型的一种外部探针。探针总会宽恕一些我们不希望看到的偏差,也会漏掉一些隐藏在抵消效应下的关键路径。
下一步该往哪走
如果你也在做模型可解释性,我建议把注意力归因矩阵作为第一步,然后用因果路径修补(path patching)技术去验证它给出的高影响路径。Transformer Circuits 网站上有一系列实操教程,能帮你把抽象矩阵变成具体电路。信息的路径,比你想的更长,也更颠簸。矩阵只是那盏路灯,最后的终点还是要你自己走过去。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/692.html