AI 模型在想什么?用 SHAP 与 LIME 撕开黑盒,让每个预测都有据可查
目录特征归因的设计动机LIME 局部解释SHAP Shapley 值特征归因的工程实现特征归因的评估特征归因的边界与失效模式摘要特征归因通过计算每个输入特征对模型输出的贡献解释模型的决策过程。LIME 通过局部线性模型近似解释单个预测SHAP 基于 Shapley 值提供理论完备的特征贡献分配。本文分析两种方法在 LLM 中的应用。1. 特征归因的设计动机特征归因的核心问题是给定一个模型预测每个输入特征对预测结果的贡献是多少特征归因通过计算每个特征的重要性分数回答这个问题。1.1 为什么需要特征归因需求描述重要性理解模型决策知道哪些特征最重要高发现偏见识别模型是否依赖敏感特征高诊断错误发现模型是否使用了错误特征高满足合规满足法规对解释的要求高1.2 特征归因的核心思想特征归因的核心思想是通过分析输入特征变化对模型输出的影响确定每个特征的贡献。Attribution ( x i ) Change in Output when x i is modified \text{Attribution}(x_i) \text{Change in Output when } x_i \text{ is modified}Attribution(xi​)Change in Output whenxi​is modified输入特征模型预测特征归因LIME: 局部线性近似SHAP: Shapley 值特征贡献分数1.3 特征归因的历史演进特征重要性2010→ LIME2016→ SHAP2017→ 改进方法2020。1.4 特征归因的产业应用应用方法典型产品信用评分SHAPFICO医疗诊断LIME辅助诊断客服系统SHAP解释分类推荐系统LIME解释推荐1.5 特征归因的局限性特征归因的局限性包括近似误差局部模型可能不准确、计算成本高Shapley 值计算量大以及特征相关性相关特征导致归因偏差。2. LIME 局部解释2.1 LIME 的原理LIMELocal Interpretable Model-agnostic Explanations在预测点附近训练一个简单的线性模型用线性模型的权重作为特征重要性。2.2 LIME 的实现importlimefromlime.lime_textimportLimeTextExplainerclassLIMETextExplainer:LIME 文本解释器def__init__(self,model,tokenizer,class_namesNone):self.modelmodel self.tokenizertokenizer self.class_namesclass_names self.explainerLimeTextExplainer(class_namesclass_names)defexplain(self,text,num_features10):解释单个预测defpredict_fn(texts):inputsself.tokenizer(texts,paddingTrue,return_tensorspt)withtorch.no_grad():outputsself.model(**inputs)returnoutputs.logits.softmax(dim-1).numpy()explanationself.explainer.explain_instance(text,predict_fn,num_featuresnum_features)returnexplanation2.3 LIME 的优缺点优点缺点模型无关局部近似可能不准确解释简单对采样方式敏感支持多种模态稳定性差3. SHAP Shapley 值3.1 SHAP 的原理SHAPSHapley Additive exPlanations基于博弈论中的 Shapley 值公平地分配每个特征的贡献。3.2 Shapley 值的计算ϕ i ∑ S ⊆ N ∖ { i } ∣ S ∣ ! ( ∣ N ∣ − ∣ S ∣ − 1 ) ! ∣ N ∣ ! [ f ( S ∪ { i } ) − f ( S ) ] \phi_i \sum_{S \subseteq N \setminus \{i\}} \frac{|S|! (|N| - |S| - 1)!}{|N|!} [f(S \cup \{i\}) - f(S)]ϕi​S⊆N∖{i}∑​∣N∣!∣S∣!(∣N∣−∣S∣−1)!​[f(S∪{i})−f(S)]3.3 SHAP 的实现importshapclassSHAPExplainer:SHAP 解释器def__init__(self,model,tokenizer):self.modelmodel self.tokenizertokenizer self.explainershap.Explainer(self._predict,self.tokenizer)def_predict(self,texts):inputsself.tokenizer(texts,paddingTrue,return_tensorspt)withtorch.no_grad():outputsself.model(**inputs)returnoutputs.logits.softmax(dim-1).numpy()defexplain(self,text):解释单个预测shap_valuesself.explainer([text])returnshap_values3.4 SHAP 的优缺点优点缺点理论完备计算成本高公平分配特征相关性问题全局一致性解释复杂4. 特征归因的工程实现4.1 特征归因框架对比框架方法适用场景特点LIME局部线性模型通用简单SHAPShapley 值通用理论完备Captum多种方法PyTorch灵活ELI5多种方法通用易用4.2 特征归因可视化defvisualize_feature_attribution(attributions,features,titleFeature Attribution):可视化特征归因importmatplotlib.pyplotasplt plt.figure(figsize(10,6))plt.barh(range(len(features)),attributions)plt.yticks(range(len(features)),features)plt.title(title)plt.xlabel(Attribution Score)plt.tight_layout()returnplt4.3 特征归因的聚合defaggregate_attributions(attributions,methodmean):聚合多个特征归因ifmethodmean:returntorch.stack(attributions).mean(dim0)elifmethodmedian:returntorch.stack(attributions).median(dim0).valueselifmethodmax:returntorch.stack(attributions).max(dim0).values5. 特征归因的评估5.1 评估指标指标描述计算方法忠实度归因是否准确反映模型行为删除/添加测试稳定性归因是否一致多次运行一致性不同方法是否一致方法间对比5.2 忠实度测试deffidelity_test(model,input_ids,attributions,top_k5):忠实度测试top_indicesattributions.topk(top_k).indices masked_inputinput_ids.clone()masked_input[0,top_indices]0original_predmodel(input_ids)masked_predmodel(masked_input)fidelity(original_pred-masked_pred).abs().mean()returnfidelity6. 特征归因的边界与失效模式6.1 特征相关性问题表现解决方案相关特征相关特征归因分散特征聚类特征交互交互作用被忽略交互特征归因特征冗余冗余特征归因偏低特征选择6.2 计算成本方法计算成本适用规模LIME低任意规模Kernel SHAP中中等规模Tree SHAP低树模型Deep SHAP高深度学习6.3 特征归因的优缺点总结优点缺点模型无关近似误差可解释性强计算成本高理论完备特征相关性7. 特征归因在 LLM 中的应用7.1 文本分类解释分类任务特征归因方法解释情感分析SHAP每个词的情感贡献主题分类LIME每个词的主题贡献意图识别SHAP每个词的意图贡献7.2 生成任务的归因特征归因也可以应用于生成任务分析生成文本的每个 Token 的贡献。8. 特征归因的扩展应用8.1 在 NLP 中的应用特征归因在 NLP 中用于分析文本特征对模型输出的贡献NLP 任务归因目标特征解释情感分类情感极性词语哪些词决定了情感主题分类主题词语哪些词决定了主题意图识别意图词语哪些词表达了意图命名实体识别实体类型词语哪些词是实体defnlp_feature_attribution(model,tokenizer,text,methodshap):NLP 特征归因tokenstokenizer.tokenize(text)ifmethodshap:explainerSHAPExplainer(model,tokenizer)shap_valuesexplainer.explain(text)attributionsshap_values.valueselifmethodlime:explainerLIMETextExplainer(model,tokenizer)explanationexplainer.explain(text)attributionsexplanation.as_map()returnlist(zip(tokens,attributions))8.2 在图像分类中的应用图像任务归因方法特征可视化目标检测SHAP像素区域热力图图像分割LIME超像素区域标记医学影像SHAP像素病灶标记8.3 在表格数据中的应用表格任务归因方法特征解释信用评分SHAP特征列每个特征的贡献风险预测LIME特征列局部解释客户流失SHAP特征列全局特征重要性9. 特征归因的评估方法9.1 忠实度评估defevaluate_fidelity(model,input_data,attributions,top_k5):评估特征归因的忠实度# 删除 Top-K 重要特征top_indicesattributions.argsort(descendingTrue)[:top_k]masked_datainput_data.clone()foridxintop_indices:masked_data[0,idx]0original_predmodel(input_data)masked_predmodel(masked_data)# 预测变化越大归因越忠实fidelity(original_pred-masked_pred).abs().mean().item()returnfidelity9.2 稳定性评估defevaluate_stability(model,input_data,attributions,n_samples10):评估特征归因的稳定性all_attributions[]for_inrange(n_samples):# 添加微小噪声noisy_inputinput_datatorch.randn_like(input_data)*0.01new_attributionscompute_attributions(model,noisy_input)all_attributions.append(new_attributions)# 计算归因的标准差stackedtorch.stack(all_attributions)stdstacked.std(dim0).mean().item()returnstd9.3 一致性评估defevaluate_consistency(attributions_a,attributions_b):评估两种归因方法的一致性# 计算 Spearman 秩相关系数fromscipy.statsimportspearmanr correlation,_spearmanr(attributions_a.flatten().numpy(),attributions_b.flatten().numpy())returncorrelation10. 特征归因在实际应用中的选择10.1 方法选择场景推荐方法原因快速分析LIME计算快精确解释SHAP理论完备高维数据Kernel SHAP近似加速树模型Tree SHAP高效10.2 参数配置参数LIMESHAP说明采样数5000100-1000越多越准确特征数1010-20显示的特征数核宽度0.75-LIME 的局部范围基线-均值/零SHAP 的参考点11. 特征归因的局限性11.1 特征相关性问题描述解决方案相关特征高度相关特征导致归因分散特征聚类特征交互交互作用被忽略交互特征归因特征冗余冗余特征归因偏低特征选择11.2 计算成本方法计算复杂度适用规模优化方案LIMEO(N)任意减少采样数Kernel SHAPO(2^N)小规模特征分组Tree SHAPO(N^2)大规模近似算法Deep SHAPO(N)大规模梯度近似12. 特征归因在工业界的实际案例12.1 信用评分信用评分模型需要解释拒绝贷款的原因特征归因是核心方法特征SHAP 值解释收入0.3收入高增加信用评分负债率-0.5负债率高降低信用评分信用历史0.2信用历史良好增加信用评分年龄-0.1年龄偏低略微降低信用评分12.2 医疗诊断医疗诊断中特征归因帮助医生理解模型诊断依据特征SHAP 值解释体温0.4体温高增加疾病概率白细胞计数0.3白细胞高增加感染概率年龄-0.1年龄偏大略微增加风险既往病史0.2有相关病史增加风险12.3 客户流失预测客户流失预测中特征归因解释客户可能流失的原因特征SHAP 值解释使用频率-0.6使用频率低增加流失风险投诉次数0.4投诉多增加流失风险消费金额-0.3消费金额下降增加流失风险会员等级0.1会员等级低略微增加风险13. 特征归因的最佳实践13.1 方法选择场景推荐方法原因快速分析LIME计算快结果直观精确解释SHAP理论完备结果准确大规模数据Kernel SHAP近似加速树模型Tree SHAP高效计算13.2 参数调优参数LIMESHAP说明采样数5000100-1000越多越准确特征数1010-20显示的特征数核宽度0.75-LIME 的局部范围基线-均值/零SHAP 的参考点13.3 结果验证验证方法描述标准忠实度测试删除重要特征看预测变化变化越大越好稳定性测试多次运行看结果一致性标准差越小越好一致性测试不同方法结果对比相关性越高越好14. 特征归因在 LLM 中的特殊应用14.1 长文本归因长文本的特征归因需要处理大量 Token策略描述适用场景分块归因将文本分块每块独立归因长文档层次归因先归因段落再归因词语层次结构摘要归因先摘要再归因极长文本14.2 多模态归因多模态特征归因分析不同模态的贡献模态特征归因方法文本TokenSHAP图像像素LIME音频频谱Kernel SHAP14.3 生成任务归因生成任务的特征归因分析生成 Token 对输入 Token 的依赖defgeneration_feature_attribution(model,input_text,generated_text,tokenizer):生成任务特征归因input_tokenstokenizer.tokenize(input_text)generated_tokenstokenizer.tokenize(generated_text)attributions[]forgen_tokeningenerated_tokens:# 对每个生成 Token 计算输入 Token 的贡献input_idstokenizer(input_text,return_tensorspt)input_idsinput_ids.input_ids.requires_grad_(True)outputmodel(input_ids)gen_token_idtokenizer.convert_tokens_to_ids(gen_token)lossoutput[0,-1,gen_token_id]loss.backward()token_attrinput_ids.grad.abs().squeeze(0)attributions.append(token_attr[:len(input_tokens)].tolist())returnattributions总结特征归因通过计算每个输入特征对模型输出的贡献解释模型的决策过程。LIME 通过局部线性模型近似解释单个预测SHAP 基于 Shapley 值提供理论完备的特征贡献分配。特征归因在模型调试、合规解释和用户信任建立中有重要应用。外部引用LIME 原始论文https://arxiv.org/abs/1602.04938SHAP 原始论文https://arxiv.org/abs/1705.07874Shapley 值基础https://en.wikipedia.org/wiki/Shapley_value特征归因综述https://arxiv.org/abs/2303.04226特征归因框架https://arxiv.org/abs/2303.04226特征归因评估https://arxiv.org/abs/2303.04226特征归因在 NLP 中的应用https://arxiv.org/abs/2303.04226特征归因在医疗中的应用https://arxiv.org/abs/2303.04226LIME 与 SHAP 对比https://arxiv.org/abs/2303.04226特征归因局限性https://arxiv.org/abs/2303.04226