研究大模型和多模态模型时,我们经常会用 attention map 来观察 token 之间的依赖关系。很多人会把它当成一种“信息流”分析工具。
但问题是:attention 分数真的能说明模型用了哪些信息吗?
这篇论文的核心观点是:只看 attention 可能不够,应该进一步看 saliency,也就是 attention 与梯度共同决定的贡献强度。
attention map 在看什么?
假设模型正在生成第 P 个 token。此时输入中已经包含前 P-1 个 token,这些 token 可能包括提示词、系统提示词、图像 token,以及模型已经输出的 token。
模型预测第 P 个 token 时,在每一层、每个 attention head 中都会得到一个 attention matrix。
其中,第 P 行表示当前位置对所有历史 token 的注意力分布。如果对生成序列中的每个位置都重复这个过程,就可以得到一张 attention heatmap。
多头结果通常会先聚合再归一化,最后形成层级图。这样我们就能看到模型在不同生成位置上“看向”了哪些历史 token。
只看 attention 的问题
问题在于,attention 分数高,并不一定代表这个 token 对最终预测真的有贡献。
论文里有一个很直观的现象:当模型看到一张棕色图像,却错误地输出 blue 这个词时,blue 的 attention 分布和其他正常 token 并没有稳定、显著的差异。
也就是说,仅看 attention 分数,很难区分真实词元和幻觉词元。
这说明 attention map 更像是“模型看了哪里”,但不一定能说明“模型真正依赖了哪里”。
引入梯度:看预测对 attention 的敏感度
为了更准确地描述模型是否真正使用了某些 attention 信息,作者引入了梯度。
具体做法是:针对当前分析的目标 token,用它的预测分布构造交叉熵 loss,然后把这个 loss 反向传播到 attention matrix 上。
这样就能得到:当前 token 的预测结果,对 attention matrix 中每个位置有多敏感。
saliency = attention × gradient
论文定义了 saliency:
saliency = attention × gradient
它用来衡量不同历史 token 对当前目标 token 预测的实际贡献强度。
直觉上,attention 表示模型看了哪里,gradient 表示预测结果对这里有多敏感。二者相乘,才更接近“这个位置到底有没有真正影响输出”。
作者在 Qwen2-VL-7B 和 LLaVA-1.5-7B 上进一步验证:真实词元与幻觉词元在 saliency pattern 上存在统计显著差异。
这说明 hallucination 伴随着可量化的上下文依赖退化,而 saliency 分析能够有效揭示这一点。
两个缓解幻觉的方法
论文后面还提出了两个实用方法来缓解幻觉,这里只简单记录。
- SGRS:在解码阶段基于 saliency 设置自适应阈值,拒绝低 grounding 的候选 token。它的意义在于把分析信号直接转化成 test-time decoding policy,不需要重新训练模型。
- LocoRE:增强下一步 query 对最近输出 token 的注意力,从而维持局部上下文连贯性。它很轻量、即插即用,而且针对的是论文识别出的 context forgetting 问题,而不是泛泛地重分配视觉注意力。
我的理解
这篇论文给我的启发是:attention map 可以作为分析入口,但不能被直接当成解释本身。
如果我们想判断一个 token 是否真的依赖了某些上下文,就需要进一步看这个依赖对最终预测有没有影响。saliency 的价值就在这里:它让“看了哪里”和“用了哪里”之间的区别更清楚。

评论
由 GitHub Discussions 提供,首次加载可能需要一点时间。