模型可解释性入门:从注意力归因到 SHAP 与 LIME

模型跑得越准,我们往往越看不懂它为什么这样预测。一个医疗诊断模型、一个信贷风控模型,如果只吐出一个分数而给不出理由,医生和审核员都不敢直接采信。本文带你系统入门模型可解释性:从最直觉的注意力归因讲起,经过集成梯度、Grad-CAM 这类显著性方法,再到 LIME 与 SHAP 这两类在业界最常用的解释工具,并配一段可运行的 Python 示例与一张方法对比表,帮你把「黑盒」的判据找出来。

为什么模型需要可解释性

可解释性不是锦上添花,而是很多场景下的硬需求,至少来自四个角度。

第一,合规要求。欧盟通用数据保护条例(GDPR)提出了「算法决策的解释权」相关条款;欧盟人工智能法案(EU AI Act)对高风险系统也提出透明度义务。金融、医疗等受监管行业部署模型时,往往必须能向用户或监管说明决策依据。

第二,调试与纠错。模型上线后出了错,可解释性能帮你定位是数据偏差、特征泄漏,还是某个子模块学到了捷径(shortcut)。没有归因,你只能盲调。

第三,建立信任。对最终用户而言,「模型说你有风险」和「模型认为你的负债收入比过高导致风险」是完全不同的体验。可解释输出让用户愿意采纳建议。

第四,公平与问责。归因可以暴露模型是否过度依赖受保护属性(如性别、种族的代理变量),从而支撑偏见审计。

一句话概括:可解释性回答的问题是「这个预测,凭什么」。

注意力归因:直觉与局限

在 Transformer 系列模型里,注意力权重是最容易被当作「解释」的信号。它的直觉很诱人:注意力矩阵里某个 token 对其他 token 的权重越高,似乎就说明模型「更关注」那里。于是很多工作直接用注意力热图来解释模型行为。

但注意力权重到底是不是解释,学界早有争论。Jain 与 Wallace 在论文「Attention is not Explanation」里做了大量实验,结论是标准注意力模块大多不能提供有意义的解释:一方面,学到的注意力权重经常和基于梯度的特征重要性度量不相关;另一方面,可以找到许多完全不同的注意力分布,却让模型给出完全相同的预测。也就是说,注意力高并不必然意味着该 token 对输出贡献大。

当然,这个结论并非定论。Wiegreffe 与 Pinter 在「Attention is not not Explanation」中反驳说,注意力是否算解释取决于你对「解释」的定义,他们设计的对照实验表明,在更严格的设定下,注意力仍然能提供有意义的信号。今天的共识大致是:注意力是一个便宜、可观察的信号,但它在性质上更接近「路由」或「信息聚合权重」,而非严格意义上的特征归因;把它当作唯一解释证据是危险的。

实践建议:注意力适合做「模型把计算资源投向了哪里」的可视化,若要回答「哪个输入真正改变了预测」,应当配合下面几类归因方法。

显著性方法:集成梯度与 Grad-CAM

显著性方法(saliency / attribution)的核心思想是,衡量每个输入特征对模型输出的边际贡献。下面两组方法最值得掌握。

集成梯度(Integrated Gradients)

集成梯度由 Sundararajan 等人提出,它满足两条公理:敏感性(Sensitivity,输入变了输出变了,归因就不应为零)与实现不变性(Implementation Invariance,功能相同的两个网络归因应一致)。其做法是:从一条「基线」(baseline,如全零图像、全掩码文本)出发,沿着到真实输入的直线路径对梯度做积分,从而消除饱和区梯度消失带来的偏差。

数学形式如下,其中 x 是输入,x’ 是基线,F 是模型:

IG_i(x) = (x_i - x'_i) × ∫_{α=0}^{1} ∂F(x' + α(x - x')) / ∂x_i dα

实际计算时把 α 从 0 到 1 均匀取若干步(如 50 步)做黎曼和近似即可。集成梯度适用于文本与图像,输出的是和输入同形状的归因张量,正值表示正向贡献,负值表示负向贡献。

Grad-CAM

Grad-CAM 面向卷积网络,它取目标类别对最后一层卷积特征图的梯度,做全局平均池化得到每个通道的权重,再加权回特征图、上采样,得到一张「哪些区域对该类别重要」的粗定位热力图。它无需改动网络结构,也适用于图像分类、图文问答等任务。

这类方法统称为基于梯度或基于扰动的显著性方法。它们计算快、与模型结构耦合紧,但解释的是「特征到输出的敏感度」,并不直接保证与人类因果直觉一致。

局部代理模型:LIME

LIME(Local Interpretable Model-agnostic Explanations)的思路是「在局部拟合一个可解释的替身」。对一个待解释的样本,LIME 在其邻域反复扰动输入(比如把文本里某些词删掉、把图像里某些超像素置灰),用原模型给这些扰动样本打分,再训练一个简单、可解释的模型(通常是带稀疏约束的线性模型)去逼近原模型在该点附近的行为。

这样得到的线性系数,就是「在局部范围内,每个特征如何影响预测」的解释。LIME 的最大优点是模型无关:无论你用的是随机森林、神经网络还是集成模型,它都能用同一套方式解释。代价是解释只保证局部保真,扰动策略与邻域大小的选择会显著影响结果,且每次解释有随机性。

博弈论方法:SHAP

SHAP(SHapley Additive exPlanations)把特征归因建模成合作博弈:把模型的预测看作「所有特征合作的收益」,每个特征的 SHAP 值就是它在所有可能特征联盟中的边际贡献的加权平均(源于博弈论的 Shapley 值)。

SHAP 满足三个理想性质:局部准确性(Local Accuracy,所有特征的归因加上基线期望等于该预测)、缺失性(Missingness,缺失特征归因应为零)、一致性(Consistency,模型越依赖某特征,其归因不应变小)。Lundberg 与 Lee 证明,在「加性特征归因」这一类方法里,同时满足这三性的解是唯一且就是 SHAP 值,从而把 LIME、集成梯度等多个方法统一到一个框架下。

对树模型,直接用组合定义算 Shapley 值是指数复杂度。Tree SHAP 给出精确的多项式时间算法,并已合入 XGBoost、LightGBM 等库,因此在实际表格数据场景中非常常用。SHAP 的不足是通用 Kernel SHAP 计算成本高,且它本身提供的是「重要性分配」,并不天然解释特征间的交互或因果。

大模型场景下的归因实践

到了大语言模型(LLM)时代,可解释性的落点主要有两类。

特征归因(feature attribution):对一个文本输入,逐 token 计算其对某个输出 token 对数概率的归因,常用集成梯度或基于梯度的近似,在 PyTorch 上可用 Captum 实现。

提示词归因(prompt attribution):把整段 prompt 当作输入,扰动或 masking 其中某些片段,观察输出变化,从而判断哪些指令或上下文真正驱动了回答。这类方法常借助 LIME 式的扰动或 SHAP 式的联盟采样。

实用工具链方面,PyTorch 官方的 Captum 提供了集成梯度、DeepLift、Grad-CAM 等一整套归因接口;基于 Captum 封装的 Transformers Interpret 则让 Hugging Face 文本分类模型的 token 级归因变得几行代码即可上手;表格与树模型场景首选 SHAP 库;文本局部解释可用 LIME 库。需要提醒:对上千 token 的 LLM 做逐 token 归因成本高,实践中常配合较小的代理模型、仅对关键片段归因,或用中文档级别的扰动来折中。

可运行示例

下面给出三段最小可运行示例。执行前请先安装依赖:pip install torch transformers captum shap lime scikit-learn

集成梯度对文本分类做 token 归因(基于 Captum 与 DistilBERT):

import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from captum.attr import IntegratedGradients

model_name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
model.eval()

text = "The movie was not good at all"
inputs = tokenizer(text, return_tensors="pt")
input_ids = inputs["input_ids"]

def forward(logits_ids):
    # 取正面类别(index=1)的 logits 作为被归因目标
    return model(logits_ids)["logits"][:, 1]

ig = IntegratedGradients(forward)
attributions = ig.attribute(input_ids, n_steps=50, baselines=torch.zeros_like(input_ids))
attrs = attributions.sum(dim=-1).squeeze(0).detach().numpy()

tokens = tokenizer.convert_ids_to_tokens(input_ids.squeeze(0))
for tok, val in zip(tokens, attrs):
    print(f"{tok:>12}  {val:+.4f}")

SHAP 对树模型做特征归因(用自带的加州房价数据):

import shap
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import fetch_california_housing

data = fetch_california_housing()
X, y = data.data, data.target
model = RandomForestRegressor(n_estimators=100, random_state=0).fit(X, y)

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X[:5])
print(shap_values[0])  # 单个样本各特征的 SHAP 值(正值推高预测,负值拉低预测)

LIME 对文本做局部线性解释:

from lime.lime_text import LimeTextExplainer
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.datasets import fetch_20newsgroups

cats = ["alt.atheism", "soc.religion.christian"]
docs = fetch_20newsgroups(categories=cats, subset="train").data[:200]
labels = fetch_20newsgroups(categories=cats, subset="train").target[:200]

clf = make_pipeline(TfidfVectorizer(), LogisticRegression())
clf.fit(docs, labels)

explainer = LimeTextExplainer(class_names=cats)
exp = explainer.explain_instance(docs[0], clf.predict_proba, num_features=6)
exp.show_in_notebook()  # 在 notebook 中展示;命令行可用 exp.as_list()

注意:以上示例依赖预训练权重下载与库版本,首次运行需联网并留意版本兼容;SHAP 与 LIME 的随机性意味着多次运行结果会有细微差别。

各类方法对比与适用边界

下表汇总主流解释方法的关键差异,帮助你按场景选型。

方法类别是否模型无关主要输入形态计算成本关键局限
注意力权重注意力归因否(限注意力模型)文本、序列极低不等于因果归因,相关性弱
集成梯度基于梯度的显著性否(需梯度)文本、图像依赖基线选择,仅到敏感度
Grad-CAM基于梯度的显著性否(限 CNN)图像仅卷积最后一层,定位粗
LIME局部代理模型文本、图像、表格仅局部保真,有随机性
SHAP(Kernel)博弈论归因表格、文本、图像通用估计成本高
SHAP(Tree)博弈论归因否(限树模型)表格仅适用于树集成

选型经验:表格数据用 Tree SHAP;需要模型无关的文本局部解释用 LIME;有梯度的深度模型做精细特征归因用集成梯度;卷积视觉任务用 Grad-CAM;注意力热图则作为辅助的「关注分布」可视化,而非唯一判据。

小结

模型可解释性回答的是「这个预测凭什么」。注意力权重直观却不等同于因果归因,Jain 与 Wallace 的质疑与后续反驳提醒我们谨慎使用它。集成梯度与 Grad-CAM 这类显著性方法用梯度把贡献可视化,适合深度模型但不保证因果。LIME 用局部代理模型做到模型无关,SHAP 用博弈论 Shapley 值给出具备三条理想性质的统一归因框架,Tree SHAP 更让树模型解释变得高效。落地时按数据形态与成本选型,并始终记住:解释方法揭示的是「相关性意义上的重要性」,不等于真正的因果机制,跨方法交叉验证才能更可靠地支撑合规、调试与信任。

参考与延伸阅读

  1. Sundararajan, Taly, Yan. 「Axiomatic Attribution for Deep Networks」(集成梯度的提出). arXiv:1703.01365. 已核验
  2. Ribeiro, Singh, Guestrin. 「Why Should I Trust You?”: Explaining the Predictions of Any Classifier」(LIME). arXiv:1602.04938. 已核验
  3. Lundberg, Lee. 「A Unified Approach to Interpreting Model Predictions」(SHAP 框架). arXiv:1705.07874. 已核验
  4. Lundberg, Erion, Lee. 「Consistent Individualized Feature Attribution for Tree Ensembles」(Tree SHAP). arXiv:1802.03888. 已核验
  5. Selvaraju 等人. 「Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization」. arXiv:1610.02391. 已核验
  6. Jain, Wallace. 「Attention is not Explanation」. arXiv:1902.10186. 已核验
  7. Wiegreffe, Pinter. 「Attention is not not Explanation」. arXiv:1908.04626. 已核验
  8. Captum 官方文档(PyTorch 可解释性库,captum.ai). 待核实
  9. SHAP 官方文档与代码仓库(github.com/slundberg/shap). 待核实
  10. Transformers Interpret(基于 Captum 的 Hugging Face 文本归因库). 待核实
本文累计阅读