AI 工程基础体系 · 第 55/100 篇。内容覆盖机器学习、深度学习与生成式 AI;模型、数据、评测、权限和成本会作为同一生产系统处理。

模型可解释性:特征重要性、SHAP、局部解释与误用边界

模型可解释性研究的是:模型为什么产生某个预测、哪些输入因素影响了预测、这种影响在什么条件下成立,以及解释本身是否足以支持决策

它不是一个单一算法,而是一组问题:

  • 对整个模型而言,哪些特征总体上重要?
  • 对某一条样本而言,为什么预测为这个结果?
  • 特征的影响方向是什么,是否随取值变化?
  • 解释是在描述模型行为,还是在推断现实世界中的因果关系?
  • 模型、数据、解释器和评测过程本身是否受到分布变化、相关特征、权限限制和成本约束?

因此,“解释”不能简单等同于“列出几个重要特征”。一个解释可能准确描述模型,却不能证明模型正确;也可能看起来直观,却因相关性、数据泄漏或基线选择而误导使用者。


一、先区分三个对象:数据、模型与现实因果关系

设训练数据为:

D={(xi,yi)}i=1nD=\{(x_i,y_i)\}_{i=1}^{n}

其中 xix_i 是输入特征,yiy_i 是标签。模型学习一个函数:

f^:XY\hat{f}: \mathcal{X}\rightarrow\mathcal{Y}

对于回归问题,f^(x)\hat{f}(x) 通常是一个数;对于分类问题,它可能是类别、概率或 log-odds;对于生成式模型,它可能是下一个 token 的概率分布,或者一段序列的条件概率。

解释方法通常解释的是以下两类对象之一:

  1. 模型行为:固定模型 f^\hat{f},研究输入变化如何影响输出。
  2. 数据与模型共同形成的预测结果:研究某个样本为何得到该预测。

这两者都不自动等价于现实因果关系。例如,模型发现“邮编”对贷款违约预测很重要,只能说明邮编与模型输出相关,不能直接推出“改变一个人的邮编就会改变违约风险”。

因果结论需要额外的因果结构、干预定义和识别假设。用潜在结果表示,因果效应通常关注:

Y(x=1)Y(x=0)Y(x=1)-Y(x=0)

而普通特征归因关注的是:

f^(x)某个基线输出\hat{f}(x)-\text{某个基线输出}

前者描述现实世界中的干预差异,后者描述模型对输入的函数响应。二者的变量、条件和假设不同。


二、什么是特征重要性

2.1 全局重要性与局部重要性

全局特征重要性试图回答:

在一个数据集或输入分布上,哪些特征对模型整体预测最有影响?

它通常产生一个长度为特征数的向量:

I=(I1,I2,,Ip)I=(I_1,I_2,\ldots,I_p)

其中 IjI_j 是第 jj 个特征的总体重要性。

局部特征重要性回答的是:

对某一个具体样本 xx,哪些特征使模型输出相对于某个参考状态发生了变化?

局部解释通常写成:

f^(x)base value+j=1pϕj\hat{f}(x)\approx \text{base value}+\sum_{j=1}^{p}\phi_j

其中:

  • base value 是参考输入或背景数据对应的平均输出;
  • ϕj\phi_j 是特征 jj 对当前样本输出的贡献;
  • “贡献”是相对于这个基线的模型输出差异,不是现实世界中的因果贡献。

全局解释和局部解释不能互相替代。一个特征可能总体重要,但对某条样本几乎没有影响;也可能总体平均影响不大,却对少数高风险样本非常关键。


2.2 线性模型系数不是无条件的特征重要性

线性回归模型可写为:

y^=β0+j=1pβjxj\hat{y}=\beta_0+\sum_{j=1}^{p}\beta_jx_j

在特征已标准化、特征之间相关性较低、目标尺度明确时,βj|\beta_j| 可以作为一种简单的影响强度指标。

但原始系数不能直接比较不同量纲的特征。例如:

y^=0.01×收入+5×年龄\hat{y}=0.01\times \text{收入}+5\times \text{年龄}

并不意味着年龄比收入重要 500 倍,因为收入和年龄的单位、取值范围完全不同。标准化后比较系数,仍然只是在线性假设和其他变量固定条件下的模型响应。

如果两个特征高度相关,系数还可能不稳定。设:

x2x1x_2\approx x_1

模型可以把相同的预测能力分配给 x1x_1x2x_2,或者在正则化下进行不同程度的收缩。此时“单个系数的重要性”依赖于特征编码和正则化,而不完全反映信息组的重要性。


2.3 树模型的 impurity importance

决策树及随机森林常见的内置重要性来自不纯度下降。以分类树为例,节点 tt 的基尼不纯度为:

G(t)=1k=1Kpkt2G(t)=1-\sum_{k=1}^{K}p_{k|t}^{2}

其中 pktp_{k|t} 是节点 tt 中类别 kk 的比例。

如果使用特征 jj 将节点 tt 分成左右子节点 tL,tRt_L,t_R,加权不纯度下降为:

ΔI(t,j)=NtG(t)NtLG(tL)NtRG(tR)\Delta I(t,j)= N_tG(t)-N_{t_L}G(t_L)-N_{t_R}G(t_R)

全树中使用特征 jj 的所有节点贡献加总,再进行归一化,就得到常见的 impurity-based importance。

它描述的是:

训练树在当前分裂结构中,利用某特征降低训练节点不纯度的程度。

这不是无偏的“真实重要性”。它容易偏向:

  • 取值很多的连续特征;
  • 类别数较多的分类特征;
  • 能在训练集上形成大量切分机会的特征;
  • 含有泄漏信息的特征。

因此,它适合快速查看树结构,但不应单独作为模型上线后的特征价值证明。


2.4 置换重要性:用性能下降定义重要性

置换重要性(permutation importance)在验证集或测试集上进行。先计算原始评分:

s0=S(y,f^(X))s_0=S(y,\hat{f}(X))

然后随机打乱第 jj 列特征,得到 XπjX^{\pi_j},计算:

sj=S(y,f^(Xπj))s_j=S(y,\hat{f}(X^{\pi_j}))

重要性可以定义为:

Ij=s0sjI_j=s_0-s_j

对于“越大越好”的指标,这表示打乱特征后性能下降多少。

它的逻辑是:

  1. 保持训练好的模型不变;
  2. 破坏某一特征与标签的对应关系;
  3. 观察模型性能损失;
  4. 将性能损失归因于该列特征提供的信息。

下面是一个可运行的 scikit-learn 示例:

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score

X, y = load_breast_cancer(return_X_y=True, as_frame=True)

X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.25,
    random_state=42,
    stratify=y
)

model = RandomForestClassifier(
    n_estimators=300,
    random_state=42,
    n_jobs=-1
)
model.fit(X_train, y_train)

proba = model.predict_proba(X_test)[:, 1]
auc = roc_auc_score(y_test, proba)
print(f"test AUC: {auc:.3f}")

result = permutation_importance(
    model,
    X_test,
    y_test,
    scoring="roc_auc",
    n_repeats=20,
    random_state=42,
    n_jobs=-1
)

order = result.importances_mean.argsort()[::-1]
for i in order[:10]:
    print(
        X.columns[i],
        f"mean={result.importances_mean[i]:.4f}",
        f"std={result.importances_std[i]:.4f}"
    )

每次置换都会产生随机结果,因此代码同时输出均值和标准差。一个特征的平均重要性接近零且标准差很大,可能意味着:

  • 特征确实没用;
  • 其他相关特征已经替代了它;
  • 测试集太小;
  • 指标对该特征影响不稳定。

置换重要性还有一个关键边界:相关特征会导致重要性被分摊或低估。如果 x1x_1x2x_2 几乎表达同一信息,打乱 x1x_1 后,模型仍可从 x2x_2 获得该信息,于是 I1I_1 可能很小。但这不代表 x1x_1 这组信息不重要,只代表模型还有替代变量。

一种诊断方法是对相关特征进行分组置换:同时打乱一个特征组,测量这组信息整体造成的性能下降。这样得到的是“组重要性”,不再是单列的边际重要性。


三、SHAP 的核心:把一次预测差异分摊给特征

3.1 从合作博弈到模型解释

SHAP 的名称来自 SHapley Additive exPlanations。其核心思想是把特征看作参与合作的玩家,把模型输出看作合作收益。

先定义一个价值函数:

v(S)v(S)

其中 SFS\subseteq F 是已经“知道”的特征集合,F={1,2,,p}F=\{1,2,\ldots,p\} 是全部特征集合。v(S)v(S) 表示只使用特征集合 SS 时,模型的期望输出。

对某个特征 jj,SHAP 值为:

ϕj=SF{j}S!(pS1)!p![v(S{j})v(S)]\phi_j= \sum_{S\subseteq F\setminus\{j\}} \frac{|S|!(p-|S|-1)!}{p!} \left[v(S\cup\{j\})-v(S)\right]

公式中的每一项表示:

  • SS:在特征 jj 加入之前已经存在的特征集合;
  • v(S{j})v(S)v(S\cup\{j\})-v(S):把特征 jj 加入该集合后带来的边际变化;
  • 前面的系数:所有特征加入顺序中,集合 SS 出现在 jj 之前的比例。

因此,SHAP 不是只看一个固定顺序,而是对所有可能的加入顺序求平均。

在加性解释中,最终满足:

f^(x)=ϕ0+j=1pϕj\hat{f}(x)=\phi_0+\sum_{j=1}^{p}\phi_j

其中 ϕ0\phi_0 是基线输出,通常与背景分布下的期望输出有关。


3.2 两个特征的完整算例

假设模型为:

f(x1,x2)=2x1+x2f(x_1,x_2)=2x_1+x_2

背景数据的特征均值为:

E[x1]=1,E[x2]=2E[x_1]=1,\qquad E[x_2]=2

待解释样本为:

x=(3,5)x=(3,5)

模型对该样本的输出是:

f(3,5)=2×3+5=11f(3,5)=2\times3+5=11

假设使用独立特征的背景替换方式定义价值函数,则:

v()=E[f(x1,x2)]=2E[x1]+E[x2]=4v(\varnothing)=E[f(x_1,x_2)] =2E[x_1]+E[x_2] =4

只知道 x1=3x_1=3 时:

v({1})=2×3+E[x2]=6+2=8v(\{1\})=2\times3+E[x_2] =6+2=8

只知道 x2=5x_2=5 时:

v({2})=2E[x1]+5=2+5=7v(\{2\})=2E[x_1]+5 =2+5=7

两个特征都知道时:

v({1,2})=11v(\{1,2\})=11

对于两个特征,x1x_1 有两种加入顺序:

  1. 先加入 x1x_1:边际贡献 v({1})v()=84=4v(\{1\})-v(\varnothing)=8-4=4
  2. 后加入 x1x_1:边际贡献 v({1,2})v({2})=117=4v(\{1,2\})-v(\{2\})=11-7=4

因此:

ϕ1=4+42=4\phi_1=\frac{4+4}{2}=4

同理:

ϕ2=(74)+(118)2=3\phi_2=\frac{(7-4)+(11-8)}{2}=3

最后:

ϕ0+ϕ1+ϕ2=4+4+3=11=f(3,5)\phi_0+\phi_1+\phi_2=4+4+3=11=f(3,5)

这里的解释是:

  • 基线输出:4;
  • x1=3x_1=3 相对于背景均值 1 使输出增加 4;
  • x2=5x_2=5 相对于背景均值 2 使输出增加 3;
  • 总输出为 11。

它没有说明“把 x1x_1 改变 2 个单位,现实结果必然增加 4”。它只说明,在这个模型和这个背景定义下,该输入值对预测输出的归因是 4。


3.3 SHAP 的几个重要性质

经典 Shapley 归因具有以下性质。

局部准确性(local accuracy)

ϕ0+jϕj=f(x)\phi_0+\sum_j\phi_j=f(x)

解释值加起来等于模型输出。对于概率、log-odds 或原始 margin,必须明确解释的是哪一种输出空间。

缺失性(missingness):如果特征没有被纳入模型函数,它的归因应为零。

一致性(consistency):如果一个模型更新后,某特征对任意输入集合的边际贡献都没有变小,则该特征的归因不会变小。

这些性质约束的是“如何分配模型输出差异”,不是“模型是否正确”“数据是否公平”或“归因是否具有因果含义”。


四、SHAP 中最容易被忽略的问题:缺失特征如何定义

公式中的 v(S)v(S) 并不天然唯一。对于不在 SS 中的特征,有至少两种常见处理方式。

4.1 Interventional SHAP

一种做法是将缺失特征从输入中“干预掉”,并用边际分布进行替换:

v(S)=EXSˉ[f(xS,XSˉ)]v(S)=E_{X_{\bar S}}[f(x_S,X_{\bar S})]

其中 Sˉ\bar S 是未观测特征集合。

这种定义近似回答:

固定当前样本的 SS 部分,其他特征从背景分布中独立取值时,模型输出的期望是多少?

优点是定义清晰、常适合模型函数归因;缺点是如果特征高度相关,独立替换可能产生现实中不存在的组合。例如年龄为 5 岁、工作年限为 30 年,可能就是不合理的背景样本。

4.2 Conditional SHAP

另一种做法是从条件分布采样:

v(S)=E[f(X)XS=xS]v(S)=E[f(X)\mid X_S=x_S]

这会保留特征之间的统计依赖关系,回答:

在已经知道 XS=xSX_S=x_S 的条件下,其他特征按数据中的条件分布变化时,模型输出期望是多少?

它避免了一部分不现实组合,但会带来另一个问题:相关特征之间的贡献如何分配不再唯一地表达“信息来源”

如果收入和职业高度相关,模型只使用收入,条件归因也可能将部分预测差异分给职业,因为职业能够统计上预测收入。这个结果在预测解释上可能合理,但不能说模型实际读取了职业这一列,更不能说职业具有独立因果作用。

所以报告 SHAP 时至少要记录:

  • 使用的解释器;
  • 背景数据或背景采样策略;
  • 特征相关性的处理方式;
  • 输出空间;
  • 解释的是训练集、验证集还是线上样本。

五、树模型、线性模型和黑盒模型中的 SHAP

SHAP 是一套归因思想,不同模型使用的计算方法不同。

5.1 树模型

对决策树、随机森林和梯度提升树,可以利用树结构高效计算 Tree SHAP。其结果通常比对任意黑盒模型进行大量采样更稳定、更快,但“高效”不等于“自动解决相关特征和背景定义问题”。

对于二分类树模型,需要明确输出是:

  • 类别概率;
  • log-odds;
  • 原始决策分数。

如果基线和 SHAP 值在 log-odds 空间,而业务人员把它们当作概率相加,解释就会错误。只有在同一输出空间内,局部准确性公式才成立。

5.2 线性模型

线性模型的 SHAP 可以直接利用系数和特征相对于背景值的差异。对于独立特征、原始输出空间:

ϕj=βj(xjE[Xj])\phi_j=\beta_j(x_j-E[X_j])

基线为:

ϕ0=β0+jβjE[Xj]\phi_0=\beta_0+\sum_j\beta_jE[X_j]

这与线性模型本身的代数结构一致。但在相关特征下,如何定义缺失变量仍会影响归因。

5.3 任意黑盒模型

对黑盒模型,可以通过采样特征子集、估计 v(S)v(S) 来近似 SHAP。特征数增加时,所有子集数量为:

2p2^p

因此通常需要抽样或近似。解释次数、背景样本数、特征数量和模型推理成本都会影响运行时间与方差。

这带来一个工程事实:

SHAP 图不是模型直接“吐出来”的事实,而是模型输出、背景数据和近似算法共同产生的估计结果。


六、如何阅读一个局部解释

一个局部解释至少要包含四项信息:

  1. 被解释的样本;
  2. 模型输出及输出空间;
  3. 基线值;
  4. 各特征对基线到当前输出的贡献。

假设某个欺诈模型输出的是概率,某条样本的结果为:

ϕ0=0.08,ϕ设备异常=0.31,ϕ历史交易=0.12,ϕ金额=0.04\phi_0=0.08,\quad \phi_{\text{设备异常}}=0.31,\quad \phi_{\text{历史交易}}=0.12,\quad \phi_{\text{金额}}=-0.04

则:

f^(x)=0.08+0.31+0.120.04=0.47\hat{f}(x)=0.08+0.31+0.12-0.04=0.47

正确的表述是:

在当前基线和解释配置下,设备异常和历史交易使模型输出相对基线增加,金额特征使输出降低,最终模型输出为 0.47。

不应表述为:

设备异常导致用户有 31% 的欺诈概率。

原因有三:

  • 归因是模型输出差异,不是现实因果效应;
  • 贡献值是否是概率空间取决于解释配置;
  • 一个特征的正贡献可能只是代理变量或数据泄漏的结果。

对于分类模型,解释“模型为什么判成正类”还不够。应同时检查:

  • 预测概率是否接近分类阈值;
  • 不同阈值下解释是否改变业务结论;
  • 解释中的特征是否在决策时刻可用;
  • 是否存在近似重复、后验信息或人工审核结果泄漏。

七、局部解释方法不只有 SHAP

7.1 LIME:局部替代模型

LIME 的基本思路是:

  1. 在当前样本附近生成扰动样本;
  2. 调用黑盒模型得到这些样本的预测;
  3. 对扰动样本加权,使离原样本越近权重越大;
  4. 拟合一个稀疏、易理解的局部模型;
  5. 用局部模型的系数解释原模型。

形式上,可写为:

argmingGiπx(zi)(f(zi)g(zi))2+Ω(g)\arg\min_{g\in G} \sum_i \pi_x(z_i)\left(f(z_i)-g(z_i)\right)^2 +\Omega(g)

其中:

  • ff 是原模型;
  • gg 是可解释的局部模型;
  • πx(zi)\pi_x(z_i) 衡量扰动样本 ziz_i 与原样本 xx 的距离;
  • Ω(g)\Omega(g) 约束解释模型复杂度。

LIME 的解释依赖扰动方式、距离函数、采样数量和随机种子。对于表格数据,如果独立随机替换类别或数值,会产生不符合真实联合分布的样本;对于文本,删除 token 也可能生成语义完全不同的句子。因此 LIME 的局部线性系数不一定稳定。

7.2 PDP 与 ICE:解释响应曲线

部分依赖图(PDP)估计特征 xjx_j 变化时的平均预测:

PDj(z)=EXj[f^(z,Xj)]PD_j(z)=E_{X_{-j}}[\hat{f}(z,X_{-j})]

它回答的是:

将所有样本的第 jj 个特征替换为 zz,模型平均会输出什么?

个体条件期望(ICE)则对每一个样本单独画曲线:

ICEi(z)=f^(z,xi,j)ICE_i(z)=\hat{f}(z,x_{i,-j})

PDP 适合观察平均趋势,ICE 适合发现样本间异质性。二者都可能在特征相关时评估不现实的输入组合,因此不能把曲线直接当成现实世界的干预实验。

7.3 反事实解释

反事实解释试图寻找一个接近当前样本 xx 的输入 xx',使模型预测变为目标类别:

minxd(x,x)subject tof^(x)=ytarget\min_{x'} d(x,x') \quad \text{subject to}\quad \hat{f}(x')=y_{\text{target}}

实际系统通常还需要加入:

  • 不可改变特征约束;
  • 特征取值范围;
  • 类别合法性;
  • 业务规则;
  • 多特征同时变化的可行性;
  • 变化成本。

例如“降低年龄、修改历史逾期记录即可通过审核”并不是可执行建议,因为年龄和历史记录不可逆或不可改变。反事实解释若不加入可行动性约束,就会生成数学上有效、现实中无意义的方案。


八、深度学习中的解释:梯度、积分与输入归因

深度模型的输入维度可能很高,不能只依赖树模型方法。常见方法包括梯度归因、Integrated Gradients、Deep SHAP 和遮挡实验。

8.1 梯度归因

对标量输出 f(x)f(x),梯度为:

xf(x)=(fx1,,fxp)\nabla_x f(x) = \left( \frac{\partial f}{\partial x_1}, \ldots, \frac{\partial f}{\partial x_p} \right)

它描述在当前点附近,输入微小变化对输出的局部敏感度。

梯度不是当前特征对预测的总贡献。例如:

f(x)=x2,x=0f(x)=x^2,\qquad x=0

此时梯度为 0,但模型输出仍然由 xx 决定。神经网络中的饱和激活也会造成梯度接近零,而特征并非没有作用。

8.2 Integrated Gradients

Integrated Gradients 从基线 xx' 到当前输入 xx 沿直线路径积分:

IGj(x)=(xjxj)α=01f(x+α(xx))xjdαIG_j(x)= (x_j-x'_j) \int_{\alpha=0}^{1} \frac{\partial f(x'+\alpha(x-x'))}{\partial x_j} \,d\alpha

离散实现通常用 mm 个点近似:

IGj(x)(xjxj)1mk=1mf(x+km(xx))xjIG_j(x)\approx (x_j-x'_j) \frac{1}{m} \sum_{k=1}^{m} \frac{\partial f\left(x'+\frac{k}{m}(x-x')\right)} {\partial x_j}

其直觉是:不是只观察终点的斜率,而是累计从基线移动到当前输入过程中每个特征的梯度影响。

它满足一种完整性关系:

jIGj(x)f(x)f(x)\sum_j IG_j(x)\approx f(x)-f(x')

但结果强烈依赖基线 xx'。在图像中,黑色图像可能是合理基线;在文本和 embedding 中,“全零向量”未必代表真实的缺失语义。基线不同,解释对象就不同。


九、生成式 AI 中的“解释”需要重新定义

对分类或回归模型,通常存在一个固定标量输出,可以讨论某特征对该输出的贡献。生成式模型输出的是序列:

P(y1,,yTx)=t=1TP(ytx,y<t)P(y_1,\ldots,y_T\mid x) = \prod_{t=1}^{T}P(y_t\mid x,y_{<t})

因此必须先指定解释目标:

  • 某个 token 的概率;
  • 整个回答的 log-likelihood;
  • 某个分类器对回答的评分;
  • 是否引用了某个检索文档;
  • 是否符合某个安全规则。

“解释这段回答为什么生成”如果不指定目标,问题本身是不完整的。

9.1 Attention 不是充分解释

注意力权重表示某层某个头在计算表示时的加权关系。它可以帮助调试信息流,但不能自动证明:

  • 权重最高的 token 是决策原因;
  • 删除该 token 后输出一定改变;
  • 注意力权重可以替代因果分析;
  • 不同层、不同头的权重能直接相加比较。

要验证某个 token 或文档是否真正影响输出,应进行干预或对照实验,例如遮挡输入、替换检索文档、固定随机性后比较目标 token 的 log-probability,并报告输出变化。

9.2 RAG 的来源引用不是模型解释

检索增强生成系统中的“引用来源”通常说明:

检索器向生成器提供了哪些文档片段。

它不等价于:

生成器的每个断言都由该文档支持。

一个生产级系统应分别评估:

  1. 检索召回是否包含正确证据;
  2. 生成内容是否忠实于证据;
  3. 引用是否覆盖具体断言;
  4. 模型是否加入了证据之外的内容。

来源可追溯性是证据链的一部分,不是对神经网络内部决策的完整解释。


十、最重要的误用边界

10.1 相关性不等于因果性

模型归因通常基于:

f^(x)E[f^(X)]\hat{f}(x)-E[\hat{f}(X)]

因果效应需要定义干预:

E[Ydo(Xj=a)]E[Ydo(Xj=b)]E[Y\mid do(X_j=a)]-E[Y\mid do(X_j=b)]

如果特征是“是否接受过人工干预”,而人工干预只会发生在高风险样本上,那么模型可能把“人工干预”当作风险信号。删除这个特征可能降低预测性能,但并不说明干预导致了风险。

10.2 重要性高不等于特征应该被删除

高重要性可能表示:

  • 特征是有效信号;
  • 特征是标签泄漏;
  • 特征是敏感属性的代理;
  • 特征反映了流程偏差;
  • 特征在部署时不可用;
  • 特征只在训练分布中有效。

正确流程是先检查数据生成时间、可用性、业务含义、稳定性和公平性,再决定是否保留。

10.3 低重要性不等于特征无价值

在相关特征组中,某一列的边际重要性可能接近零,因为其他列已经提供了替代信息。还可能存在:

  • 只影响少量关键样本;
  • 只影响某个子群体;
  • 只在特定时间窗口有效;
  • 被模型正则化压低;
  • 测试集样本不足导致统计不稳定。

需要结合分组重要性、分群评测和置信区间,而不是只看一个排序。

10.4 稳定的解释不等于正确的模型

两个错误模型可能给出非常相似的解释。解释稳定性最多说明:

在输入扰动、随机种子或解释器设置变化下,归因结果较稳定。

它不能证明:

  • 标签定义正确;
  • 测试集代表生产分布;
  • 模型满足因果假设;
  • 模型不存在歧视;
  • 预测结果具有业务合理性。

解释是模型审计工具,不是准确性和合法性的替代物。

10.5 用概率解释 log-odds

二分类模型常在 log-odds 空间中进行解释:

logit(p)=logp1p\operatorname{logit}(p)=\log\frac{p}{1-p}

若 SHAP 输出的是 log-odds,贡献可以直接相加得到 log-odds,但不能直接相加得到概率。必须先完成逆变换:

p=11+elogit(p)p=\frac{1}{1+e^{-\operatorname{logit}(p)}}

这是报告和前端展示中很常见的数值错误。


十一、解释系统应如何进入生产链路

解释系统不是离线画图工具,而是预测系统的旁路或审计组件。一个典型数据流如下:

flowchart LR
    A[原始请求] --> B[特征构造]
    B --> C[模型推理]
    C --> D[预测结果]
    B --> E[特征快照]
    E --> F[解释器]
    C --> F
    F --> G[局部解释]
    D --> H[策略与人工审核]
    G --> H
    E --> I[审计存储]
    D --> I
    G --> I
    J[背景数据版本] --> F
    K[模型版本与输出空间] --> F

关键路径是:

  1. 线上请求经过与训练一致的特征构造;
  2. 模型产生预测;
  3. 解释器必须使用同一条样本特征快照;
  4. 解释器还需要知道模型版本、背景数据版本和输出空间;
  5. 预测与解释一起进入人工审核、策略决策或审计存储。

如果只存储“最终解释文字”,不存储原始特征、模型版本和基线,后续无法复现。模型更新后,同一个样本可能得到不同预测和不同归因;背景数据更新也可能改变 SHAP 基线,即使模型本身没有变化。

11.1 解释失败不应阻断所有预测

解释器可能失败于:

  • 模型版本不兼容;
  • 输入特征缺失;
  • 背景数据不可用;
  • 黑盒调用超时;
  • GPU 或内存不足;
  • 解释采样方差过大;
  • 特征脱敏后无法还原语义。

因此要定义故障策略:

  • 高风险人工审核场景:解释失败时转人工或拒绝自动决策;
  • 低风险实时场景:预测可继续,但记录“解释不可用”状态;
  • 异步解释场景:先返回预测,随后补充解释,但不能把未完成的解释显示为确定结论。

解释链路不能静默返回空值,否则使用者会误以为“没有重要特征”。

11.2 权限不是解释之后才考虑

解释可能泄露敏感信息。比如模型输出只显示“风险较高”,局部解释却暴露了健康状况、收入或内部风控规则。

应根据角色控制:

  • 普通用户可见的解释;
  • 客服或审核员可见的特征;
  • 模型开发者可见的详细归因;
  • 审计人员可见的完整版本和日志。

对于生成式 AI,还应限制提示词、检索文档、系统规则和内部评分是否能通过解释接口泄露。解释服务本身应记录访问者、样本标识、模型版本和导出范围。

11.3 成本必须纳入解释评测

一次预测可能只需一次模型调用,而黑盒 SHAP 或 LIME 可能需要数百到数千次调用。生成式模型的 token 推理成本更高,逐 token 解释还会放大延迟。

因此需要明确:

  • 哪些请求需要同步解释;
  • 哪些请求只进行抽样解释;
  • 是否对相同模型版本和背景配置缓存结果;
  • 是否只解释风险阈值附近的样本;
  • 是否用快速全局监控替代每条请求的完整归因;
  • 解释采样数量如何影响方差和预算。

成本下降不能通过伪造解释或减少必要的验证来实现。可以降低采样数,但应同时监控解释的重复运行一致性。


十二、如何验证解释,而不是只展示解释

解释质量至少包含四类验证。

12.1 加和验证

对于 SHAP 或其他加性归因,检查:

f(x)ϕ0jϕj<ϵ\left| f(x)-\phi_0-\sum_j\phi_j \right|<\epsilon

如果不成立,通常说明:

  • 输出空间弄错;
  • 使用了近似解释;
  • 后处理改变了模型输出;
  • 解释器和预测器调用的输入不一致。

12.2 删除或遮挡测试

按照解释的正贡献从大到小删除特征,观察目标输出是否明显下降;或者只保留排名靠前的特征,检查模型输出是否保持。

这类测试检验的是解释的忠实性,但也受特征相关性影响:删掉一个特征后,模型可能从相关特征恢复相同信息。

12.3 反事实一致性

对局部解释建议的特征进行合法改变,重新调用模型,确认预测是否按解释方向变化。若解释说某特征提高风险,却在可行范围内改变该特征后输出几乎不变,说明解释可能是局部近似不可靠、特征被替代,或者输出空间理解错误。

12.4 稳定性与分布监控

对相同样本重复解释,或轻微扰动非关键输入,计算归因排序的一致性。线上还应监控:

  • 特征分布漂移;
  • 预测分布漂移;
  • 重要性分布漂移;
  • 不同群体的解释差异;
  • 解释失败率和延迟;
  • 模型版本变化前后的归因变化。

重要性漂移不一定意味着模型坏了,也可能是输入分布变化;但它是需要进一步调查的信号。


十三、一个可操作的解释评审流程

对于一个新模型,可以按以下因果顺序评审:

  1. 明确输出:解释概率、log-odds、回归值、token 概率还是外部评分。
  2. 固定数据范围:区分训练、验证、测试和线上样本,防止用训练集解释泛化能力。
  3. 先做全局检查:使用置换重要性、分组重要性、PDP/ICE 或全局 SHAP 查看整体模式。
  4. 再做局部检查:选择正常、边界、错误、高风险和不同群体的代表样本。
  5. 记录背景与相关性假设:说明基线、背景数据和 interventional/conditional 选择。
  6. 验证忠实性:通过加和、遮挡、反事实和重复运行检查解释是否真的对应模型输出。
  7. 检查非因果误读:禁止把归因文字直接改写成现实因果或政策建议。
  8. 检查生产可用性:确认特征在决策时刻可得、解释延迟可接受、权限配置正确。
  9. 将解释纳入模型版本管理:模型、特征定义、背景数据、解释器参数和评测结果一起存档。

对于高风险领域,还应让领域专家审查特征含义和解释文本。数学上正确的归因,可能仍然在业务语境中造成错误决策。


十四、把解释当作证据,而不是答案

特征重要性、SHAP 和局部解释解决的是不同层次的问题:

  • 特征重要性描述模型在整体数据上的依赖程度;
  • 局部解释描述某个样本的预测组成;
  • SHAP 用特征联盟的边际贡献分摊预测差异;
  • PDP、ICE 描述模型响应曲线;
  • LIME 用局部替代模型近似黑盒行为;
  • 梯度和 Integrated Gradients 适合分析深度模型输入敏感度;
  • 反事实解释关注改变哪些输入可能改变预测;
  • 生成式 AI 的解释必须先固定 token、序列、证据或外部评分等目标。

这些方法都建立在特定的模型函数、背景分布、扰动方式和输出定义之上。它们可以帮助定位数据泄漏、发现代理变量、审查错误样本、辅助人工审核和监控模型漂移,但不能单独证明因果关系、公平性、合规性或预测正确性。

在生产系统中,可靠的解释应同时回答四个问题:

  1. 解释了什么输出?
  2. 相对于什么基线?
  3. 依赖了哪些统计和计算假设?
  4. 经过什么验证,能支持什么决策?

只有把这四个问题记录清楚,解释才是可复现、可审计、可被正确使用的技术证据,而不是一张看起来合理的特征排序图。


系列导航与关联阅读

官方资料

本文依据研究论文、标准组织与主流框架官方文档重新梳理;正文、示例与工程清单由 WR BLOG 编写。