杭州城西有家小面馆,老板阿福最近很焦虑:外卖平台上的「算法推荐」一直不给他家流量,订单少得可怜。他打电话问平台客服,得到的答复只有一句「您的店铺综合评分未达标」。阿福不服气:到底是哪里不达标?涨评分?降价格?还是缩短出餐时间?客服答不上来,但平台里的可解释 AI 模块悄悄生成了一封「建议信」——不是泛泛而谈的评分报告,而是一组具体的「假如」:假如把人均客单价从 32 元降到 28 元,订单会涨;假如把出餐时长从 45 分钟压到 30 分钟,订单也会涨;假如把「招牌牛肉面」改成「热销套餐」,订单同样会涨。这就是一个个「改写现实」的假设,AI 圈称之为反事实解释。而当改写方案不止一种、且彼此差异很大时,就轮到了本文的主角——DiCE 多样化反事实。 把 AI 的决策想象成一道门槛:现在你的样本站在门槛之外,反事实解释就是告诉你「往哪个方向迈几步能跨进去」。DiCE 更进一步,它不满足于只给一条路,而是同时给出多条方向不同、但都算可行的路线,让你在现实约束中自由挑选。这篇文章就用阿福面馆的故事,带你从零看懂 DiCE 的原理、公式与工程落地。

岗位关联

学习 DiCE 多样化反事实解释,是 AI 从业者从「只给预测结果」升级到「给出可行动决策建议」的关键技能,在信贷风控、医疗诊断等高风险场景中直接决定产品的可信度与合规性。

目录
  1. 可视化演示
  2. 反事实认知
  3. XAI背景
  4. DiCE核心目标
  5. 损失函数设计
  6. 生成算法
  7. 因果约束
  8. 评估调优
  9. 工程落地
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示DiCE反事实解释核心机制:多样化生成演示从原始样本到多条不同反事实路径的生成过程;五维评价展示有效性/近度/多样性/稀疏性/因果性的评分雷达;DPP优化展示行列式点过程度量反事实集合多样性的矩阵计算。

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

多样化反事实生成 原样本→多路径反事实→预测翻转 DiCE 从单一反事实到多样化反事实集合生成

反事实认知

阿福的店在平台的数据世界里是一只红色小点,站在「流量门槛」外的拒单区。平台客服只甩给他一句「评分未达标」,而解释模型里有一个特别的方向——反事实解释——会给他另一种回答:「假如你的出餐时长从 45 分钟降到 30 分钟,这家店就能跨过门槛。」这不再是冷冰冰的宣判,而是一个可以着手改写的「假如」。

反事实解释的本质是「改写特征、翻转预测」。它不问「为什么拒」,而问「怎样改才能不拒」。与传统的特征重要性分析(哪个变量最重要)不同,反事实给出的是一个具体可操作的「假如」。一个规范的反事实必须同时满足两个条件:

阿福第一次觉得,AI 不是在敷衍他——它真的在说「假如」。但问题来了:平台客服只给了一条建议「降价」。降价伤利润,这条路不一定走得通。他真正需要的是多条不一样的路。

dist(x,c)≤ϵ且f(c)≠f(x)\text{dist}(x, c) \le \epsilon \quad \text{且} \quad f(c) \ne f(x)
公式说:改动后的样本 c 既要离原始样本 x 足够近(不能天马行空),又要让模型预测结果翻转(从拒到批)。
  1. 原始样本$x$ 是阿福店铺当前的特征向量,$f(x)$ 是模型给出的「低流量」预测。
    x=(客单价,出餐时长,评分,… ),f(x)=拒x = (\text{客单价}, \text{出餐时长}, \text{评分}, \dots), \quad f(x) = \text{拒}
  2. 反事实样本$c$ 是改动后的特征向量,要求 $f(c)$ 与 $f(x)$ 不同。
    c=(客单价′,出餐时长′,评分′,… ),f(c)=批c = (\text{客单价}', \text{出餐时长}', \text{评分}', \dots), \quad f(c) = \text{批}
  3. 邻近约束$\text{dist}(x, c) \le \epsilon$ 表示改动不能太大,否则建议没有参考价值。
    dist(x,c)=特征改动总量≤ϵ\text{dist}(x, c) = \text{特征改动总量} \le \epsilon

XAI背景

面馆所在的街区不止阿福一家被算法点评。隔壁奶茶店、炸鸡店都收到过「未达标」的通知。大家愤怒地质问:凭什么?于是平台被要求「把话说清楚」——这就是可解释 AI(XAI)诞生的现实压力:用户有知情权,监管有审计需求。

机器学习模型越强大越像黑箱。全局解释能说明模型整体靠什么判断,但对单个用户「我为什么被拒」帮助有限;局部解释聚焦单个样本,而反事实正是局部解释中最面向行动的一类。早期研究最关心的是「最小反事实」——在所有能让预测翻转的改动里,找离原始样本最近的那一个:

但阿福发现,最省事不等于最适合:平台给的「降价」改动量确实最小,可一旦降价利润就没了。他想要的是一张「方案菜单」——有几条差异足够大的路,让他结合现实条件挑选。

c∗=arg⁡min⁡c:f(c)≠f(x)dist(c,x)c^{*} = \arg\min_{c: f(c) \ne f(x)} \text{dist}(c, x)
最小反事实相当于顾问只给出「最近的一步」,但这一步未必是最容易走的一步。
  1. 候选集合约束条件 $f(c) \ne f(x)$ 圈定所有能翻盘的改动方案。
    C={c∣f(c)≠f(x)}\mathcal{C} = \{ c \mid f(c) \ne f(x) \}
  2. 距离函数$\text{dist}(c, x)$ 量化改动幅度,改动越少越好。
    dist(c,x)→min⁡\text{dist}(c, x) \to \min
  3. 最优解$c^{*}$ 是距离最小的那个方案,即「最省事的翻盘方案」。
    c∗=arg⁡min⁡c∈Cdist(c,x)c^{*} = \arg\min_{c \in \mathcal{C}} \text{dist}(c, x)

DiCE核心目标

阿福终于遇到了一位真正懂行的顾问——DiCE。它不多废话,直接甩给阿福一张「方案菜单」:方案一,压低客单价并把出餐时长压到 30 分钟;方案二,把招牌菜换成平台热销品类,同时增加满减;方案三,通过改善包装与口味提升好评率,并延长营业时段。三条路彼此完全不同,但都能把店铺送到门槛另一边。

DiCE 是 Diverse Counterfactual Explanations 的缩写,由 Mothilal 等人于 2020 年提出。它的核心思想是:一次性生成 k 个反事实样本,使它们同时满足三个目标——邻近性(每一条都尽量少改动)、多样性(彼此尽量不同)、可行性(符合现实约束)。DiCE 把三目标写进一个损失函数:

阿福看着这三条路,心里踏实了:DiCE 不逼他硬走「降价」独木桥,而是把「改菜单」「提服务」这些差异很大的选择摊开。他现在要做的,是看看哪条路最不违背自己的现实。

min⁡c1,…,ck1k∑i=1kdist(ci,x)⏟邻近性+λ⋅dpp_diversity(c1,…,ck)⏟多样性+μ⋅infeasibility(c1,…,ck)⏟不可行性\min_{c_1,\dots,c_k} \underbrace{\frac{1}{k}\sum_{i=1}^{k} \text{dist}(c_i, x)}_{\text{邻近性}} + \lambda \cdot \underbrace{\text{dpp\_diversity}(c_1,\dots,c_k)}_{\text{多样性}} + \mu \cdot \underbrace{\text{infeasibility}(c_1,\dots,c_k)}_{\text{不可行性}}
损失函数像一位厨师在配比三种调料:少改、多花样、可落地,缺一不可。
  1. 邻近性项$\frac{1}{k}\sum_{i=1}^{k} \text{dist}(c_i, x)$ 是 k 个方案到原始样本的平均距离。
    平均距离=1k[dist(c1,x)+⋯+dist(ck,x)]\text{平均距离} = \frac{1}{k} \left[ \text{dist}(c_1,x) + \cdots + \text{dist}(c_k,x) \right]
  2. 多样性项$\text{dpp\_diversity}$ 用行列式点过程度量方案间的差异,越大越好。
    dpp_diversity(c1,…,ck)=det⁡(K)\text{dpp\_diversity}(c_1,\dots,c_k) = \det(K)
  3. 不可行性项$\text{infeasibility}$ 表示方案违反现实约束的程度,越小越好。
    infeasibility≥0,越接近 0 越可行\text{infeasibility} \ge 0, \quad \text{越接近 0 越可行}
  4. 平衡系数$\lambda$ 与 $\mu$ 控制三项的相对权重。
    λ↑⇒方案更多样,μ↑⇒方案更可行\lambda \uparrow \Rightarrow \text{方案更多样}, \quad \mu \uparrow \Rightarrow \text{方案更可行}

损失函数设计

顾问虽然给了三条路,但阿福心里犯嘀咕:方案一说「客单价降 4 元」,方案二说「出餐时长压 15 分钟」——一个是元、一个是分钟,怎么放在一起算「改动总量」?这就像问「3 斤面粉和 2 筐碗哪个更多」,得先统一单位。

机器学习特征同样量纲混杂:收入按万元、信用分按百分制、年龄按岁数。若直接算欧氏距离,数值大的特征会霸占距离。DiCE 采用平均绝对偏差(MAD)做标准化——用每个特征自身的内在波动幅度作分母,这样「降价 4 元」和「缩短 15 分钟」才能放到同一杆秤上比较:

有了 MAD 这杆秤,阿福总算明白「降价 4 元」和「缩短 15 分钟」是可以换算的:哪个改动在它自己的波动尺度里更大,哪个就付出更多「改动代价」。DiCE 正是用这种统一刻度去挑选总代价最小的方案组合。

dist(c,x)=∑j=1d∣cj−xj∣MADj,MADj=median(∣Xj−median(Xj)∣)\text{dist}(c, x) = \sum_{j=1}^{d} \frac{|c_j - x_j|}{\text{MAD}_j}, \quad \text{MAD}_j = \text{median}\left( |X_j - \text{median}(X_j)| \right)
MAD 是数据的中位数绝对偏差,比标准差更能抵抗异常值,适合真实业务里常见的偏态分布。
  1. 分子$|c_j - x_j|$ 表示第 $j$ 个特征的改动量。
    ∣cj−xj∣=新值−原值 的绝对值|c_j - x_j| = \text{新值} - \text{原值} \text{ 的绝对值}
  2. 分母$\text{MAD}_j$ 是特征 $j$ 在整个数据集上的典型波动幅度。
    MADj=median(∣Xj−median(Xj)∣)\text{MAD}_j = \text{median}(|X_j - \text{median}(X_j)|)
  3. 无量纲化每个特征先除以自己的 MAD,等于把改动量换算成「以多少个典型波动为单位」。
    ∣cj−xj∣MADj=改动了多少个典型波动\frac{|c_j - x_j|}{\text{MAD}_j} = \text{改动了多少个典型波动}

生成算法

方案菜单上的三条路,是顾问从几百个随机脑暴的候选里精挑细选出来的。怎么保证「三条差异尽量大」?顾问的办法很妙:先想出一堆点子,再一条条往菜单上加——每加一条,都要确保它和已有条目「撞车最少」。

DiCE 的搜索分两步:第一步用随机搜索(或遗传算法)采样大量候选反事实,再用 KD 树加速近邻查询;第二步用贪心策略从候选中挑出 k 个,使「邻近 + 多样」的分数最高。多样性用什么来度量?行列式点过程(DPP,Determinantal Point Process):

阿福看到顾问的「菜单算法」顿时放心了:它不是随便挑三条最顺眼的,而是保证「降价流」「改菜单流」「提服务流」三条路互不重叠。多样化的好处是——哪怕某一条路走不通,另外两条仍然活着。

Kij=exp⁡(−∥ci−cj∥22σ2),dpp_diversity(C)=det⁡(K)K_{ij} = \exp\left( -\frac{\|c_i - c_j\|^2}{2\sigma^2} \right), \quad \text{dpp\_diversity}(C) = \det(K)
两个方案越相似,$K_{ij}$ 越接近 1,整体行列式越小;方案越是互不相同,行列式越大。
  1. 核矩阵元素$K_{ij}$ 用高斯核度量方案 $c_i$ 与 $c_j$ 的相似度。
    Kij∈(0,1],距离为 0 时取 1K_{ij} \in (0, 1], \quad \text{距离为 0 时取 1}
  2. 行列式$\det(K)$ 衡量这 k 个向量在特征空间中张成的「体积」。
    det⁡(K) 越大 ⇒方案越分散\det(K) \text{ 越大 } \Rightarrow \text{方案越分散}
  3. 贪心选择逐个加入候选,每次选使「邻近得分 + 多样性增益」最大的那一个。
    next=arg⁡max⁡c[−dist(c,x)+λ⋅det⁡(Kchosen∪{c})]\text{next} = \arg\max_{c} \left[ -\text{dist}(c,x) + \lambda \cdot \det(K_{\text{chosen} \cup \{c\}}) \right]

因果约束

顾问的菜单上有一条让阿福哭笑不得:「把店铺评分直接改成 4.9 分」——这违反平台规则,也违背良心。现实世界的可解释建议必须遵守「能不能动」的规矩:价格能改、出餐时长能改、评分只能靠努力慢慢涨,而「开店年限」这种字段谁都改不了。

这就是反事实解释里的可行性(feasibility)与因果约束。DiCE 允许使用者声明哪些特征可行动(actionable)、哪些不可变。更进一步,若已知特征间的因果依赖关系(如「学历影响收入」),就不能只改收入不动学历——违反因果结构的反事实在现实中根本无法实现。设不可变特征集合为 $\mathcal{F}_{\text{fixed}}$,硬约束与软惩罚如下:

阿福这下明白,为什么顾问的菜单从不出现「刷评分」这种馊主意——DiCE 把平台规则和伦理底线写进了损失函数。真正能落地的方案,是「我能做到」和「AI 建议」的交集。

cj=xj, ∀j∈Ffixed;infeasibility(c,x)=1d∑j=1d1[cj≠xj∧j∈Ffixed]c_j = x_j, \ \forall j \in \mathcal{F}_{\text{fixed}}; \qquad \text{infeasibility}(c, x) = \frac{1}{d} \sum_{j=1}^{d} \mathbf{1}\left[ c_j \ne x_j \wedge j \in \mathcal{F}_{\text{fixed}} \right]
前半句是硬约束:不可变特征必须保持原值;后半句是软惩罚:若改了不可变特征,就记一次违规并计入损失。
  1. 硬约束$c_j = x_j$ 强制不可变特征在反事实中等于原值。
    年龄′=年龄,性别′=性别\text{年龄}' = \text{年龄}, \quad \text{性别}' = \text{性别}
  2. 示性函数$\mathbf{1}[\cdot]$ 内部条件为真时取 1,否则取 0。
    1[cj≠xj∧j∈Ffixed]∈{0,1}\mathbf{1}[c_j \ne x_j \wedge j \in \mathcal{F}_{\text{fixed}}] \in \{0, 1\}
  3. 违规比例infeasibility 统计违反约束的特征占比,值越大方案越不可行。
    infeasibility∈[0,1]\text{infeasibility} \in [0, 1]

评估调优

顾问干得好不好,阿福心里有杆秤:第一,每条方案是不是真能把店铺送过门槛?第二,三条方案是不是真不一样?第三,每条要付出多大代价?这三点,恰好就是 DiCE 的三大评估维度。

学术与工程中常用三类指标评价反事实解释:有效性(validity)、多样性(diversity)、邻近性(proximity)。它们分别对应「预测翻转成功比例」「方案间平均距离」「与原始样本的平均距离」。配合 $\lambda$、$\mu$ 等超参数,可以在三类指标间取舍:

阿福拿着这三把尺子复审顾问的方案:每条都翻盘成功(有效性 100%),三条方向各不相同(多样性高),改动代价也都在可接受范围(邻近性好)。他放心地在菜单上勾选了「改菜单 + 满减」这条。

validity=1k∑i=1k1[f(ci)=ydesired];diversity=1k(k−1)∑i≠jdist(ci,cj)\text{validity} = \frac{1}{k} \sum_{i=1}^{k} \mathbf{1}\left[ f(c_i) = y_{\text{desired}} \right]; \qquad \text{diversity} = \frac{1}{k(k-1)} \sum_{i \ne j} \text{dist}(c_i, c_j)
有效性看「翻盘成功率」,多样性看「方案彼此距离的平均值」。
  1. 有效性统计 k 个方案中预测达到期望结果的比例。
    validity=翻盘成功数k\text{validity} = \frac{\text{翻盘成功数}}{k}
  2. 多样性对任意两两方案的距离求平均,越大说明花样越多。
    diversity=1k(k−1)∑i≠jdist(ci,cj)\text{diversity} = \frac{1}{k(k-1)} \sum_{i \neq j} \text{dist}(c_i, c_j)
  3. 调参权衡增大 $\lambda$ 提升多样性但会牺牲邻近性;增大 $\mu$ 提升可行性但会压缩搜索空间。
    λ↑⇒diversity↑, proximity↓\lambda \uparrow \Rightarrow \text{diversity} \uparrow,\ \text{proximity} \downarrow

工程落地

阿福的面馆故事,其实每天都在银行、医院、电商平台里重演。一个被拒贷的年轻人、一位被建议调整生活方式的患者、一家转化率低迷的网店——他们都像阿福一样,希望听到「几条可行的路」,而不是一句冰冷的「不合格」。

在信贷风控中,DiCE 为被拒客户生成多样化的「提额路径」:提高月收入证明、降低负债率、增加担保人等,同时把年龄、婚姻状况等设为不可变特征。在医疗辅助诊断中,DiCE 结合因果约束给出「增加运动量」「调整饮食结构」等行为建议,配合医生解读后发给患者。工程落地要解决三件事:一是与模型服务集成——每个预测请求后异步生成反事实;二是解释稳定性——模型重训练或数据漂移后,昨天的「降 2 元即可翻盘」今天可能失效,需定期重新校验解释的有效性;三是文案生成——把反事实特征差异转成用户可读的自然语言。三者共同决定解释是否真正被业务采纳。

无论是面馆阿福,还是被拒贷的年轻人,反事实解释的真正价值不在于「解释过去」,而在于「点亮未来」。DiCE 用多样化的「假如」,把黑箱 AI 变成了一位能给出多条出路的顾问——这正是可解释 AI 走进真实世界的姿势。

AI 应用场景

银行信贷拒贷解释

阶段:模型上线后的解释与合规服务

解决的问题:传统风控只返回「拒贷」二字,客户投诉率高,监管也要求提供拒贷理由。DiCE 结合可行动特征(收入、负债率)一次性生成 k 条不同的翻盘路径:提高收入证明、降低负债率、增加担保人等,让客户直观看到「我该做什么」而不是「我被否定了」。这就像阿福终于拿到一张有多个选项的方案菜单,而不是一句冷冰冰的「评分未达标」。

具体案例:某消费金融公司在信贷产品中接入 DiCE 后,客服对话里「为什么拒绝我」「怎样能获批」的重复咨询量下降约 35%,监管抽样合规通过率明显提升。

慢病管理行为建议

阶段:预测之后的个性化干预

解决的问题:糖尿病风险模型只能给出「高风险」标签,医生难以给出千人千面的行动建议。DiCE 以运动量、饮食热量等可行动特征生成多样化的生活方式反事实,兼顾多样性与可行性。就像面馆顾问不会建议阿福「刷评分」,医疗场景也不会建议患者「改变年龄」,所有建议都在因果约束内生成。

具体案例:某互联网医院将 DiCE 嵌入健康管理 App,用户能看到「每周多走 3 次、每次 30 分钟」或「晚餐热量降低 200 千卡」等不同行动套餐,方案选择率较单一建议提升约 2 倍。

电商转化率诊断

阶段:增长分析与运营决策支持

解决的问题:转化率模型只说「该用户不太可能买」,运营不知道从哪里下手。DiCE 给出多样化的运营动作:发券、改推荐位、调整详情页首屏等,按成本与预期收益排列成一张「行动菜单」,让运营像阿福挑方案一样结合预算做决定。

具体案例:某电商团队用 DiCE 分析流失用户,结合成本约束输出「满减券」「次日达」「会员体验包」三套互不重叠的方案,A/B 测试中转化率提升约 12%。

Python 演示

python81 行
"""简易 DiCE 演示: 为信贷模型生成多样化反事实解释"""import numpy as np # ---------- 1. 准备合成数据与训练模型 ----------np.random.seed(42)N = 800income = np.random.rand(N) * 10credit = np.random.rand(N) * 10logit = 0.6 * income + 0.7 * credit - 6.0  # 模拟风控打分y = (1 / (1 + np.exp(-logit)) > 0.5).astype(int)X = np.column_stack([income, credit])  def predict_proba(x):    z = 0.6 * x[0] + 0.7 * x[1] - 6.0    return 1 / (1 + np.exp(-z))  def mad(col):    return float(np.median(np.abs(col - np.median(col))))  MAD = np.array([mad(X[:, 0]), mad(X[:, 1])])  def dist(c, x):    return float(np.sum(np.abs(c - x) / MAD))  def dpp_diversity(C, sigma=1.0):    K = np.zeros((len(C), len(C)))    for i in range(len(C)):        for j in range(len(C)):            K[i, j] = np.exp(-np.sum((C[i] - C[j]) ** 2) / (2 * sigma ** 2))    return float(np.linalg.det(K))  def generate_dice(x, k=3, n_trials=300, gamma=2.0, actionable=(True, True)):    x = np.array(x, dtype=float)    pool = []    for _ in range(n_trials):        c = x.copy()        for f in range(2):            if actionable[f] and np.random.rand() < 0.5:                c[f] += np.random.normal(0, 1.5) * MAD[f]        if predict_proba(c) > 0.5:            pool.append(c)    if not pool:        return None    pool = np.array(pool)    chosen = []    for _ in range(min(k, len(pool))):        scores = np.array([-dist(c, x) for c in pool])        if chosen:            for i, c in enumerate(pool):                cand = np.vstack(chosen + [c])                scores[i] += gamma * dpp_diversity(cand)        best = int(np.argmax(scores))        chosen.append(pool[best])        pool = np.delete(pool, best, axis=0)    return np.array(chosen)  def main():    x0 = np.array([1.8, 1.8])    print("原始样本: 收入=%.1f 信用=%.1f 获批概率=%.2f"          % (x0[0], x0[1], predict_proba(x0)))    cfs = generate_dice(x0, k=3)    if cfs is None:        print("没有找到反事实, 请调大 n_trials")        return    for i, c in enumerate(cfs):        direction = ("收入上升" if c[0] > x0[0] else "收入下降")        direction += " + " + ("信用上升" if c[1] > x0[1] else "信用下降")        print("反事实%d: 收入=%.1f 信用=%.1f 概率=%.2f 改动=%.2f"              % (i + 1, c[0], c[1], predict_proba(c), dist(c, x0)))        print("  方向: " + direction)  if __name__ == "__main__":    main()
目的:用随机搜索 + DPP 多样性贪心选择,为二分类信贷模型生成一组互不相同且可行的反事实解释,回答「怎样改才能获批」。
  1. logit = 0.6 * income + 0.7 * credit - 6.0模拟风控打分:收入与信用分越高,获批概率越大
  2. if actionable[f] and np.random.rand() < 0.5:只扰动可行动特征,模拟现实约束
  3. if predict_proba(c) > 0.5:只保留能翻过审批线的候选方案
  4. scores = np.array([-dist(c, x) for c in pool])先按邻近性打分:改动越小得分越高
  5. scores[i] += gamma * dpp_diversity(cand)再追加多样性奖励:与已选方案差异越大越好
  6. best = int(np.argmax(scores))贪心选出得分最高的那个方案
  7. pool = np.delete(pool, best, axis=0)移除已选方案,避免重复入选

常见误区

误区我申请的贷款被拒了,反事实解释说「降负债率就能批」,那负债率高就是我被拒的真实原因,赶紧去降负债就行。

正解反事实解释只是「假设性局部建议」:它说的是「如果特征改成这样,模型输出会翻转」,并不承诺「特征与结果之间存在因果」。被拒的真实原因可能是多个特征与数据的复杂交互,甚至包含模型偏见。要得到因果结论,需要结构因果模型或随机实验。好比面馆顾问观察到「降价能涨单」,这不代表降价就是生意差的病因。

为何常见:自然语言「假如……就……」听起来像因果关系,且解释以「原因」的口吻输出,容易被非技术用户当作因果归因。

误区DiCE 的目标就是多样性拉满,方案之间差得越远越专业,直接把 λ 调到很大。

正解多样性只是三个目标之一,与邻近性、可行性互相拉扯。λ 过大时,方案会为了「彼此不同」而大幅偏离原始样本,生成「把面馆改成健身房」这类无法落地的建议。实际调参要在验证集上同时检查 validity、diversity、proximity,取业务可接受的折中。

为何常见:DPP 行列式公式给人的第一直觉是「越分散越好」,且演示代码往往忽略邻近性下降的代价。

误区反事实就是把特征随便调一调,改到模型输出翻转就行,年龄改小几岁、性别换一下也没关系。

正解真实业务里必须区分可行动特征与不可变特征。年龄、性别、历史违约次数等不可变字段要写进硬约束;违反约束的方案会误导用户甚至引发合规风险。DiCE 通过 infeasibility 惩罚项把「不能动」写进优化目标,就像面馆顾问从不建议阿福「刷评分」。

为何常见:公开数据集的特征多为数值型,没有「能不能动」的标注,新手在玩具数据上跑通后容易忽略现实约束。

误区模型上线时生成的反事实解释存进数据库,以后每次用户提问直接返回,省时省力。

正解模型会随数据分布漂移和定期重训练而变,昨天有效的「降 2 元客单价即可翻盘」,今天可能已失效。工程上要对解释做有效性监控(如定期采样评估 validity),在模型版本更新后重新生成或批量校验解释。这就好比路况变了,去年最快的那条送餐路线今年可能堵死。

为何常见:离线实验时数据静止不动,容易造成「解释永远稳定」的错觉。

面试题

Q1. 反事实解释的核心思想是什么?

单选题 · easy

  • A.找出影响全局预测的关键特征
  • B.给出能翻转预测的最小改动← 正确答案
  • C.展示决策树的完整分类路径
  • D.用代理模型拟合黑箱模型

答案:B。反事实解释回答「怎样改才能让结果翻转」,核心是找出能翻转预测的改动;A 是全局特征重要性,C 是决策树路径,D 是代理模型解释(如 LIME),都不属于反事实的核心思想。好比阿福要的不是「价格最重要」的报表,而是「降价 4 元就能翻盘」的具体改动。

Q2. DiCE 中 DPP 行列式越大说明什么?

单选题 · easy

  • A.候选方案彼此越相似
  • B.候选方案彼此差异越大← 正确答案
  • C.候选方案离原始样本越近
  • D.候选方案数量越少越好

答案:B。DPP 核矩阵的行列式衡量候选集合在特征空间张成的「体积」,行列式越大说明方案越分散、彼此差异越大;相似度越高行列式反而越小,因此 A 错。行列式与邻近性无直接关系,也不代表方案数量,C、D 错。就像顾问菜单上三条路差异越大,行列式才越大。

Q3. MAD 在 DiCE 距离度量中的作用是?

单选题 · easy

  • A.消除不同特征间的量纲影响← 正确答案
  • B.提升分类模型的预测准确率
  • C.加速梯度下降的收敛速度
  • D.减少无标签样本的数量

答案:A。MAD(中位数绝对偏差)作为距离分母,把「元」「分钟」「分」等不同量纲的特征统一到同一个波动尺度上,消除量纲影响;它不参与模型训练,与准确率、收敛速度无关,也不减少样本。就像把斤、两、筐换算成同一杆秤,才能比较哪种改动代价更大。

Q4. 以下哪个特征应设为不可行动?

单选题 · mid

  • A.信用卡的授信额度
  • B.申请人的实际年龄← 正确答案
  • C.每月的消费频次
  • D.优惠券的使用频率

答案:B。不可行动特征指用户无法通过努力或决策改变的字段,年龄是客观属性,应写进硬约束;授信额度、消费频次、优惠券使用频率都可以通过用户行为或申请调整,属于可行动特征。好比阿福的「开店年限」不能临时改,但「出餐时长」可以。

Q5. 增大 DiCE 损失函数中的 λ 参数会带来什么?

单选题 · mid

  • A.方案距离原始样本更近
  • B.方案之间彼此更加相似
  • C.方案之间彼此更加多样← 正确答案
  • D.方案更加违背现实约束

答案:C。λ 是多样性项的权重,λ 增大时损失函数更看重方案间的差异,方案会变得更分散、更多样;同时邻近性项的占比相对下降,方案反而可能离原始样本更远,所以 A、B 错。可行性由 μ 控制,D 错。这就是「多花样」和「少改动」之间的天平。

Q6. 评估反事实解释的有效性应看哪个指标?

单选题 · mid

  • A.方案离原始样本的总距离
  • B.翻盘方案占全部方案的比例← 正确答案
  • C.方案之间距离的方差大小
  • D.训练过程损失函数的值

答案:B。有效性(validity)统计 k 个反事实中预测达到期望结果的比例,本质就是「翻盘成功率」;A 是邻近性指标,C 是多样性指标的变体,D 是训练过程指标,都与有效性无关。就像阿福先确认每条方案是否真能过审批线。

Q7. 反事实解释与因果解释的关系是?

单选题 · hard

  • A.反事实结果必然是真实因果
  • B.反事实是假设性局部建议← 正确答案
  • C.因果解释完全不需要模型
  • D.反事实完全不需要特征

答案:B。反事实解释基于模型,描述「如果特征改动,预测如何翻转」,属于假设性局部建议,不承诺真实因果;得出因果结论需要结构因果模型或随机实验,所以 A 错。因果解释同样需要观测数据支撑,C 错;反事实必须依赖特征,D 错。好比「降价关联涨单」不等于「降价导致涨单」。

Q8. DiCE 的优化目标包含哪些?

多选题 · mid

  • A.邻近性← 正确答案
  • B.多样性← 正确答案
  • C.可行性← 正确答案
  • D.训练速度

答案:ABC。DiCE 的损失函数包含邻近性(方案改动尽量小)、多样性(方案彼此尽量不同)、可行性(方案不违反现实约束)三个目标,通过 λ、μ 平衡;训练速度是工程性能问题,不是优化目标。就像阿福的方案菜单必须「少改、多花样、能落地」。

Q9. 提高反事实解释落地可用性的做法有哪些?

多选题 · hard

  • A.声明不可行动特征集合← 正确答案
  • B.引入先验因果结构约束← 正确答案
  • C.监控模型更新后的失效← 正确答案
  • D.只保留边界上的困难样本

答案:ABC。声明不可行动特征可杜绝「改年龄」这类馊主意;引入因果约束能避免「只改收入不动学历」的矛盾建议;模型更新后需监控解释是否失效并重新生成,这些都是落地关键。D 中「只保留边界样本」会破坏多样性与代表性,不是正确做法。

Q10. 关于 DPP 多样性的说法正确的是?

多选题 · extreme

  • A.用核矩阵行列式度量集合← 正确答案
  • B.核元素越大行列式必然越大
  • C.可与贪心选择近似求解← 正确答案
  • D.与邻近性目标自然完全一致

答案:AC。DPP 通过对相似度核矩阵取行列式来度量集合多样性(A 对);贪心选择可以逐个加入候选、近似最大化行列式增量(C 对)。核元素越大代表越相似,行列式往往越小,B 错;多样性是把点「拉开」,邻近性是「贴近原样本」,两者天然冲突,需 λ 权衡,D 错。