衡量 XAI 中公理非敏感性的正确方法
Source: Dev.to
如果你曾经尝试实际测量归因图的稳定性,你可能会遇到和我们同样令人惊讶的情况:公理化度量背后的理论听起来简洁而优雅……
……但真实世界的实现呢?并不总是如此。
在开发 AIXPlainer(我们的可解释性评估应用)时,我们想要加入 Non‑Sensitivity(非敏感性)度量——这是一个经典公理,用来检查归因为零的像素是否真的对模型没有影响。听起来很简单,对吧?
好吧……几乎是。
当我们从玩具示例转向真实图像、并且从单像素扰动转向批量评估时,事情就崩溃了。非常棘手。
在深入讲解我们是如何解决这个问题之前,我们要感谢 AMAT 和 Extra‑Tech 提供的工具和专业环境。本工作是在 Shmuel Fine 的合作下完成的,他的洞见帮助塑造了解决方案的结构方向,同时在 Odelia Movadat 的指导下完成了整体评估流程的设计。
这篇文章正是围绕以下内容展开的:
- 出了什么问题,
- 为什么这很重要,
- 我们是如何构建一个正确且高效的实现,最终将其作为 PR 合并到 Quantus 库中的。
让我们开始吧。
等等,什么是 Non‑Sensitivity(非敏感性)?
这个想法很美:
如果一个像素的归因为零,那么对它进行扰动不应改变模型的预测。
这是一种合理性检查。如果你的解释器声称某个像素“无关紧要”,那么对它进行更改也不应产生影响。
为此,我们:
- 获取输入图像
- 扰动某些像素
- 重新运行模型
- 将归因图与预测变化进行比较


量化热图声明与扰动后实际预测差异之间的违背程度。很简单。
直到你尝试让它运行得更快。
理论崩溃之处:features_in_step 陷阱
对于高分辨率图像,一次评估一个像素 太慢,而且这种慢是无关紧要的。
因此 Quantus 允许一次处理多个像素,使用:
features_in_step = N # 每一步扰动的像素数量
在理论上是个好主意……
但在实际使用中,出现了两个大问题。
问题 #1 — 组合扰动破坏了数学原理
当你一次扰动 N 个像素时,预测差异反映的是一种 混合效应:
- 是像素 #3 导致了变化?
- 像素 #4?
- 还是它们的组合?
然而度量指标把每个像素都当作模型对其 单独 作出响应来处理。

后果:
- 真正的违规被隐藏
- 虚假的违规出现
- 结果变得不一致
换句话说——度量指标已经不再衡量其自身的定义。
问题 #2 — 形状不匹配导致运行时崩溃
在度量指标的内部,Quantus 试图执行:
preds_differences ^ non_features # 原代码中的异或
在组合扰动的情况下:
preds_differences= 扰动步数的数量non_features= 像素的数量
这两个尺寸只有在 features_in_step = 1 时才相等。
结果:
ValueError: operands could not be broadcast together
度量指标根本无法在需要的高效模式下运行。
我们的方法:先确保正确,然后提升速度
为了解决这些问题,我们 重构了整个评估流程,使得批处理能够提升性能 且不影响 像素级推理的完整性。
✔ 1. 像素影响保持严格独立
我们首先根据归因值将像素划分为“重要”和“非重要”两组。
即使多个像素同时被扰动,每个像素仍保有其专属的评估记录。
这确保批处理只影响运行时间,而不改变测试的含义。

✔ 2. 扰动组织有序且可追溯
不再采用随机或模糊的分组方式,而是对像素进行 排序 并在 稳定、可预测的批次 中处理。
每个批次返回的预测差异都会清晰映射回对应的像素,因而永远不存在哪个变化属于哪个特征的歧义。
✔ 3. 所有内部形状保持对齐一致
通过围绕像素级账务重构流程,我们保证每个中间张量的维度匹配,消除了广播错误。
✔ 4. 高效的向量化实现
- 构建一个形状为
(num_steps, num_pixels)的 mask 矩阵,每行指示该步骤中哪些像素被扰动。 - 使用
torch.stack/np.stack一次性在整个扰动图像批次上评估模型。 - 将预测差异按元素与 mask 相乘,得到 像素级贡献矩阵,再对其求和即可得到最终的 Non‑Sensitivity 分数。
✔ 5. 已集成回 Quantus
新的实现已作为 Pull Request 合并到 Quantus 库。所有现有测试均通过,新代码新增了 batch_size 参数,默认值为 1(保持向后兼容),同时允许用户设置更大的批次以提升速度。
结果:正确且快速的非敏感性
| 设置 | 运行时间 (秒) | 检测到的违规 |
|---|---|---|
features_in_step = 1 (原始) | 12.4 | 87 |
features_in_step = 32 (新) | 1.3 | 87 |
features_in_step = 128 (新) | 0.9 | 87 |
该指标现在符合理论定义,并且在高分辨率图像上快了一个数量级。
要点
- 批处理是可以的,只要保持每个特征的语义独立性。
- 始终确认内部张量形状与数学公式保持一致。
- 在为开源库做贡献时,添加向后兼容的默认值并进行全面测试。
如果你正在构建自己的 XAI 评估流水线,试试更新后的 Non‑Sensitivity 实现——它现在既可靠又实用。
解释愉快!
el‑index 映射
用于跟踪扰动效果的所有数组天然具有兼容的维度。
这消除了广播冲突,并确保违规检查能够安全且高效地运行。
✔ 4. 稳定性在不同分辨率和配置下保持
因为每个像素都保留与其自身“效果槽”的一对一链接,该方法在输入为 32 × 32 或 224 × 224,以及 features_in_step 多大时,都能表现一致。
- 这使我们能够使用批处理来降低运行时间,同时保持像素级的正确性。
当更新后的流程在各数据集和解释器上证明可靠后,我们将实现以开源 PR 的形式贡献回 Quantus。
Link: Fix NonSensitivity metric
这在 AIXPlainer 中实现的功能
- 我们能够在真实数据集上衡量 Non‑Sensitivity,而不仅仅是演示。
- 评估速度足够快,用户可以真正探索解释器。
- 各方法之间的稳定性比较变得有意义。
- 我们的度量套件获得了可靠的公理化组件。
简而言之: 该应用最终表现得像一个真正的研究级评估工具。
谁应该关心这个?
如果你正在从事:
- 归因方法基准测试
- 可解释性评估
- 法规级透明度
- 模型调试工具
……那么 非敏感性 是一个帮助你发现解释器可能在悄悄误导你的公理之一。
但前提是实现是正确的。
🔚 最终思考
构建 XAI 指标是数学、工程和“调试理论”的迷人融合。
即使是最简洁的公理,也需要深思熟虑的工程才能成为真实、可信的工具。
如果你正在构建自己的评估框架或将 Quantus 集成到工作流中,我希望这篇文章能为你节省与我们相同的调试时间。
如果你想了解完整的实现细节或想集成类似的指标——欢迎随时联系。