深夜的厨房里,你尝了一口刚出锅的红烧肉——咸了。你端着盘子,脑海里冒出一个念头:“如果刚才少放一勺盐,会不会刚刚好?”这个“如果当初……”的念头,就是反事实思考。人类每天都在做这件事:后悔、复盘、设想另一种可能。但你可能想不到,让机器学会这种“假如当初”的推理,比让它识别一万张猫的照片难得多。 难在哪里?因为“如果少放一勺盐”这句话藏着一个几乎没人注意的前提:你得知道“咸”到底是被什么决定的。盐放多了固然咸,可酱油里也藏着盐,火候大了水分蒸发会让味道更浓,甚至你那天手感偏重还是偏轻都说不准——这些因素错综复杂地纠缠在一起。要回答“假如”,你必须先拥有一张“因果地图”:什么因素通向什么结果。在AI领域,这张地图叫结构因果模型(Structural Causal Model,SCM);在这张地图上做“假如……”的推演,就叫结构反事实(Structural Counterfactual)。 本文就用一次“做菜复盘”的经历,带你走完结构反事实从原理到应用的全旅程:它如何用三步推理改写历史,确定性世界与概率性世界的外推有何不同,以及它如何成为可解释AI、公平性审计背后的隐形引擎。

岗位关联

结构反事实是可解释AI与公平性审计的核心引擎。掌握它,你就能让模型不仅给出答案,还能回答“假如……会怎样”——这正是企业对AI可解释性的硬需求。

目录
  1. 可视化演示
  2. 反事实基本概念
  3. 三步推理框架
  4. 确定性模型外推
  5. 概率性模型外推
  6. 反事实查询类型
  7. 智能应用场景
  8. 挑战与优化
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示最大池化操作的执行过程,池化窗口在输入特征图上滑动,选取每个窗口内的最大值生成输出。

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

最大池化滑动窗口过程 青色高亮区域为当前池化窗口 橙色标记窗口内选中的最大值位置 y[i,j] = max(x[i:i+k, j:j+k]) 点击下一步观察池化窗口的滑动过程

反事实基本概念

假设你端着一盘红烧肉走出厨房,尝了一口——咸了。你立刻在脑海中开始重演:如果刚才只放一勺盐而不是两勺,这道菜会是什么味道?请注意,答案不在你手头的任何数据里,而在你脑子里的那张“做菜因果图”中:盐和酱油都通向咸度,火候改变水分,水分又改变咸度……反事实推理的第一步,就是承认:要回答“假如”,必须先拥有一张世界的因果地图。

这张因果图在因果推理领域有个正式名字:结构因果模型(SCM)。它由两部分组成——变量(食材、调料、味道)和结构方程(菜谱规则,比如“咸度 = 0.5×盐量 + 手感”)。变量之间的关系不是模糊的相关,而是明确的函数规则。有了SCM,就能严格定义反事实:设当前世界观测为“盐量 4 勺、咸度 3 分”,那么“如果盐量改为 1 勺”的反事实结果记为 $Y_{X=1}$,它等于用结构方程把 X 换成 1,其他条件不变,重新算出结果。

所以,结构反事实不是简单的“如果没放盐”这种条件句——它是拿着菜谱、锁定手感、只改动盐量这一个旋钮,然后让整个厨房重新运作一遍。菜谱越准确,这个平行厨房的推演就越可信。

Yx=f(x,U)\displaystyle Y_x = f(x, U)
这个式子定义了一个“被改写的平行世界”:把原因 X 固定在 x 值,沿着菜谱规则 f 重新生成结果 Y。U 是隐藏的“手感”,在改写过程中保持不变。
  1. 结果记号 $Y_x$读作“把 X 干预为 x 之后世界里的 Y”,代表改写后的平行宇宙结果。
    YxY_x
  2. 结构方程 $f$菜谱规则,规定了原因如何生成结果,例如“咸度 = 0.5×盐量 + 手感”。
    f(⋅)f(\cdot)
  3. 干预值 $x$在想象中强制设定的原因值,例如 $x=1$ 勺盐。
    x=1x = 1
  4. 隐藏因素 $U$手感、批次等不可观测变量,反事实世界中保持不变。
    UU

三步推理框架

站在灶台前,你要回答“假如少放一勺盐会怎样”,不能凭空想象。你需要一套标准动作:先回想——当时那勺盐到底有多满?(外推);再改写——在想象中把盐勺换成小一号(干预);最后脑补——按照菜谱把后续步骤重新走一遍(预测)。三步缺一不可。

因果推理学者珀尔(Judea Pearl)将这套动作形式化为反事实三步法:外推(Abduction)、干预(Action)、预测(Prediction)。外推是根据观测到的现实,反推出“当时隐藏的手感 U 可能是多少”;干预是在想象中只改动目标原因 X;预测是沿着结构方程重新计算后续所有结果。这三步的完整概率形式如下:

三步法的顺序就是厨房复盘的天然顺序:先回忆,再改写,最后推演。如果跳过回忆直接改写,你会拿“新手的空手”去算“老手颠勺的手艺”,结果自然面目全非——这正是外推必须排在第一位的原因。

P(Yx=y∣e)=∑uP(u∣e)⋅1[f(x,u)=y]\displaystyle P(Y_x = y \mid e) = \sum_{u} P(u \mid e) \cdot \mathbb{1}[f(x, u) = y]
公式展示了做菜复盘的完整流程:先用证据 e(菜咸了)更新对隐藏手感 U 的信念,再把盐量改成 x,最后把所有可能手感下的结果加权平均,得到反事实咸度的概率分布。
  1. 观测证据 $e$现实里看到的事实,比如“盐量 4 勺、咸度 3 分”。
    e={X=4,Y=3}e = \{X=4, Y=3\}
  2. 外推项 $P(u \mid e)$根据证据反推每个候选手感的概率,这是三步法的第一步。
    P(u∣e)P(u \mid e)
  3. 指示函数 $\mathbb{1}[\cdot]$判断某个候选世界能否产生目标结果,能则为 1,否则为 0。
    1[f(x,u)=y]\mathbb{1}[f(x,u)=y]
  4. 加权求和 $\sum_u$把所有候选手感下的结果按概率加权平均,对应步骤二、三。
    ∑u\sum_{u}

确定性模型外推

有的菜谱极度精确,比如分子料理:“咸度 = 1.8×盐克数 + 0.7×酱油毫升数”,没有手感、没有随机性。在这种世界里,你尝到咸度 3 分、盐量 4 克,那么“手感”这个隐藏变量就被唯一锁定了——它不是概率,而是一个确定的数。这就是确定性模型:结构方程不含随机性,外生变量 U 由观测唯一决定。

在确定性模型中,外推步骤不再是一个分布更新,而是直接求解反函数:给定观测结果 y 和已知原因 x,倒推出唯一的隐藏状态 u。这就像分子料理主厨看到成品,能精准说出“你刚才手抖了 0.5 克”——因为方程可逆,答案只有一个。

确定性模型的优点是干净利落:照菜谱做菜永远不会出现“大概、可能”。但它的局限也很明显——现实世界的厨房充满随机与未知,没有人能精确写出每一道菜的确定性方程。于是我们进入概率性模型。

u=f−1(y,x)\displaystyle u = f^{-1}(y, x)
反事实推演在确定性世界格外干脆:一次观测,一个唯一答案。例如咸度 = 0.5×盐量 + U,观测盐量 4、咸度 3,则 U=1;若问“盐量改为 1 会怎样”,代入得咸度 = 0.5×1 + 1 = 1.5。
  1. 反函数 $f^{-1}$菜谱规则的逆向操作,从味道倒推调料,等价于解方程。
    f−1(⋅)f^{-1}(\cdot)
  2. 观测结果 $y$端上桌的成品的咸度值,是已知量。
    y=3y = 3
  3. 已知条件 $x$当时实际放的盐量,是已知量。
    x=4x = 4
  4. 唯一隐藏值 $u$外推得到的确定手感,不再有随机性。
    u=1u = 1

概率性模型外推

真实家庭厨房里,“手感”永远是个谜。你尝出这道菜咸度 3 分,但当时手抖没抖、酱油是不是新开瓶的,你都不确定。于是你脑中有多个可能的“过去”:也许盐多些、酱油少些;也许盐正好、酱油偏咸。每个过去世界都说得通,只是概率不同。这就是概率性模型:外生变量 U 服从一个先验分布。

在概率性模型中,外推从“求唯一解”变成“贝叶斯更新”:用观测证据筛选并加权所有候选世界。那些能复现出“盐量 4、咸度 3”的候选手感被保留,不能复现的被丢弃,然后重新归一化。这个更新过程如下:

如果说确定性外推是“对答案”,概率性外推就是“做判断题”——每个候选世界被打分,最终反事实结论是所有打分的加权平均。这更接近人类真正的“悔不当初”:在无数可能的过去中,权衡出最合理的那个,并给答案附上置信度。

P(u∣e)∝P(u)⋅1[f(x,u)=y]\displaystyle P(u \mid e) \propto P(u) \cdot \mathbb{1}[f(x, u) = y]
后验 = 先验 × 似然。换到厨房语境:先验是你多年做菜的“手感经验分布”,似然筛选是“只保留能做出这盘菜的候选手感”,最后归一化得到更新后的信念。
  1. 先验 $P(u)$对“手感”的长期经验分布,代表做菜前对各种可能手感的判断。
    P(u)P(u)
  2. 似然筛选 $\mathbb{1}[f(x,u)=y]$只保留能复现观测咸度的候选世界,起到过滤作用。
    1[f(x,u)=y]\mathbb{1}[f(x,u)=y]
  3. 正比符号 $\propto$说明当前结果还未归一化,需要除以证据概率使总和为 1。
    ∝\propto
  4. 后验 $P(u \mid e)$更新后的信念分布,作为反事实预测阶段的输入。
    P(u∣e)P(u \mid e)

反事实查询类型

当你问“假如少放盐会怎样”,其实可以拆成四种不同的问法:“一定会变淡吗?”(必然性)、“有没有可能变淡?”(充分性)、“是不是非得少盐才能变淡?”(必要性)、“只要少盐就必然变淡,且只有少盐才变淡?”(充分必要性)。同样是“少放盐”,这四种问法的承诺级别完全不同。

在形式上,这些查询都统一为一个反事实概率:给定证据 e,在干预 X=x 之后,结果 Y 等于 y 的概率有多大。不同的查询类型只是对这个概率施加不同阈值:必然性要求概率为 1,充分性只要求概率大于 0。

同样是“少放盐”,“一定会淡”和“有可能淡”是两个承诺级别。AI 给用户的解释也需要区分:“本可以”(could)用于事后复盘,“必定会”(would)用于强因果推断。把两种问法混为一谈,是反事实应用翻车的最常见原因。

Q=P(Yx=y∣e)\displaystyle Q = P(Y_x = y \mid e)
反事实查询的一般形式:Q 是候选世界中目标结果发生的总概率。Q=1 对应“必定会”(would),Q>0 对应“有可能”(could),必要性则考察反向的“若非”。
  1. 反事实概率 $Q$在全部候选世界里,目标结果发生的总概率,是查询的输出。
    QQ
  2. 必然性(would)当 $Q=1$ 时,回答“一定会发生”,用于严格因果断言。
    Q=1Q = 1
  3. 充分性(could)当 $Q>0$ 时,回答“有可能发生”,用于可能性探索。
    Q>0Q > 0
  4. 必要性判定通过比较互补事件 $P(Y_{x'} \neq y' \mid e)$,考察“没有干预就不会发生”。
    P(Yx′≠y′∣e)P(Y_{x'} \neq y' \mid e)

智能应用场景

现在回到现实世界。银行信贷员拒绝了你,理由是一堆模型分数。你追问:“如果我的收入高一点,会被批准吗?”——银行的风控模型要回答这个“假如”,它需要一个结构因果模型告诉它:收入如何影响还款能力,还款能力又如何影响审批。这就是反事实解释(counterfactual explanation):生成“最小改动导致结果翻转”的假设世界。

反事实解释的核心是计算反事实差异:在当前输入下模型输出什么,在改动后的输入下模型又输出什么,两者的差就是这次改动的效果。若改动的特征是受保护属性(如性别、种族),且差异为零,则模型满足反事实公平——属性本身不改变结果,改变结果的只是与之相关的合法因素。

这些应用本质上是同一种厨房复盘:银行在“收入”旋钮上拧一下,医生在“吸烟”旋钮上拧一下,推荐系统在“点击”旋钮上拧一下——然后看整桌菜的味道如何变化。SCM 越准,“假如”的答案越可信。

Δ(x,x′)=∣Yx−Yx′∣\displaystyle \Delta(x, x') = |Y_{x} - Y_{x'}|
反事实差异衡量“拧动旋钮 x 到 x'”的效果。用在公平性上:如果 x 是性别,Δ=0 意味着干预性别不改变预测结果,模型公平;用于解释性时,我们寻找使 Δ 最大的最小改动。
  1. 实际世界 $Y_x$当前输入下模型的输出,例如“拒绝贷款”。
    YxY_x
  2. 反事实世界 $Y_{x'}$改动关键特征后模型的输出,例如“通过贷款”。
    Yx′Y_{x'}
  3. 差异 $\Delta$两次输出的差距,决定“改动是否有效”以及改动幅度。
    Δ=∣Yx−Yx′∣\Delta = |Y_x - Y_{x'}|
  4. 公平判定若 x 是受保护属性且 $\Delta=0$,则干预不改变结果,模型公平。
    Δ=0\Delta = 0

挑战与优化

可惜,现实世界的菜谱远比红烧肉复杂。一道菜牵涉几十种调料,彼此还互相影响:糖能提鲜、盐能增甜,多一分火候水分蒸发又让一切变浓。当因果图里存在多条路径时,改一个旋钮会沿着好几条线同时传导,结果可能出乎意料——这叫多因果路径与非单调性。你减了盐,却因为酱油咸度没变,咸味依然不减反增。

更棘手的是计算复杂度:因果图中每个变量的每种取值都构成一个候选世界,要对所有组合做外推与预测,组合数随变量数指数级增长。工业场景里变量动辄上百,穷举完全不可行,必须用近似方法:剪枝无关路径、结构化简、蒙特卡洛采样、并行化推理。

面对复杂的菜谱,真正的主厨不会把每种可能组合都端上桌尝一遍,而是挑最关键的几个旋钮、在最可能的几个过去里做复盘——剪枝与近似,才是结构反事实在工业界站稳脚跟的秘诀。

T(N,∣V∣)=O(N×2∣V∣)\displaystyle T(N, |V|) = O\left(N \times 2^{|V|}\right)
复杂度公式中的 $2^{|V|}$ 就是“组合爆炸”:每增加一个变量,候选世界数量翻倍。N 是采样次数,优化的核心是同时压低 N 和有效变量数。
  1. 变量数 $|V|$因果图中的节点总数,每个节点都可能产生分支。
    ∣V∣|V|
  2. 组合数 $2^{|V|}$所有变量取值组合的数量,随变量数指数爆炸。
    2∣V∣2^{|V|}
  3. 采样量 $N$蒙特卡洛近似中随机抽取的样本数量。
    NN
  4. 总复杂度 $O(\cdot)$整体计算量,优化目标是降低指数项的影响。
    O(N×2∣V∣)O(N \times 2^{|V|})

AI 应用场景

贷款拒绝的反事实解释

阶段:可解释AI / 模型解释

解决的问题:传统 SHAP 只告诉“哪个特征贡献大”,但用户真正问的是“如果我怎样做,结果会改变”。反事实解释直接回答“假如月收入增加 20%,贷款会被批准”,给出可行动的改动方案,而非抽象的重要性数字。

具体案例:某消费金融公司用结构因果模型建模“收入→负债率→审批”链路,对每位拒贷用户生成反事实世界:“月收入增至 1.8 万元或负债率降至 35% 时,审批通过”。客服据此给用户提供明确的改善建议,投诉率下降约三成。

招聘模型的反事实公平审计

阶段:公平性审计与合规

解决的问题:传统公平度量(如统计均等)只看结果相关性,无法区分“合理因素”与“歧视因素”。反事实公平要求:若仅改变受保护属性(性别、种族)而其他因果因素不变,预测结果不得改变,从而干净地分离出歧视成分。

具体案例:某招聘平台的简历筛选模型接受反事实审计:对同一份简历构造“性别改为女性”的反事实世界,若模型给出不同结论,则判定存在性别歧视。通过SCM控制学历、经验等合法因素不变,审计团队精确定位到模型对性别特征的过度依赖并重新训练。

个性化医疗的“假如”推演

阶段:个性化决策支持

解决的问题:临床中无法对个体患者做随机对照试验,只能靠观测数据回答“假如患者戒烟,肺功能能恢复多少”。结构反事实为每个病人外推出特有的隐藏体质,再推演干预后的结果,给出个体化预期。

具体案例:AI健康助手用SCM建立“吸烟→肺功能→运动耐量”模型,对特定患者外推其体质特征,回答“假如你戒烟 12 个月,肺活量预估提升 8.3%(95% 置信区间 ±1.2%)”。医生据此与患者共同制定戒烟激励目标。

Python 演示

python50 行
"""结构反事实演示:一个简单的结构因果模型(SCM)菜谱模型:咸度(Y) = 2×盐量(X) + 手感(U)已知观测:盐量=2, 咸度=5,问:"假如盐量为3, 咸度会是多少?""""import numpy as np  class StructuralCausalModel:    """极简结构因果模型:单变量 X -> Y, 带隐藏噪声 U"""     def __init__(self, coef=2.0, noise_std=1.0):        self.coef = coef            # 结构方程系数: Y = coef*X + U        self.noise_std = noise_std  # 手感噪声的标准差     def structure(self, x, u):        """结构方程(菜谱规则): 由原因x和隐藏u推演出结果y"""        return self.coef * x + u     def abduction(self, x_obs, y_obs, n_samples=5000):        """外推: 用贝叶斯筛选反推隐藏噪声U的后验分布"""        # 先验: U ~ N(0, noise_std)        u_samples = np.random.normal(0, self.noise_std, n_samples)        # 似然筛选: 只保留能复现观测咸度的候选手感        y_pred = self.structure(x_obs, u_samples)        mask = np.abs(y_pred - y_obs) < 0.5        return u_samples[mask]     def counterfactual(self, x_obs, y_obs, x_cf, n_samples=5000):        """三步法: 外推 -> 干预 -> 预测"""        u_post = self.abduction(x_obs, y_obs, n_samples)      # 步骤1: 外推        if len(u_post) == 0:            raise ValueError("没有与外推一致的候选世界")        # 步骤2: 干预(直接替换X值) + 步骤3: 按结构方程重新预测        y_cf = self.structure(x_cf, u_post)        return y_cf.mean(), y_cf.std(), u_post  def main():    model = StructuralCausalModel(coef=2.0, noise_std=1.0)    x_obs, y_obs = 2.0, 5.0    # 观测: 盐量2, 咸度5    x_cf = 3.0                 # 反事实: 假如盐量是3    mean, std, u_post = model.counterfactual(x_obs, y_obs, x_cf)    print(f"观测: 盐量={x_obs}, 咸度={y_obs}")    print(f"外推: 隐藏手感 U 后验均值={u_post.mean():.2f}, 标准差={u_post.std():.2f}")    print(f"反事实: 若盐量={x_cf}, 则咸度约为 {mean:.2f}±{std:.2f}")  if __name__ == "__main__":    main()
目的:用三步法(外推→干预→预测)在简单的结构因果模型上回答“假如盐量不同,咸度会怎样”,演示结构反事实从原理到落地的完整流程。
  1. u_samples = np.random.normal(0, self.noise_std, n_samples)先验采样:随机生成大量候选“手感”值。
  2. mask = np.abs(y_pred - y_obs) < 0.5似然筛选:只保留能复现观测咸度的候选手感。
  3. u_post = self.abduction(x_obs, y_obs, n_samples)外推步骤:贝叶斯更新得到后验分布。
  4. y_cf = self.structure(x_cf, u_post)干预+预测:用改动后的盐量与后验手感算出反事实咸度。
  5. print(f"反事实: 若盐量={x_cf}, 则咸度约为 {mean:.2f}±{std:.2f}")输出带置信区间的反事实结论。

常见误区

误区看到菜咸了,推断是盐放多了——这不就是“如果少放盐”的反事实吗?我觉得 P(咸 | 盐多) 和反事实结果是一回事。

正解完全不是一回事。条件概率 P(Y | X=x) 是在世界规则不变的情况下“看到证据后的猜测”;反事实 P(Y_x=y) 是“主动把 X 改成 x 后结构方程的输出”。前者不改动任何东西,后者打破了原有的因果输入。在SCM中,前者是概率计算,后者必须用 do 算子干预。

为何常见:日常语言中“如果……就……”既表示条件假设也表示反事实,初学者容易把统计观察与因果干预混为一谈。

误区反事实不就是把 X 改成 1 再套公式算一遍吗?为什么要先反推 U?直接算不就行了。

正解不先外推 U,就相当于用“平均手感”甚至“错误手感”去推演。但观测已经告诉你这道菜出自某个特定的(未观测)手感,它的信息必须被利用。跳过外推等于丢弃证据,反事实结果会系统性偏离真实值。做菜类比:你必须先猜到刚才那勺盐有多满,才能回答“少放一勺”会怎样。

为何常见:很多教程直接给出 do 操作的公式,把外推步骤隐藏在推导中,让人误以为干预就是反事实的全部。

误区只要有了结构因果模型,观测到结果 Y 就一定能反推出唯一的 U。SCM 不都是这样一对一吗?

正解只有在结构方程可逆且原因固定时,外推结果才唯一。若方程非单调(比如 U 在方程中非线性)、或不同 U 映射到相同 Y(一对多),外推得到的将是一个候选集合。概率性模型正是为这种“无法唯一确定”的真实场景准备的。确定性只是理想特例。

为何常见:教科书常用线性可逆的例子(Y = aX + bU 且 b ≠ 0),给人“外推永远唯一解”的错觉,忽略了非线性与不可逆的现实。

误区模型在男性和女性上的预测准确率一样高,那它一定是公平的吧?反事实公平不就是这个吗?

正解准确率相等是“统计均等”,它只看相关性,仍可能对个体存在结构性歧视。反事实公平要求的是:若受保护属性(性别、种族)本身被干预改变,而其他合法因素保持不变,预测结果不得改变。它用SCM剥离“属性变化”与“伴随变化”,才能真正识别歧视的产生机制。

为何常见:公平性领域术语密集,初学者容易把“群体统计均衡”误认为“个体因果公平”,因为两者的数值指标乍看都在描述“差别不大”。

面试题

Q1. 结构反事实中,“外推”(abduction)步骤的核心任务是?

单选题 · easy

  • A.从观测结果反推隐藏因素← 正确答案
  • B.主动修改原因变量的值
  • C.用模型预测未来的结果
  • D.收集更多训练数据样本

答案:A。外推的目标是根据观测到的结果反推出隐藏的外生变量 U。选项 B 是干预(action),C 是预测(prediction),D 与反事实无关。做菜类比:外推就是尝一口菜,反推刚才的手感与调料配比。

Q2. 在结构因果模型(SCM)中,do(X=1) 表示?

单选题 · easy

  • A.观察到变量 X 的值为 1
  • B.主动干预使 X 取值为 1← 正确答案
  • C.计算 X 等于 1 的概率
  • D.删除变量 X 及其影响

答案:B。do 算子表示主动干预:切断指向 X 的原有因果路径,强制令 X=1。A 是普通观测(条件),C 是概率计算,D 是删除操作。好比做菜时“我决定放一勺盐”,而不是“看到成品猜测盐量”。

Q3. 反事实结果 $Y_x$ 与条件概率 P(Y|X=x) 的关键区别是?

单选题 · mid

  • A.反事实需要干预原因果关系← 正确答案
  • B.条件概率需要构建结构方程
  • C.反事实不需要任何因果模型
  • D.条件概率可以改变世界规则

答案:A。反事实 $Y_x$ 通过 do 算子干预因果结构,而条件概率只做观察、不改变任何机制。B 说反了,条件概率不需要结构方程;C 反事实恰恰需要SCM;D 条件概率不能改变世界规则。

Q4. 在确定性结构模型中,外推步骤的结果是?

单选题 · mid

  • A.一个唯一的隐藏状态值← 正确答案
  • B.一组后验概率分布
  • C.多个等可能的候选状态
  • D.无法从观测中推出状态

答案:A。确定性模型中外生变量 U 由观测结果唯一确定,外推从“分布更新”坍缩为“解方程”。B 属于概率性模型,C 是非可逆方程的情形,D 与确定性模型性质相悖。

Q5. 珀尔反事实三步法的正确顺序是?

单选题 · mid

  • A.外推→干预→预测← 正确答案
  • B.干预→外推→预测
  • C.预测→外推→干预
  • D.外推→预测→干预

答案:A。三步法依次为:外推(反推隐藏状态)、干预(改动原因)、预测(重算结果)。做菜复盘的天然顺序就是先回忆、再改写、后推演。颠倒次序会丢失证据信息或得到错误结果。

Q6. 在概率性模型中,外推得到分布而非唯一值,原因包括?

多选题 · hard

  • A.隐藏因素无法被完全观测← 正确答案
  • B.多个候选世界与观测一致← 正确答案
  • C.结构方程不包含噪声项
  • D.反事实结果不需要外推

答案:AB。概率性模型的噪声 U 不可观测,且多个不同的 U 可能产生同一个观测结果,因此外推结果是候选世界的概率分布。C 说反了(概率模型必有噪声),D 否定了外推步骤的必要性。

Q7. 反事实公平的核心判定条件是?

单选题 · hard

  • A.不同群体预测准确率一致
  • B.受保护属性改变后结果不变← 正确答案
  • C.训练数据不包含敏感属性
  • D.模型在群体间误差差异小

答案:B。反事实公平要求在控制其他因素不变的前提下,干预受保护属性(如性别、种族)不改变预测结果。A 和 D 是统计均等指标,只反映相关性;C 只是数据层面处理,无法保证因果公平。

Q8. 实现结构反事实的主要挑战有哪些?

多选题 · mid

  • A.多条因果路径相互纠缠← 正确答案
  • B.结果可能非单调变化← 正确答案
  • C.组合数量指数级爆炸← 正确答案
  • D.外推步骤可以省略

答案:ABC。多路径会带来混合效应,非单调性导致反直觉结果,变量组合数随因果图规模指数爆炸。D 是错误选项:外推不可省略,它保证反事实预测使用了正确的隐藏状态。

Q9. 为什么外推必须发生在干预之前?

单选题 · mid

  • A.必须先锁定隐藏状态再改写← 正确答案
  • B.干预会改变噪声变量的值
  • C.预测在后是为了降低误差
  • D.外推步骤能让模型更简单

答案:A。外推先锁定与观测一致的隐藏状态 U,干预再改动原因 X,最后带着正确的 U 重新推演。若先干预,U 未被校准,后续预测会带着错误的隐藏状态一路偏差。B 错误(干预不改 U),C 与 D 未触及本质。

Q10. 以下哪些属于结构反事实的查询类型?

多选题 · hard

  • A.必然性判断(would)← 正确答案
  • B.充分性判断(could)← 正确答案
  • C.必要性判断(necessary)← 正确答案
  • D.显著性判断(significant)

答案:ABC。结构反事实的经典查询类型是必然性(Q=1)、充分性(Q>0)与必要性(考察无干预则无结果)。D“显著性”属于统计假设检验概念,不属于反事实查询类型。