登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  科技周边 >  人工智能

Captum 的 convergence delta 怎样帮助判断积分近似误差

来源:17golang原创

时间:2026-10-30 15:32:10 399浏览 收藏

在 Captum 的 IntegratedGradients 里,convergence delta 不是模型分类准确率,也不是特征重要性的分数。它来自 completeness 关系:输入样本的模型输出与 baseline 的模型输出之差,应该接近所有特征 attribution 的总和。这个“接近程度”的逐样本差值,就是判断积分近似是否足够细的一个信号。

官方地址:https://captum.ai/api/integrated_gradients.html

如果 delta 的绝对值在同一批样本、同一输出尺度下明显变小,通常说明积分离散化更接近;如果它很大,优先比较 n_steps、method、baseline 和模型输出尺度,不要直接断言“模型解释错误”。

先看懂 convergence delta 在比较什么

Integrated Gradients 从 baseline 走向真实输入,沿直线路径累积模型输出对输入的梯度。理想情况下,归因总和应满足:

sum(attributions) ≈ forward(inputs) - forward(baselines)

Captum 返回的 delta 正是围绕这条关系计算的差值,而且按样本返回;输入 batch 有几个样本,delta 通常就有几个元素。它回答的是“这次积分近似是否把输出差解释得足够接近”,而不是“哪一个特征一定重要”。

Captum 输入、baseline、目标输出、归因总和与 convergence delta 的静态结构关系说明图
图1:结构说明图,查看输入与 baseline 的输出差、归因总和以及 convergence delta 的关系。

因此,比较 delta 时要保持比较条件一致:同一个模型、同一批输入、同一 target、同一种 baseline 语义和相近的输出尺度。换了 baseline 后,输出差本身也可能改变,不能只看 delta 的大小就评价两套解释谁更好。

用 return_convergence_delta 读出每个样本信号

attribute 默认只返回 attribution。把 return_convergence_delta 设为 True 后,返回值变成 attribution 与 delta 的二元组。分类模型通常要传 target;如果模型对每个样本只返回一个标量,则可以不传 target。

import torch
from captum.attr import IntegratedGradients

# forward_func 可以是模型,也可以是只取某个输出的包装函数
ig = IntegratedGradients(model)

# 这里用零 baseline 只是示例,实际要按输入语义选择
baselines = torch.zeros_like(inputs)

# target 指定要解释的类别;n_steps 控制积分近似的采样规模
attributions, delta = ig.attribute(
    inputs,
    baselines=baselines,
    target=target,
    n_steps=50,
    method="gausslegendre",
    return_convergence_delta=True,
)

# delta 是每个样本一个值;只把它当作同尺度下的近似误差信号
delta_abs = delta.detach().abs()
largest_gap = delta_abs.max().item()
print("最大绝对 convergence delta:", largest_gap)

上面的 largest_gap 适合做批次内的快速筛查,但阈值不能脱离任务直接硬编码。例如 logits、概率和回归值的量纲不同;同一个绝对阈值在不同输出空间里没有同样的含义。更稳妥的做法是保存每个样本的 delta,再按输出尺度、分位数或业务容忍度制定规则。

用 n_steps 和 method 做对比

delta 偏大时,第一组可控变量是积分近似本身。Captum 的默认 n_steps 是 50,默认 method 是 gausslegendre;也支持 riemann_left、riemann_right、riemann_middle 和 riemann_trapezoid 等规则。

Captum n_steps、Riemann 方法、Gauss-Legendre、attributions 与每样本 delta 的静态依赖关系说明图
图2:结构说明图,查看 n_steps 与积分方法如何影响归因结果和每样本 delta。

工程上可以固定一批代表性输入,先用默认配置取得 delta,再只提高 n_steps 或更换求积规则做对照:

def measure_delta(ig, inputs, baselines, target, n_steps, method):
    # 用相同输入与 baseline 对比积分参数,避免把变量混在一起
    _, delta = ig.attribute(
        inputs,
        baselines=baselines,
        target=target,
        n_steps=n_steps,
        method=method,
        return_convergence_delta=True,
    )
    # 返回每个样本的绝对差值,供外部记录和横向比较
    return delta.detach().abs()

baseline_delta = measure_delta(ig, inputs, baselines, target, 50, "gausslegendre")
denser_delta = measure_delta(ig, inputs, baselines, target, 100, "gausslegendre")

# 这里只比较两次结果,不把变化直接解释成模型质量变化
improved = denser_delta.mean() 

如果增加 n_steps 后 delta 稳定下降,说明原配置的离散化可能偏粗;如果变化很小,继续加步数的收益有限。若换 method 后结果差异明显,则应把求积规则作为实验记录的一部分,而不是只保存最终 attribution。

别把 delta 当成绝对正确率

convergence delta 只覆盖积分近似与 completeness 关系,不能替代 baseline 选择、target 选择或模型行为分析。零 baseline 对图像、表格和文本的含义不同;对文本或嵌入输入,零向量未必代表“缺失输入”。此外,非线性很强、输出变化很大或模型带有特殊控制流时,delta 的解释也需要结合任务语义。

一个实用的决策顺序是:先确认 target 与 baseline 是否表达了正确的问题,再固定样本比较 n_steps,最后比较不同 method。只有在这些条件一致时,delta 的下降才适合被记录为“积分近似更稳定”的证据。

现象优先检查合适动作
delta 偏大且加步数后下降离散化是否过粗提高 n_steps,并记录计算成本
delta 小但解释不符合业务直觉baseline、target 与输入语义重新定义比较基准,不要只调阈值
不同样本 delta 差异很大输出尺度和样本分布保留逐样本数据,避免只看平均值

常见问题

delta 是不是越接近零越好?在同一模型、同一输出尺度、同一输入与 baseline 条件下,通常可以把更小的绝对 delta 视为更接近 completeness 的近似结果;它不是跨模型、跨任务的通用评分。

为什么换 baseline 后 delta 变了?因为 baseline 改变了积分起点,也改变了 forward(inputs) - forward(baselines) 这条比较关系。先确定 baseline 的业务语义,再比较数值。

什么时候应该调用 has_convergence_delta?如果你在统一封装多种 Captum attribution 算法,可以先用它判断该算法是否提供 convergence delta;IntegratedGradients 提供这一能力。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>