Attention 可视化的局限性:注意力权重不等于特征重要性——为什么不能直接看 Attention Map

我最早也干过这件事:跑一个文本分类模型,在测试集上画出一张漂亮的 Attention heatmap,看到 "not" 和 "but" 这两个词的权重亮得刺眼,然后就写进了报告——"模型主要通过否定词做出判断"。直到有一次,我把 attention 权重最高的那个 token 直接遮掉,模型的预测概率几乎纹丝不动。

AI technology illustration

那一刻我才意识到,我盯着看了一下午的 heatmap 根本不是解释,它只是模型内部信息流动的一张快照。而这张快照被我误读成了因果证据。

这个误区太常见了,而且坑得非常深。今天我想把这件事彻底讲清楚:为什么注意力权重不等于特征重要性,以及如果你想真正解释模型的预测,应该看什么。

注意力真正做的是信息路由,不是重要性打分

先说清楚 Attention 机制本身。以 Transformer 为例,每个 token 在生成自己的表示时,会跟序列里其他所有 token 计算相似度,然后按相似度加权求和,把别人的信息拿过来用。这个机制在原始论文里的定位非常清楚:它解决的是"如何让远距离的词之间建立联系"的问题,而不是"如何解释模型"的问题。

你可以把 attention 想象成一个广播系统:每个 token 都在广播自己的信号,其他 token 按音量大小决定听谁的。权重越大,这个位置的信号对目标位置表示的影响就越大。但这里有一个关键点——这只是信息流动的分配,不是决策的归因。信号被接收了,不代表它最终主导了模型的输出。它可能只是补充了一点上下文,随后在后面的网络层里被别的信号盖过。

还有一个数学上的坑经常被忽略:softmax 让每个 head 的所有注意力权重加起来恒等于 1。这意味着无论某个 token 对当前预测有多大影响,它和其他 token 的权重都会被强制放在一个总和为 1 的相对尺度里比较。两个 token 的权重比是 9:1 还是 5:5,本质上是模型内部信息路由的分配策略,而不是它们对最终输出贡献度的比例。

你想要的"重要性",数学上完全是另一个东西

什么是真正的特征重要性?在可解释性研究里,一个最被广泛接受的定义是:如果删掉或扰动这个特征,模型的输出会变化多少。变化越大,说明模型输出对这个特征越敏感,这个特征就越重要。

这个定义可以用一个非常朴素的操作来测,就是遮挡测试:把某个 token 替换成 [MASK] 或者 [UNK],看预测概率掉多少。这也是我在文章开头讲的那个让我醒悟的实验。

# 遮挡测试:特征重要性的最朴素测量
probs = model(text)
for i, token in enumerate(tokens):
    text_masked = replace_at(text, i, "[MASK]")
    probs_masked = model(text_masked)
    importance[i] = (probs - probs_masked).abs().sum()

注意这个操作和 attention 权重没有任何直接关系。一个 token 的 attention 权重再高,如果它的表示在后续层中被非线性激活函数压平、被残差连接中更占主导的路径淹没、或者被其他 head 的相反信号抵消,它对输出的实际影响可能趋近于零。

维度 注意力权重 特征重要性
定义 目标位置从源位置抽取信息的分配比例 删除/扰动该特征后输出的变化量
数学刻画 softmax(QKᵀ) 的归一化值 梯度、积分梯度、遮挡扰动等
描述对象 信息在层间的流动路径 输出对输入的敏感度
能否直接观察 是,前向传播即可拿到 否,需要额外的反向传播或扰动实验

把这两列混为一谈,等于把"送信的邮路有多繁忙"误当成"收信人读信后被影响的程度"。邮路繁忙只说明信被送出去了,不能说明读信后做了什么决定。

实证证据:attention 和重要性的相关性经常不显著

如果你觉得上面的论证是纯理论推导,那再看看实验证据。2019 年,Jain 和 Wallace 发表了一篇标题非常直白的论文——《Attention is not Explanation》。他们做了三个关键实验,每一个都直接打在 attention 可视化爱好者的脸上:

  • 相同预测,不同注意力分布:用不同随机种子训练两个同构模型,它们在测试集上的预测几乎完全一致,但内部的 attention 分布差异巨大。一个模型认为某 token 权重高达 0.8,另一个模型可能只有 0.2。模型行为相同,解释却完全不同——这说明 attention 分布跟模型决策之间没有稳定的对应关系。
  • 高权重 token 被移除,预测几乎不变:把 attention 权重最高的词遮掉,模型预测概率的平均变化非常小。如果 attention 权重真能表示重要性,删掉最重要的词,预测应该剧烈波动才对。
  • 对抗注意力:他们训练了一个特殊模型,让 attention 分布被刻意引导到与预测无关的 token 上,同时保持模型准确率不降。这证明模型完全可以学会"把权重放在不重要的地方照样预测对"。

论文里那句话值得反复读:"Attention weights are frequently uncorrelated with gradient-based feature importance measures." 注意力权重和基于梯度的特征重要性度量经常不相关。

这篇论文后来引发了激烈的讨论。但它最核心的贡献不是否定 attention 有价值,而是把"weight 高 = 重要"这个直觉彻底打碎了。

梯度一出手,attention 就现原形

那么,什么方法能更接近真正的特征重要性?一个自然的思路是把梯度拉进来。

为什么梯度有效?因为梯度回答的问题是:如果这个位置的表示被扰动一点点,模型的损失或输出会朝哪个方向变化、变化多少。这才是"输出对输入的敏感度"的数学语言。

在 Jain & Wallace 的论文里,他们对比了很多指标,发现一个简单的组合效果远超原始 attention 权重——把注意力和它的梯度乘在一起。后来有人把这个思路发展成了 GAS(Gradient-weighted Attention Sum)方法,发表在可解释性相关的工作里。它的计算逻辑其实很直白:

# GAS 的核心直觉:权重 × 该权重对损失的梯度
gradient = d(loss) / d(attention_weight)
importance = attention_weight * gradient

为什么要乘梯度?因为梯度方向告诉你这个权重对损失有多大推动力。一个权重虽然很大,但如果它对损失的影响梯度接近 0,说明它只是模型内部"无所谓的分配",删不删它对结果影响甚微。权重乘以梯度之后,那些又高又关键的权重才会凸显出来,而那些高但无关紧要的权重会被梯度压制下去。

多头直接平均,更是雪上加霜

还有一个非常常见的骚操作:把 BERT 的 12 个头、24 层的 attention 权重拿过来直接求平均,画出一张漂亮的句子 heatmap,然后开始解读。

这个操作的问题在于,不同 head 学到的模式是异质的。有的 head 在捕捉相邻词的关系,有的在捕捉句法结构,有的干脆学到的是一种类似特殊 token 的编码模式。在对 BERT 各层注意力的分析里,可以看到每个 head 的行为差异极大。把 12 个行为各异的 head 加权平均,就像把 12 个人对同一问题的不同回答平均成一个数——这个数失去了所有人的观点。

更糟的是,如果两个 head 对同一个 token 给出了方向相反的偏好(一个是主谓结构线索,一个是语义相关性线索),平均之后可能互相抵消,得到一个无比平滑却毫无意义的分布。

"Attention is not not Explanation":反方观点没有翻案,反而把要求提高了

Jain & Wallace 的文章发表后,Wiegreffe 和 Pinter 写了一篇反驳,标题很绕:Attention is not not Explanation。这篇反驳经常被拿来当作 "attention 也可以当解释" 的证据。

但如果你真的去读它,会发现他们并没有推翻核心批判。他们提出了一个更严格的定义:一组 attention 权重如果要成为有效解释,必须满足两点——它与模型行为忠实对应(即用它预测的行为和模型实际行为一致),并且不存在另一组权重也能拟合这个模型但给出完全不同的解释。他们在论文里承认,可以训练出 attention 分布不同但行为一致的模型。

这个论证的结论说起来有点讽刺:attention 能不能当解释,取决于是否存在对抗性注意力分布。而 Jain & Wallace 的实验恰好证明了这种对抗分布确实存在。所以反方观点要说成立,反而需要先证明你手上的模型没有学过对抗分布——这个证明过程远比你看一眼 heatmap 复杂得多。

一个更隐蔽的问题:残差连接让信息可以绕过注意力

在 Transformer 中,每一层的输出 = 注意力子层输出 + 残差连接 + 归一化。注意力产生的只是残差上的一个更新项。也就是说,即使某个 head 的注意力权重分布极端集中,它对最终表示的贡献也只是原向量上的一个修正。这个修正可以被归一化层重新缩放,也可以被后续前馈网络完全改写。Serrano 和 Smith 在《Is Attention Interpretable?》里用实验确认了这一点——注意力权重和最终预测结果之间的因果链条,比看起来要弱得多。

那 Attention heatmap 就完全没用了吗?也不是

attention 可视化有一个不可替代的价值,就是生成假说。它特别适合做模式发现:模型在哪些样本上把注意力放在了奇怪的位置?某个 class 的 failure case 是不是因为注意力被不相关的短语吸引走了?这种时候,heatmap 能帮你迅速缩小范围。

但关键原则是:从 heatmap 生成的任何结论,都必须用扰动实验验证。 你说 "模型关注了 not 才判成 negative",那就把 not 遮掉看概率掉不掉。掉,结论才站得住;不掉,你的解释就是脑子里编出来的故事。

如果你想做正儿八经的归因解释,优先级应该是这样的:遮挡测试、梯度 × 输入、积分梯度、SHAP/LIME,最后才是 attention 权重。梯度和梯度加权类方法能告诉你真正的敏感度;扰动类方法能给你最直观的因果证据;而 attention 播放的是复播录像,想知道哪条新闻真正改变了决策,还得看事后影响。

你可能会问的三个问题

· 有时候 attention 高的词确实遮掉就掉分,这怎么解释?

这说明在这个具体样本上,这个位置确实承载了关键语义信息,所以扰动它会导致输出变化。但要注意,这只说明它在这个输入里重要,不能推导出 "attention 权重分布整体等于重要性"。个别样本上的巧合无法支撑一个普适的方法论。更何况你遮掉一个 token 会同时改变所有其他位置的 attention 分布,模型整体表示都被改写了,掉分不一定来自这个 token 本身的贡献。

· 那 "attention 对不上重要的词" 会不会是因为模型训练不到位?

不会。Jain & Wallace 的实验里模型都达到了可比的、合理的准确率,而且对抗训练出来的模型准确率不降。模型的 attention 分布可以不反映语义重心,同时照样做出正确预测——这不是训练质量问题,是 attention 机制本身的自由度。

· 既然这样,为什么很多论文还拿 attention 当解释?

两个原因。一是历史惯性——早期做机器翻译分析时,大家就是看 attention 图,这个习惯被带进了后来的工作。二是在某些浅层模型或简单任务上,attention 和真正重要的词确实有较高的重叠,尤其是在单层 attention 且没有残差分支的模型中。但这属于特例,不是通用性质。每一篇声称从 attention 中读出模型决策逻辑的论文,都值得你去检查一下它的验证实验站不站得住。

回到我自己的教训:现在我再看 attention heatmap,会把它当成侦探工具用——用来发现可疑的线索,而不是当成判决书。

那一张图能告诉你的是:模型在处理这个词时,动用了哪些位置的信息。但它永远无法告诉你,这些信息中有多少真正决定了模型的判断。想看到后者,唯一可靠的办法是去打扰它——改变它、遮挡它、测量它。扰动,永远是归因的唯一法庭。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/479.html

(0)
上一篇 3天前
下一篇 3天前

相关推荐