让 AI 算积分梯度:终点斜率为零,特征贡献为何仍然非零

前天 3阅读

检查分类器是否依赖某个输入时,人们常看当前位置的梯度。可模型输出已经饱和,局部再改一点输入不会改变分数,梯度便可能为零。积分梯度沿基线到当前输入的整条路径累计变化,适合用来检查这种局部信息的遗漏。先算一个小函数,就能看清归因回答了什么。

让 AI 算积分梯度:终点斜率为零,特征贡献为何仍然非零

AI模型生成的概念插图:到达平台前的路径仍有变化;不是精确函数图、训练截图或真实特征热图。

终点已经停在平台上

原创函数F(x₁,x₂)先将x₁+x₂与0取较大值,再与1取较小值。它在和小于0时输出0,在0到1之间线性增加,和大于1后保持1。取输入x=(1.5,0.5),和为2,输出为1;当前两个偏导数都是0。

基线先取b=(0,0),其输出为0。若把终点梯度直接乘输入,两个归因都会是0,但输出相对基线实际增加了1。终点梯度只描述平台附近的微小扰动,不能据此断言两个特征都没有参与这次输出变化。

把路径分成有斜率和没斜率的两段

用t从0走到1,直线路径是b+t(x-b)=(1.5t,0.5t),两项之和为2t。当0小于t小于0.5时,F对每个输入的偏导数都是1;当0.5小于t小于1时,两项偏导数都为0。转折点处的不可导不会改变这一积分结果。

积分梯度的每项等于该特征的输入差,乘沿路径的偏导积分。因此第一项为1.5×0.5=0.75,第二项为0.5×0.5=0.25。二者相加为1,恰好等于F(x)-F(b)。这是完整性检查,核对的是输出差,不能漏掉基线输出。

也能把路径切成许多等长小段,取每段中点的梯度再平均。本次程序分别用解析分段和6000个中点核算,得到相同的0.75与0.25。实际网络的数值积分可能有误差,应同时记录步数与归因总和偏离输出差多少。

基线改变,问题也跟着改变

现在保持输入不变,只把基线改为(0.5,0),基线输出为0.5。路径的和是0.5+1.5t,到t=1/3便饱和。输入差为(1,0.5),两项归因变成1/3和1/6,加起来0.5,仍等于新的输出差。

这两份结果没有互相否定。第一份解释从全零出发增加的1,第二份解释在已有0.5输出后又增加的0.5。报告归因时若只留彩色热图,不写基线和所解释的输出量,读者便无法判断数字对应哪个比较。

让AI交付函数、输入、基线、路径表达式、每段偏导和两项积分,再以输出差核算总和。还应声明解释的是某类logit、概率,还是回归值;这些量经过非线性变换后,归因数值不会天然相同。不要只验算终点一次梯度。

积分路径中的中间输入可能不符合真实数据,例如两幅图像之间的混合未必是自然图像。因此归因是给定模型、基线和路径下的解释,不自动证明现实因果作用。基线选择与真实输入语义是否合适,需要结合具体任务检查;这份算例只验证机制。

资料核对日期:2026年10月2日。算例为原创教学设定,已用独立程序复核,未进行真实模型训练或效果测试。

参考资料

Sundararajan等:Axiomatic Attribution for Deep Networks

Captum:Integrated Gradients与完整性检查

文章版权声明:除非注明,否则均为云鹊BLOG原创文章,转载或复制请以超链接形式并注明出处。