假如你是一支登山探险队的队长,刚带队爬上一座被浓雾笼罩的山。你只知道“山脚海拔 100 米,山顶海拔 1000 米”,却完全看不清哪段路最陡、哪块岩石最滑。更麻烦的是,你要给每个队员发奖金——可雾太大,你只记得每一小段的坡度,却说不清到底是谁在出力。深度神经网络就是这样一座雾中之山:它给出精准的预测,却从不交代依据。Integrated Gradients(积分梯度)就像你的随身记账本:从山脚的基地营(基准点)到山顶(输入样本),沿一条直线路径一步一步走,每走一步记录一次每个队员的拉力(梯度),最后把所有记录累加起来,得到每个人的贡献分数。神奇的是,这些分数加在一起,恰好等于整座山的净爬升——这个性质叫“完备性”。有了这本账,你就能指着山路的每一段说:就是这里、就是这块地形,把预测抬了上去。

岗位关联

学会 IG,你就掌握了给任意可微模型“分摊功劳”的通用工具——从定位模型幻觉到向业务方解释预测依据,这是可解释 AI 从业者的核心基本功。

目录
  1. 可视化演示
  2. 黑箱困境:为什么要特征归因
  3. 核心直觉:基准点与直线路径
  4. 数学原理:从路径积分到归因
  5. 计算实现:把积分变成累加
  6. 公理性质:经得起查账的三原则
  7. 基准选择:归因的零刻度
  8. 方法对比:与梯度乘积、LIME、SHAP 的差异
  9. 应用场景:热力图与文本高亮
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示沿基准点到输入的路径积分原理、完备性公理求和验证及四种归因方法对比,支持三模式交互切换。

本节配有交互动效(进入视口后自动加载,约 3KB)。

路径积分与梯度累积 从基准点x\'沿直线路径到输入x对梯度积分 路径上每个α点的梯度贡献累积为归因 移动积分点沿路径滑动可视化积分过程 IG_i=(x_i-x\'_i)∫₀¹∂F/∂x_i dα 沿路径积分梯度获得稳定特征归因。

黑箱困境:为什么要特征归因

想象你带着一支装备精良的登山队去爬一座浓雾笼罩的山。队伍爬得飞快,一天就登了顶,可你完全看不清山形——你只知道“进去一张地图,出来一个海拔数字”,却不知道是哪段路、哪块地形把队伍抬上去的。深度神经网络就是这样一支队伍:它把一张图片输入进去,吐出一个“猫 0.92”的分数,性能惊人,但它从不告诉你为什么。

这种“只给结果、不给理由”的模型被称为黑箱。在医疗、金融、质检这些容错率低的场景里,光有准确率远远不够——你需要知道模型依据了什么。这就是特征归因的需求:给输入中的每一个特征(一个像素、一个词、一个表格字段)分配一个贡献分数,回答“到底是谁在推动这个预测”。

围绕这个需求,归因方法大致分为三类:梯度类方法用反向传播得到的导数衡量特征敏感性;扰动类方法通过遮挡或修改输入观察输出变化(如 LIME);代理模型类方法用一个可解释的简单模型在局部拟合黑箱(如 SHAP)。Integrated Gradients(积分梯度)属于第一类,但它不是看一眼终点的梯度就下结论,而是走完全程再算总账。

回到登山队:黑箱队伍爬得再快,你也得知道每个队员在山路上出了多少力。特征归因就是给这支队伍发一张“贡献账单”,而 IG 正是这张账单的计算器。

F(x)=sc(x),A(x)=(A1(x),A2(x),…,An(x))F(x) = s_c(x), \qquad A(x) = (A_1(x), A_2(x), \ldots, A_n(x))
  1. 模型得分$F(x)$ 表示网络对输入 $x$ 在类别 $c$ 上的输出得分,是归因要解释的对象
    F(x)=sc(x)F(x) = s_c(x)
  2. 特征维度$x \in \mathbb{R}^n$,每个分量是图像像素或词向量的一个维度
    x=(x1,x2,…,xn)x = (x_1, x_2, \ldots, x_n)
  3. 归因向量$A(x)$ 与输入同维,$A_i > 0$ 表示第 $i$ 个特征推动预测,$A_i < 0$ 表示抑制
    A(x)=(A1(x),A2(x),…,An(x))A(x) = (A_1(x), A_2(x), \ldots, A_n(x))
  4. 终极目标找到一份经得起查账的贡献账单,让每个特征都有明确的功劳或罪过

核心直觉:基准点与直线路径

山顶在浓雾里,你只看得见脚下的一小块地面。怎么定义“谁出了力”?必须先定一个参照系:从山脚基地营到山顶,所有队员出力的总和应当等于总爬升。于是问题变成——选一条确定的路上山,并在每一步记录坡度。IG 的选择是所有路线里最简单的一种:直线。

这条直线从基准点 $x'$ 出发,终点是待解释的输入 $x$。基准点代表“没有任何信息”的输入:对图像是纯黑图片,对文本是零向量。路径上的每一个中间点都是基准与输入的混合体——越靠近输入,越像输入;越靠近基准,越像“无”。

在路径的每个点上,模型都会给出一个梯度 $\frac{\partial F}{\partial x_i}$,它像登山时脚下的坡度计:告诉你第 $i$ 个特征在当前混合状态下,是往上推还是往下拽。但坡度只反映局部——你在半山腰感觉到的陡坡,不代表整座山都这么陡。要得到全局贡献,必须把整条路上的局部记录全部积分起来。

直线缆车路线不一定是最险的野路,却是最公平的评审路线——每个特征在这条路上受到的考察方式完全相同,没有捷径,也没有忽视。

x~(α)=x′+α (x−x′),α∈[0,1]\tilde{x}(\alpha) = x' + \alpha\,(x - x'), \qquad \alpha \in [0, 1]
  1. 基准点 $x'$积分起点,代表无信息输入(全黑图、零向量)
    x′=0或x′=全黑图像x' = \mathbf{0} \quad \text{或} \quad x' = \text{全黑图像}
  2. 路径参数 $\alpha$从 0 到 1 的进度条,$\alpha = 0$ 在基准,$\alpha = 1$ 在输入
    α∈[0,1]\alpha \in [0, 1]
  3. 插值点 $\tilde{x}(\alpha)$基准与输入的加权混合,构成从山脚到山顶的直线缆车路线
    x~(α)=(1−α)x′+αx\tilde{x}(\alpha) = (1 - \alpha)x' + \alpha x

数学原理:从路径积分到归因

你每走一小步,就记录一次每个队员的拉力大小(梯度),并乘以这一小段路的距离。把这些“拉力 × 步长”全部加起来,就是每个队员在这段路上的总贡献。IG 的数学定义就是这个朴素想法的连续化:特征 $i$ 的归因等于“特征总位移 × 路径上梯度的积分”。

为什么要沿着整个路径积分,而不是只看终点?因为深度网络有“梯度饱和”现象:当输入远离决策边界时,激活函数(如 tanh、ReLU)的梯度趋近于零。只看终点的梯度,会漏掉那些“在关键路段出力、到顶后休息”的队员。沿路径积分把沿途所有位置的梯度都纳入账本,即使终点梯度饱和,路径中段的梯度仍能传递信息。

雾中只测山顶的坡度会严重误判——饱和的梯度像队员到顶后瘫坐在地,看似没出力,其实关键路段全靠他。IG 从山脚一路测到山顶,谁的账都赖不掉。

IGi(x)=(xi−xi′)∫01∂F(x′+α(x−x′))∂xi dαIG_i(x) = (x_i - x'_i) \int_{0}^{1} \frac{\partial F\bigl(x' + \alpha (x - x')\bigr)}{\partial x_i} \, d\alpha
  1. 特征位移 $(x_i - x'_i)$第 $i$ 个特征从基准到输入的总变化量,相当于“这条路的长度”
    (xi−xi′)(x_i - x'_i)
  2. 路径上一点$x' + \alpha(x - x')$ 是积分路径上参数为 $\alpha$ 的插值点
    x′+α(x−x′)x' + \alpha (x - x')
  3. 瞬时梯度$\frac{\partial F}{\partial x_i}$ 在该点处第 $i$ 个特征的局部拉力,方向与大小都是当前的
    ∂F(x′+α(x−x′))∂xi\frac{\partial F\bigl(x' + \alpha (x - x')\bigr)}{\partial x_i}
  4. 路径积分$\int_0^1 \cdots d\alpha$ 把所有位置的瞬时梯度沿路径累加,得到“全程平均拉力”
    ∫01⋯ dα\int_{0}^{1} \cdots \, d\alpha

计算实现:把积分变成累加

一步一个脚印地记录太慢了。你决定沿着缆车线每隔固定距离停一次,记一笔账:走 50 段就交账。IG 在实践中的做法完全一样——用黎曼和(离散求和)来近似连续积分。

具体来说,把路径参数 $[0, 1]$ 均匀切成 $m$ 段,在每段的采样点上用反向传播计算一次梯度。由于现代深度学习框架的自动微分一次就能给出全部特征的梯度,所以每个采样点只需要一次前向 + 一次反向传播。把所有采样点的梯度取平均,再乘以特征总位移,就得到归因。

工程上还有三个加速与稳定技巧:第一,把 $m$ 个插值点拼成一个 batch 一起前向,一次拿到所有梯度;第二,用梯形法则(相邻采样点梯度的平均值)替代矩形法,精度更高;第三,$m$ 通常取 20~50 即可,超过 200 步边际收益趋近于零,反而增加数值误差积累的风险。

记账员每隔固定距离记一笔,走完 50 段就合账——这就是“快速但足够准”的登山账单。IG 的计算成本是 $O(m)$ 次前向反向传播,远低于逐特征扰动的成本,这是它能大规模落地的关键。

IGi(x)≈(xi−xi′)∑k=1m1m∂F ⁣(x′+km(x−x′))∂xiIG_i(x) \approx (x_i - x'_i) \sum_{k=1}^{m} \frac{1}{m} \frac{\partial F\!\left(x' + \frac{k}{m}(x - x')\right)}{\partial x_i}
  1. 采样位置$\alpha_k = \frac{k}{m}$ 把 $[0, 1]$ 切成 $m$ 段,第 $k$ 段采样点在这里
    x′+km(x−x′)x' + \frac{k}{m}(x - x')
  2. 单点梯度每个采样点处第 $i$ 个特征的瞬时梯度,共需计算 $m$ 次反向传播
    ∂F ⁣(x′+km(x−x′))∂xi\frac{\partial F\!\left(x' + \frac{k}{m}(x - x')\right)}{\partial x_i}
  3. 梯度平均$\frac{1}{m}\sum_{k=1}^{m}$ 把所有采样点梯度取平均,等价于黎曼和的均值形式
    ∑k=1m1m⋅(梯度k)\sum_{k=1}^{m} \frac{1}{m} \cdot (\text{梯度}_k)
  4. 换算做功$(x_i - x'_i)$ 把“平均拉力”换算成“全程做功”,得到特征 $i$ 的最终贡献
    (xi−xi′)×平均梯度(x_i - x'_i) \times \text{平均梯度}

公理性质:经得起查账的三原则

好的账单要经得起三种查账:第一,所有队员的收入加起来必须等于总爬升,没人凭空多拿也没人莫名消失;第二,全程没出力的队员必须零收入;第三,两个互换位置后效果完全相同的队员,收入必须一样。IG 的“公理”就是这三条铁律,外加一条“不因账本样式不同而改变结果”的保证。

完备性是最重要的性质,它是微积分基本定理的直接推论:只要模型函数沿路径几乎处处可微(深度网络的激活函数都满足),那么所有特征的归因之和精确等于模型输出从基准到输入的变化量。这意味着信息没有泄漏——预测的每一分上升,都被某个特征认领了。

敏感性保证“无辜者不被冤枉”:如果一个特征在整条路径上的梯度恒为零,即它对输出毫无影响,那么它的归因必为零。对称性保证“公平对待”:如果两个特征在函数中可交换(交换后输出不变),它们获得相同的归因。实现不变性则更进一步:两个结构不同但输入输出函数完全一致的网络,IG 给出的归因完全相同——因为公理只依赖函数本身,不依赖网络内部实现。

查账员拿着总爬升高度逐项核对,一分不差——这就是 IG 敢让业务方拿着归因结果去做决策的底气。完备性把“可解释”从口号变成了可验证的数学等式。

∑i=1nIGi(x)=F(x)−F(x′)\sum_{i=1}^{n} IG_i(x) = F(x) - F(x')
  1. 归因总和$\sum_{i=1}^{n} IG_i(x)$ 把所有特征的归因相加,得到归因总账
    ∑i=1nIGi(x)\sum_{i=1}^{n} IG_i(x)
  2. 输出差值$F(x) - F(x')$ 是模型从基准到输入的输出变化,即“净爬升高度”
    F(x)−F(x′)F(x) - F(x')
  3. 等号成立条件$F$ 沿路径几乎处处可微——深度网络中 ReLU、tanh、softmax 均满足
    几乎处处可微⇒路径积分基本定理成立\text{几乎处处可微} \Rightarrow \text{路径积分基本定理成立}
  4. 实际意义完备性保证归因没有“漏水”,每一分输出变化都能追溯到某个特征头上

基准选择:归因的零刻度

基地营选在哪里,决定了“净爬升”怎么算。选在山脚,海拔差大;选在半山腰,海拔差小;选在另一座山头,爬升甚至可能变成下降。基准点就是归因的“零刻度”——同一个输入,换了基准,归因账单就会重写。

实践中常见的基准点有四类:零值向量(文本任务常用的零嵌入,代表“没有这个词”);纯黑或纯灰图像(图像任务最常用,代表“没有视觉信息”);模糊图像或高斯噪声(比纯色更接近自然图像的“无信息”状态);语义起点(如类别的平均特征,包含一定先验)。选择原则是:基准应尽量不含与任务相关的信息,否则会把信息差算错。

基准的影响在线性模型上一目了然:如果 $F(x) = w \cdot x + b$,那么路径上所有点的梯度都恒等于权重 $w$,积分退化为简单的乘法。此时基准 $x'$ 只整体平移归因,不改变特征之间的相对大小。但深度模型远非线性,基准选择不当会显著扭曲归因,因此工程上常用“多基准取平均”来降低敏感性。

换个基地营,账单就变样——所以 IG 用户要像认真挑选营地一样,在报告中明确说明基准点的定义与选择理由。无信息、可复现、经过敏感性验证,是合格基准的三要素。

F(x)=w⋅x+b⟹IGi(x)=wi (xi−xi′)F(x) = w \cdot x + b \quad\Longrightarrow\quad IG_i(x) = w_i\,(x_i - x'_i)
  1. 线性假设$F(x) = w \cdot x + b$,输出是特征的加权和,权重 $w$ 直接决定特征的重要性
    F(x)=w⋅x+b=∑iwixi+bF(x) = w \cdot x + b = \sum_{i} w_i x_i + b
  2. 梯度为常数$\frac{\partial F}{\partial x_i} = w_i$,路径上任意一点的梯度都等于权重本身
    ∂F(x)∂xi=wi\frac{\partial F(x)}{\partial x_i} = w_i
  3. 积分即乘法常数梯度沿单位路径积分等于 $w_i \times (1 - 0) = w_i$
    IGi(x)=(xi−xi′)⋅wiIG_i(x) = (x_i - x'_i) \cdot w_i
  4. 平移效应$x'_i$ 只整体平移归因,不改变特征间的相对排序;非线性模型没有这个特权,所以基准必须谨慎选择

方法对比:与梯度乘积、LIME、SHAP 的差异

别的记账法是怎么算贡献的?有人只看队员在终点那一刻的爆发力(梯度类,如 Saliency Map 和 Gradient×Input);有人把每个队员单独移开试一次,看队伍速度有没有变化(遮挡与 LIME);还有人用简化模型精确模拟整支队伍的每种队形,计算博弈论上的 Shapley 值(SHAP)。IG 属于“全程记账”派,它和这三类方法各有本质差异。

最容易被混淆的是 Gradient×Input(梯度×输入):它把输入 $x$ 直接乘以终点的梯度 $\frac{\partial F(x)}{\partial x}$。对于线性模型,这个公式是精确的;但在非线性深度网络中,它只看终点单点的局部信息,零值特征会被直接清零,且饱和小梯度会掩盖重要特征。IG 用 $(x_i - x'_i)$ 替代 $x_i$,用路径积分替代单点梯度,从根源上解决了这两个问题。

LIME 在输入邻域随机采样扰动,拟合一个线性代理模型来解释局部行为,它甚至不要求模型可微,但它是“局部近似”,不满足完备性,且随机采样导致结果不稳定。SHAP 基于 Shapley 值,理论上满足极强的公理体系,但精确计算需要遍历所有特征子集,指数级复杂度在特征多时不可行。IG 可被理解为以直线路径近似 Shapley 值的一种高效平均路径,计算量仅为 $O(m)$ 次前向反向传播,在效率与理论性质之间取得了最佳平衡。

Gradient×Input 像只看终点爆发力,LIME 像在局部试了几下就写报告,SHAP 像精确模拟所有队形却贵得离谱,而 IG 用一条直线路加全程记账,换来了“快速、稳定、且每分钱都有着落”的账单。

AiGI(x)=xi⋅∂F(x)∂xivsIGi(x)=(xi−xi′)∫01∂F(x~(α))∂xi dαA_i^{\mathrm{GI}}(x) = x_i \cdot \frac{\partial F(x)}{\partial x_i} \quad \text{vs} \quad IG_i(x) = (x_i - x'_i) \int_0^1 \frac{\partial F(\tilde{x}(\alpha))}{\partial x_i}\,d\alpha
  1. 终点梯度Gradient×Input 只在输入 $x$ 处计算一次梯度,像只看队员在终点那一瞬的爆发力
    ∂F(x)∂xi\frac{\partial F(x)}{\partial x_i}
  2. 特征缩放$x_i$ 乘以终点梯度,特征值为零时直接清零,掩盖了该特征在路径中段的真实作用
    AiGI=xi⋅∂F(x)∂xiA_i^{\mathrm{GI}} = x_i \cdot \frac{\partial F(x)}{\partial x_i}
  3. 位移替代IG 用 $(x_i - x'_i)$ 替代 $x_i$,衡量的是“特征带来了多少变化”而非“特征本身多大”
    (xi−xi′)(x_i - x'_i)
  4. 积分替代单点IG 对所有路径位置的平均梯度积分,不依赖终点单点,天然抵抗梯度饱和
    ∫01∂F(x~(α))∂xi dα\int_0^1 \frac{\partial F(\tilde{x}(\alpha))}{\partial x_i}\,d\alpha

应用场景:热力图与文本高亮

拿到登山账单之后干什么?给队员调岗(模型调试)、向客户解释账单(合规汇报)、检查有没有队员偷懒(失败案例分析)。IG 的落地形态正是这三件事的可视化:把归因分数画成图像热力图、把词级归因做成文本高亮、把多模态归因拼成跨模态对照表。

图像任务中,IG 对目标类别输出求梯度积分,得到与图像同尺寸的归因图。将归因归一化后叠加到原图上:红色区域表示“强力推动该类预测”,蓝色表示“抑制该类预测”。工程师一眼就能看出模型到底是看猫的耳朵还是看背景的沙发。文本任务中,把词向量各维度的归因求和得到词级重要性,高亮关键词即可解释“为什么这条评论被判定为负面”。

模型调试是 IG 的高价值场景:如果一张“猫”图的热力图集中在图片角落的水印上,说明模型学到了伪相关;如果一张医疗影像的热力图集中在扫描仪伪影上,说明特征分布发生了偏移。多模态模型则可以分别对图像路径和文本路径做积分归因,比较两种模态各自贡献了多少预测分数,从而定位“图文不一致”的根因。

热力图就是把“登山账单”画成一张地形图——红的是主力队员的脚印,蓝的是拖后腿的地方。有了这张图,模型不再是一座沉默的黑箱山,而是一张可以对话的地图。

Sij=∣IGij∣max⁡p,q ∣IGpq∣S_{ij} = \frac{\bigl|IG_{ij}\bigr|}{\max_{p,q}\, \bigl|IG_{pq}\bigr|}
  1. 原始归因$IG_{ij}$ 是位置 $(i,j)$(如图像像素 $i,j$)的归因值,正负号表示推或拉
    IGij∈RIG_{ij} \in \mathbb{R}
  2. 取绝对值$|IG_{ij}|$ 把正负贡献统一成强度,只关心“影响有多大”
    ∣IGij∣\bigl|IG_{ij}\bigr|
  3. 全局归一化分母取全图最大绝对值,把归因强度缩放到 $[0, 1]$ 区间
    max⁡p,q ∣IGpq∣\max_{p,q}\, \bigl|IG_{pq}\bigr|
  4. 映射成图缩放后的 $S_{ij}$ 映射为红色或蓝色的透明度/亮度,叠加原图得到可视化热力图

AI 应用场景

工业质检的“误判元凶”排查

阶段:模型调试与失败分析(部署后监控)

解决的问题:缺陷检测模型误判率高但查不出原因。传统做法是工程师凭经验反复调整输入和模型结构,像在黑箱里乱猜。IG 对每个误判样本生成归因热力图,直接指出是哪些像素把预测“抬”向了错误类别。

具体案例:某手机面板产线,模型把“反光”误判为“划痕”。用 IG 对误判批次做归因,发现高亮区域全部集中在反光条带而非划痕本体,团队随即补充去反光预处理并增加反光负样本,误判率下降 60%。

信贷审核的“拒贷理由”自动生成

阶段:模型合规与可解释汇报

解决的问题:消费金融风控模型通常用表格特征加文本信息做预测,监管要求对拒贷给出明确解释。传统规则引擎解释僵硬,而深度模型又说不清依据。IG 对每个申请人的特征做归因,自动输出“哪几个字段、哪几个词条构成了拒绝的主因”。

具体案例:某消费金融公司用多模态融合模型做授信,客户投诉“拒贷无解释”。接入 IG 后,客服系统对每笔拒贷自动生成归因报告:收入稳定性字段贡献 −0.32、近三月查询次数贡献 −0.28,客户可据此提起申诉复核。

多模态医疗影像的“读片依据”对齐

阶段:模型验证与医生交互

解决的问题:影像 + 报告的多模态诊断模型性能优秀,但医生不敢直接采信黑箱结论。IG 可以分别沿图像路径和文本路径积分归因,把模型依据转译成医生熟悉的“影像区域 + 语义关键词”。

具体案例:某肺结节辅助诊断系统中,医生对模型的 3 例假阳性有疑问。IG 热力图显示模型把高亮集中在血管交叉处而非结节边缘,文本归因显示报告中的“陈旧性病灶”被错误加权。团队据此修正训练数据,假阳性率明显回落。

Python 演示

python71 行
import numpy as np class TinyMLP:    def __init__(self, n_in, n_hidden, n_out):        self.w1 = np.random.randn(n_in, n_hidden) * 0.5        self.b1 = np.zeros(n_hidden)        self.w2 = np.random.randn(n_hidden, n_out) * 0.5        self.b2 = np.zeros(n_out)     def forward(self, X):        self.a1 = np.tanh(X @ self.w1 + self.b1)        return self.a1 @ self.w2 + self.b2     def train(self, X, y, epochs, lr):        y_onehot = np.eye(2)[y]        for _ in range(epochs):            logits = self.forward(X)            probs = np.exp(logits - logits.max(axis=1, keepdims=True))            probs = probs / probs.sum(axis=1, keepdims=True)            d_logits = (probs - y_onehot) / len(X)            d_w2 = self.a1.T @ d_logits            d_b2 = d_logits.sum(axis=0)            d_a1 = d_logits @ self.w2.T            d_z1 = d_a1 * (1 - self.a1 ** 2)            d_w1 = X.T @ d_z1            d_b1 = d_z1.sum(axis=0)            self.w1 -= lr * d_w1            self.b1 -= lr * d_b1            self.w2 -= lr * d_w2            self.b2 -= lr * d_b2     def output_for(self, X, class_id):        return self.forward(X)[:, class_id]     def grad_wrt_input(self, X, class_id):        grads = []        for i in range(len(X)):            x = X[i:i + 1]            logits = self.forward(x)            d_logit = 1.0 if class_id == 0 else 0.0            d_a1 = d_logit * self.w2[:, class_id]            d_z1 = d_a1 * (1 - self.a1 ** 2)            grads.append(d_z1 @ self.w1.T)        return np.array(grads)     def integrated_gradients(self, X, baseline, steps, class_id):        attrs = np.zeros_like(X, dtype=float)        alphas = np.linspace(0.0, 1.0, steps)        for alpha in alphas:            points = baseline + alpha * (X - baseline)            attrs += self.grad_wrt_input(points, class_id) / steps        return (X - baseline) * attrs  def main():    rng = np.random.default_rng(42)    X = rng.randn(120, 4)    y = (X[:, 0] + X[:, 1] > 0.0).astype(int)    model = TinyMLP(4, 8, 2)    model.train(X, y, epochs=300, lr=0.1)     x = X[5:6]    baseline = np.zeros((1, 4))    attr = model.integrated_gradients(x, baseline, steps=50, class_id=0)    print("样本特征:", np.round(x[0], 3))    print("特征归因:", np.round(attr[0], 4))    print("归因总和:", round(float(attr.sum()), 4))    diff = float(model.output_for(x, 0)[0] - model.output_for(baseline, 0)[0])    print("预测差值(完备性目标):", round(diff, 4)) main()
目的:训练一个两层小 MLP 完成二分类,随后用 Integrated Gradients 对单个样本做特征归因,并校验完备性——归因总和是否等于模型输出的预测差值。
  1. y = (X[:, 0] + X[:, 1] > 0.0).astype(int)构造只依赖前两个特征的标签,便于事后验证归因是否集中在前两维
  2. points = baseline + alpha * (X - baseline)生成从基准到输入的第 α 个插值点,这就是“直线路径”上的采样位置
  3. attrs += self.grad_wrt_input(points, class_id) / steps在每个采样点算一遍梯度并累加,除以步数就是平均梯度
  4. return (X - baseline) * attrs平均梯度乘以特征总位移,完成“拉力 × 全程”的做功换算
  5. diff = float(model.output_for(x, 0)[0] - model.output_for(baseline, 0)[0])计算完备性目标值,与归因总和对比验证积分是否正确

常见误区

误区我直接把输入 x 和模型在 x 处的梯度相乘,得到一个显著性图,这不就是 Integrated Gradients 吗?很多教程里的 saliency map 就是这么画的。

正解那是 Gradient×Input(梯度×输入),不是 IG。IG 必须从一个基准点出发,沿直线路径对梯度做积分,再乘以特征相对于基准的变化量 $(x_i - x'_i)$。两者的区别就像“只看队员在终点一瞬的爆发力”与“全程记录每个队员每一段的拉力”。非线性模型中两者结果差异巨大,只有线性模型下它们才等价。

为何常见:初学梯度类方法时最先接触的就是 saliency map,而 IG 的公式又带有相似的梯度项,容易把朴素版本与积分版本混为一谈。

误区IG 公式里有基准点,那我全填零不就好了?反正都是起点,差别应该不大吧。

正解基准点是归因的“零刻度”,直接决定净爬升从哪算起。全黑图、零向量、模糊图、类别均值作为基准,得到的归因分布可能完全不同。工程上不仅要多基准取平均,还要做敏感性分析,并在报告中明确说明基准的语义。登山队如果选错了基地营,整本账单都会失去意义。

为何常见:公式里基准只是积分下限,看起来像是一个无关紧要的常数,而“零”又恰好是最容易填的默认值,于是被当成无脑默认项。

误区IG 要画热力图,肯定是给 CNN 图像模型用的。我做的是文本分类和表格数据,用不上它。

正解IG 对一切可微模型都适用,不限于图像。文本任务中沿词向量路径积分,再对同一词的各维度归因求和即可得到词级重要性;表格任务中每个字段就是特征维度。多模态模型还能分别对图像路径和文本路径积分,比较不同模态的贡献占比。约束只有一个:模型对输入可微。

为何常见:IG 最出圈的案例都是图像热力图,而热力图这个可视化形态天然和图片绑定,让人误以为方法本身也绑定图像。

误区IG 满足完备性,归因总和等于输出差值,那它给出的归因就是“模型的真实原因”,可以拿去当因果证据用。

正解完备性只是一个数学恒等式:积分路径的微积分恒等,保证了“归因总和 = 输出变化”这个账面对得上。它不保证归因符合人类直觉,更不代表因果关系——“模型依据了这个像素”不等于“这个像素在物理世界里导致了猫的存在”。归因解释的是模型的计算,不是世界的因果。

为何常见:“完备”这个词听起来像“完美”,加上等式确实漂亮,初学者容易把数学自洽性误当成语义正确性。

误区IG 是数值积分,那我把步数设成 10000,精度一定最高,结果也最可信。

正解步数越大近似越接近真积分,但这是收敛意义上的;实践中 20~50 步已经足够,200 步以上边际改善微乎其微,反而增加浮点误差积累和计算开销。正确做法是:先固定步数做一次完备性校验(归因总和 vs 输出差值),误差可接受就够用,不必盲目堆步数。

为何常见:直觉上“采样越多越精确”符合数值分析常识,但忽略了深度网络梯度的数值误差与计算成本,忽略了完备性校验这个更直接的验证手段。

面试题

Q1. IG 的核心思想是什么?

单选题 · easy

  • A.沿随机扰动方向平均梯度估计
  • B.用局部线性替代黑箱模型输出
  • C.沿基准点与输入间直线路径积分梯度← 正确答案
  • D.对梯度做正则化处理后可视化

答案:C。IG 的核心是沿从基准点到输入的直线路径对梯度积分,把整条路上的梯度全部记入账本。A 是随机扰动思路,B 是 LIME 类代理模型思路,D 只是梯度后处理,都不涉及路径积分这一本质。

Q2. IG 中基准点的作用是什么?

单选题 · easy

  • A.加速反向传播减少计算耗时
  • B.提供积分起点表示无信息输入← 正确答案
  • C.调节优化器学习率的数值
  • D.保存训练过程中的模型参数

答案:B。基准点代表“无信息”输入,是积分的起点与归因的零刻度,决定“净爬升”从哪个海拔开始计算。A、C、D 分别属于优化与训练流程的范畴,与归因积分无关。就像登山账本需要先定山脚营地,基准就是那个起点。

Q3. 完备性公理的正确含义是?

单选题 · mid

  • A.模型在任意输入处都可微
  • B.归因结果一定符合人直觉
  • C.归因图与原图像素一一对应
  • D.归因总和等于模型输出差值← 正确答案

答案:D。完备性指所有特征归因之和精确等于 $F(x) - F(x')$,即输出变化被完全解释,没有“漏水”。A 是可微性条件,B 是语义层面的期望,C 是分辨率层面的对应关系,都不是完备性的定义。

Q4. 与 Gradient×Input 相比 IG 的优势是?

单选题 · mid

  • A.计算速度一定比朴素梯度更快
  • B.缓解梯度饱和导致的归因失真← 正确答案
  • C.完全不需要指定任何基准点
  • D.可直接用于不可微分的模型

答案:B。Gradient×Input 只看终点 x 处的单点梯度,特征被饱和梯度掩盖时会失真;IG 沿路径积分所有梯度,能还原路径中段的贡献。A 不成立,两者计算量同级;C 错在 IG 必须有基准点;D 错在 IG 要求模型可微。

Q5. 下列哪些属于 IG 的公理性质?

多选题 · mid

  • A.梯度方向一致性约束
  • B.完备性与敏感性公理← 正确答案
  • C.对称性与实现不变性← 正确答案
  • D.输出值非负性保证

答案:BC。IG 满足完备性、敏感性、对称性、实现不变性四条公理。B 包含完备性与敏感性,C 包含对称性与实现不变性;A 的“梯度方向一致性”不是 IG 的公理,D 的“输出非负性”也不是 IG 声称的性质。

Q6. IG 的数值近似依赖哪组参数?

单选题 · mid

  • A.学习率与批量大小的设置
  • B.网络宽度与深度比例调整
  • C.积分步数 m 和基准点选取← 正确答案
  • D.数据增强的随机种子数

答案:C。IG 的离散近似由积分步数 $m$(采样点数)和基准点共同决定:$m$ 越大越接近真积分,基准决定积分起点的语义。A 是优化超参,B 是网络结构,D 属于训练数据流程,它们都不参与 IG 的归因计算。

Q7. 关于 IG 近似算法说法正确的是?

多选题 · hard

  • A.步数越多近似结果越精确← 正确答案
  • B.采用梯形法则可提升精度← 正确答案
  • C.采样点可批量前向加速← 正确答案
  • D.步数增加误差单调递减

答案:ABC。黎曼和随步数增加收敛到真积分,A 对;梯形法则用相邻梯度均值,比矩形法精度更高,B 对;所有采样点可拼成 batch 一次前向拿到全部梯度,C 对。D 错在误差并非严格单调递减,受浮点精度影响可能波动。

Q8. 图像归因结果常用什么方式呈现?

单选题 · easy

  • A.直接输出预测类别名称
  • B.展示网络隐藏层全部权重
  • C.热力图叠加在原图像之上← 正确答案
  • D.打印模型的参数量信息

答案:C。图像归因结果是与原图同尺寸的归因图,归一化后叠加到原图形成热力图,红色表示推动、蓝色表示抑制。A 是分类输出,B 是权重可视化,D 是模型统计信息,均不是归因结果的标准呈现方式。

Q9. 若模型 F 是线性函数,IG 归因退化为?

单选题 · hard

  • A.权重乘以特征相对基准变化← 正确答案
  • B.与特征值无关的恒定向量
  • C.特征值平方再乘以权重
  • D.所有特征归因恒等于零

答案:A。线性模型下梯度恒等于权重 $w$,路径积分退化为 $w \times (x - x')$,即权重乘以特征相对基准的变化量。B、C、D 都不符合这一退化结果。这也解释了为什么线性模型下基准只平移归因、不改变特征相对大小。

Q10. 关于实现不变性的说法正确的是?

多选题 · extreme

  • A.函数等价的不同网络归因一致← 正确答案
  • B.依赖具体网络层内部实现细节
  • C.只对线性激活模型才成立
  • D.归因结果随训练随机性变化

答案:A。实现不变性指两个输入输出函数完全相同的网络(结构或参数不同)产生完全相同的归因,A 对。B 恰好说反——IG 不依赖内部实现细节;C 的多余限定不成立,非线性模型同样满足;D 与训练随机性无关,只要函数相同,归因就相同。