小城里有家“云朵面包坊”,店主小竹有个甜蜜的烦恼:抹茶可颂总是不够卖。她翻看销售小票,发现周末和高温天可颂卖得最好——这是“看”出来的规律;她试着把可颂挪到进门最显眼的位置,销量果然涨了——这是“做”出来的结论。可上周六暴雨突至,她只烤了 30 个,11 点就卖光了。深夜收摊时她忍不住想:“如果那天我多烤 50 个,会多卖出多少个?那些失望离开的客人,后来走进隔壁咖啡店了吗?”——这个问题,她永远无法靠再烤一次来验证,因为那个“上周六”已经过去了。 这就是因果推理的三层阶梯:第一层“观察”回答“看到什么”,第二层“干预”回答“做了什么”,第三层“反事实”回答“原本会怎样”。计算机科学家、图灵奖得主 Judea Pearl 将这三层画成了一张地图,每一层都在上一层之上垒起新的能力,也提出下一层永远答不了的问题。读懂这张地图,你就明白为什么“数据多”不等于“懂因果”,也明白 AI 系统要做出真正“懂事”的决策,需要登上第几级台阶。

岗位关联

掌握三层因果阶梯,能帮你在数据分析、模型解释与决策评估中看清“相关、因果与假设”的边界,这是从“会用数据”走向“会做判断”的关键能力。

目录
  1. 可视化演示
  2. 阶梯全景:面包坊的三类问题
  3. 第一层:观察——只看到“一起出现”
  4. 第二层:干预——动手才知道
  5. 第三层:反事实——想象一个未曾发生的世界
  6. 层级鸿沟:上一层答得了,下一层答不了
  7. 推理三步法:重演过去的标准动作
  8. 工程应用:让机器学会“如果当初”
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示因果推理三层阶梯:观察关联P(Y|X)、干预do算子P(Y|do(X))、反事实潜在结果Yx(u),点击按钮切换层级。

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

观察层:关联与条件概率 P(Y|X):观察X后对Y的信念更新 混杂:Z同时影响X和Y产生虚假关联 P(Y|X)≠P(Y|do(X)) 仅凭观察无法区分因果与相关

阶梯全景:面包坊的三类问题

云朵面包坊的店长小竹每天要回答三类问题。第一类:“抹茶可颂什么时候卖得最好?”她翻翻销售小票就能答:周末、天热时。第二类:“如果把可颂挪到门口,会不会卖更多?”她咬咬牙动手挪了一周货架,答案写在销量里。第三类:“上周六要是我多烤了 50 个,会多卖多少个?”——她翻遍所有小票也找不到答案,因为那个“多烤 50 个”的周六从未存在过。

小竹的三类问题,恰好对应图灵奖得主 Judea Pearl 提出的“三层因果阶梯”。第一层叫“观察”,只回答“看到什么与什么一起发生”;第二层叫“干预”,回答“如果我动手改变 X,Y 会怎样”;第三层叫“反事实”,回答“在已经发生的过去里,如果某件事不同,结果会怎样”。这三层不是同一件事的三种问法,而是三种不同强度的因果推理:观察只建立关联,干预把“改变”变成现实,反事实则要求在头脑里构造一个与事实平行、却从未发生的世界。

Pearl 用一个关键洞见把三层钉在一起:每一层都能提出下一层无法回答的问题。第一层回答不了“挪货架会不会有效”,因为数据里只有挪过之后的销量;第二层回答不了“如果当初没挪会怎样”,因为那个对照世界同样从未发生。

小竹站在阶梯下抬头看:最下一层是她每天翻的报表,中间一层是她亲手挪过的货架,最上一层只会在下雨天、生意冷清的间隙里以“如果当初……”的形式冒出来。因果推理的全部魅力,恰恰藏在最难的那一层。

P(y∣x)⟶因果强度递增P(y∣do(x))⟶P(yx∣x′,y′)P(y \mid x) \quad\stackrel{\text{因果强度递增}}{\longrightarrow}\quad P(y \mid do(x)) \quad\longrightarrow\quad P(y_x \mid x', y')
三个式子从“看”到“做”再到“想”,箭头指向因果强度递增的方向。
  1. 观察表达式$P(y \mid x)$ 读作“在给定 X=x 的条件下 Y=y 的概率”。竖线表示“在……条件下”,它描述的是“看到 X 时 Y 的分布”,只含关联信息。
    P(y∣x)P(y \mid x)
  2. 干预表达式$P(y \mid do(x))$ 中的 do(x) 表示“用外力把 X 强行设定为 x”。与条件不同,do 切断了 X 的上游影响,模拟真实世界的动手操作。
    P(y∣do(x))P(y \mid do(x))
  3. 反事实表达式$P(y_x \mid x', y')$ 读作“在已知实际上 X=x'、Y=y' 的前提下,假如当初 X 被设定为 x,Y 等于 y 的概率”。下标 x 标记反事实干预。
    P(yx∣x′,y′)P(y_x \mid x', y')

第一层:观察——只看到“一起出现”

小竹盯着收款机打印的周报,发现一个奇妙规律:气温每升高 1℃,抹茶可颂的销量平均多 0.8 个。“天热让可颂好卖!”她差点喊出来。可稍一冷静,她又犹豫:也许是周末游客多,也许是隔壁咖啡店休息,也许纯粹是巧合。报表只告诉她“一起出现”,却没说“谁推动谁”。

第一层因果阶梯研究的就是这种“一起出现”。数学上,它由条件概率刻画:已知 X 取某个值时,Y 取值的概率分布。这一层不做任何人为改变,只是“看”。观察得到的结论叫“关联”,它可以是因果的征兆,也可以纯粹是巧合或共同原因造成的假象。

小竹看着报表点了点头——她终于明白,报表里那个“0.8 个/℃”的斜率,只是“天热”与“可颂畅销”并肩散步时留下的脚印。脚印再深,也指不出谁在牵着谁。

P(Y=y∣X=x)=P(X=x, Y=y)P(X=x)P(Y=y \mid X=x) = \frac{P(X=x,\,Y=y)}{P(X=x)}
条件概率 = 两者同时出现的概率 ÷ X 出现的概率,它只回答“看到 X 时 Y 更可能是什么”。
  1. 分子联合概率:$P(X=x, Y=y)$ 表示“X 刚好是 x 且 Y 刚好是 y”同时发生。小竹翻报表,数出“高温天且可颂畅销”的日子有多少。
    P(X=x, Y=y)P(X=x,\,Y=y)
  2. 分母边缘概率:$P(X=x)$ 表示“X 刚好是 x”本身发生的概率,作用是归一化,把限定条件化为总概率 1。
    P(X=x)P(X=x)
  3. 整体公式两个概率相除,得到“给定 X=x 时 Y 的分布”。它描述观察到的相伴关系,不含任何人为改变。
    P(X=x, Y=y)P(X=x)\frac{P(X=x,\,Y=y)}{P(X=x)}

第二层:干预——动手才知道

小竹不再猜了。她做了个实验:周一到周三把抹茶可颂放在柜台最角落,周四到周六挪到进门第一排,其余条件不变。一周下来,挪到门口的那三天销量明显更高。这不是“看着天热猜销量”,而是“亲手拧动开关,看结果变化”——这就是第二层阶梯。

干预层的核心概念是 do 运算符。$P(y \mid do(x))$ 读作“把 X 强行设定为 x 之后,Y 的概率”。与第一层的条件概率不同,do 意味着现实中有人按下了按钮:X 不再“自然发生”,而是被外力固定,它原本的“因”(比如天气)对它的影响被切断。此时观察到的 Y 变化,只能归因于干预本身。若存在同时影响 X 和 Y 的混杂变量 Z(比如周末客流),就需要对 Z 做加权调整:

一周实验结束,小竹把货架固定在门口。她尝到了“干预”的甜头:原来做生意,动手做实验比盯着报表猜可靠得多。但她还没意识到,还有一类问题,连实验都救不了。

P(y∣do(x))=∑zP(y∣x,z) P(z)P(y \mid do(x)) = \sum_{z} P(y \mid x, z)\, P(z)
这个公式叫后门调整:先在每个混杂水平下比较效果,再按比例加权平均,把“捣乱变量”的影响抹平。
  1. 行动符号 do(x)表示用外力把 X 强行设定为 x,模拟小竹把可颂搬到门口。此时 X 不再受天气支配,它上游的连边被切断。
    do(x)do(x)
  2. 混杂因子 zZ 是同时影响 X 和 Y 的变量,比如周末客流。不控制 Z,就分不清销量上涨是因为“搬家”还是因为“恰好周末”。
    ∑z\sum_{z}
  3. 加权平均先在每个客流水平 z 下观察 P(y|x,z),再按各水平出现比例 P(z) 加权。平均掉混杂后,剩下的才是干预的纯净效果。
    P(y∣x,z) P(z)P(y \mid x, z)\, P(z)

第三层:反事实——想象一个未曾发生的世界

那个暴雨周六,小竹只烤了 30 个可颂,11 点售罄。深夜她反复盘算:“如果我当时多烤了 50 个,能多卖多少?”她不可能重过那个周六,实验在此失效。但她依然能推理——因为她了解自己的面包、顾客和那条街。她需要在头脑里“重开一家面包坊”,把旋钮拧到“多烤 50 个”,再观察这个平行世界里会发生什么。

这就是第三层阶梯:反事实推理。它的标准形式是嵌套反事实概率:

读作:“在已知现实世界里 X 实际等于 x'、Y 实际等于 y' 的条件下,如果当初把 X 设为 x,Y 等于 y 的概率。”下标 x 是反事实干预的标记,竖线右侧是现实观察的证据。现实与假设同时出现在一个式子里,这正是它与第二层最大的不同。

为什么这个式子这么难?因为现实数据里根本没有“如果”那一栏。我们只观察到 X=x'、Y=y' 的一条轨迹,而 $Y_x$ 描述的是一条从未发生、但结构上可能的轨迹。要从现实轨迹推假设轨迹,必须借助因果模型:弄清 X 与 Y 之间的机制,以及看不见的背景因素如何同时影响二者。有了模型,我们才能在想象中保留现实世界的“底子”,只替换“如果”的那个旋钮。

小竹闭上眼,在脑海中重开了一炉抹茶可颂:多烤的 50 个中大约 47 个会在下午三点前被买走,那天营业额会多 460 元。她知道这些数字来自想象,却比任何报表都让她安心——因为报表上根本没有那 50 个可颂的痕迹,而她依然答了出来。

P(Yx=y∣X=x′,Y=y′)P(Y_x = y \mid X = x', Y = y')
1. 外推: P(u∣x′,y′)2. 行动: do(x)3. 预测: P(y∣x,u)\text{1. 外推: } P(u \mid x', y') \qquad \text{2. 行动: } do(x) \qquad \text{3. 预测: } P(y \mid x, u)
  1. 下标 x(反事实干预)$Y_x$ 表示“假如 X 被强行设定为 x”时 Y 的取值。这是一个想象世界中的操作,现实中可能从未发生过。
    YxY_x
  2. 竖线右侧(现实证据)$X=x',\ Y=y'$ 是我们确确实实看到的现实。反事实推理必须“带着现实证据”去想象,否则就变成纯幻想。
    X=x′, Y=y′X = x',\ Y = y'
  3. 整体含义在已知现实的前提下,问反事实世界里 Y 的取值分布。它把不可能重演的过去,变成可计算的概率。
    P(Yx=y∣X=x′,Y=y′)P(Y_x = y \mid X = x', Y = y')

层级鸿沟:上一层答得了,下一层答不了

一次朋友聚会,有人问小竹:“你那个'多烤 50 个'的答案,是从销售报表里算出来的吧?”小竹摇头。朋友又问:“那是做了十次实验测出来的?”小竹还是摇头。“那你怎么敢信?”小竹说:“因为我知道面包、天气、顾客之间的关系——我脑子里有个面包坊。”

这个故事浓缩了三层阶梯最重要的性质:不可还原性。每一层都能提出下一层“收集再多数据也答不了”的问题。观察层的数据量再大,也只是一堆“看到什么和什么一起出现”;若变量之间存在混杂,$P(y \mid x)$ 与 $P(y \mid do(x))$ 可以相差很远,甚至方向相反——著名的辛普森悖论就是这样:分层前“药看起来有害”,分层后“药明明有效”。而要回答反事实问题,光有干预实验也不够,因为实验无法重演过去。

小竹把三层画在一张纸上,像画店铺的消防疏散图。她忽然明白:报表、实验、想象,每层都是一种获取知识的方式,但上一层永远无法用下一层的手段作弊通关。想回答“如果当初”,就必须登上第三层,没有捷径。

P(y∣do(x))≠P(y∣x)P(y \mid do(x)) \neq P(y \mid x)
不等号两侧的差距,就是“看”与“做”之间的鸿沟;而“做”与“想”之间,还隔着一条更宽的河。
  1. 左侧干预效应:$P(y \mid do(x))$ 表示小竹亲手把可颂搬到门口之后的销量分布,这是“做”出来的规律。
    P(y∣do(x))P(y \mid do(x))
  2. 右侧观察规律:$P(y \mid x)$ 表示只看报表时“天热时可颂卖得好”的规律,这是“看”出来的。
    P(y∣x)P(y \mid x)
  3. 不等号存在周末客流等混杂时,“看”与“做”会得出不同甚至相反的结论。数据再多,也填不平这个不等号。
    ≠\neq

推理三步法:重演过去的标准动作

为了让“头脑里的面包坊”不跑偏,小竹总结了一套重演上周六的动作:第一步“还原”,把当天所有背景条件(暴雨、客流、店员状态)在心里复原;第二步“拧开关”,把“烤 30 个”拧成“烤 80 个”;第三步“看结果”,沿着面包、陈列、销售的因果链条,算出新世界里的销量。这套动作,恰好对应因果推断中的“三步法”。

Pearl 将反事实推理归纳为标准的 “外推–行动–预测” 流程。外推用现实观察反推隐藏因子,行动把模型中的旋钮拧到反事实位置,预测沿着因果机制算出新结果。三者合一,就得到完整的反事实概率:

小竹把三步法写进厨房小黑板:外推——那天到底发生了什么;行动——把开关拧到想问的位置;预测——顺着因果链条看结果。她发现,所谓“反事实生成”,不过是把这三个动作程序化,让机器也能在头脑里“重开一家面包坊”。

P(Yx=y∣X=x′,Y=y′)=∑uP(Y=y∣X=x,U=u) P(U=u∣X=x′,Y=y′)P(Y_x = y \mid X=x', Y=y') = \sum_{u} P(Y = y \mid X = x, U=u)\, P(U = u \mid X=x', Y=y')
公式右侧第一项是“预测”,第二项是“外推”,中间的 X=x 就是“行动”。三步连起来,正好是在想象中重演过去。
  1. 外推(Abduction)$P(U=u \mid X=x', Y=y')$ 用现实观察反推“当时不可见的背景因素 U 是什么”。就像小竹根据“30 个可颂 11 点卖光”,反推当天客流和购买节奏。
    P(U=u∣X=x′,Y=y′)P(U=u \mid X=x', Y=y')
  2. 行动(Action)$do(X=x)$ 把模型中的 X 旋钮拧到反事实取值 x,切断 X 对原本背景的依赖。小竹在想象中把“烤 30 个”改成“烤 80 个”。
    do(X=x)do(X=x)
  3. 预测(Prediction)$P(Y=y \mid X=x, U=u)$ 在外推出的 U 与反事实干预 x 下,沿因果机制算出 Y 的分布,最后对 U 加权求和。
    ∑uP(Y=y∣X=x,U=u) P(U=u∣X=x′,Y=y′)\sum_u P(Y=y \mid X=x, U=u)\, P(U=u \mid X=x', Y=y')

工程应用:让机器学会“如果当初”

后来,云朵面包坊请来一位数据工程师,把小竹的“三步法”搬进了电脑。系统不再只会打印销售周报,还能自动生成这样一句话:“如果上周六多烤 50 个抹茶可颂,预计多卖 47 个、增收 460 元。”小竹第一次觉得,“如果当初”四个字,居然能变成可落地的经营工具。

这就是“反事实生成”的工程形态:给定一个训练好的预测模型和一个现实样本,搜索“最小改动”的特征修改,使模型输出达到目标值。数学上常写成最邻近搜索:

在真实工程中,反事实生成有三类典型用途。一是可解释性:银行拒绝贷款时,系统给出“若月收入提高 5000 元,本可获批”,比单纯给分数友好得多。二是决策评估:在无法大规模 A/B 试验的医疗、政策场景,用因果模型反推“若实施新方案,指标会如何变化”。三是数据增强:为训练集生成反事实样本,让模型见过更多“边缘世界”,减少偏见与过拟合。小竹的面包坊因此出了名,同行来取经时,她指着系统说:“报表告诉我发生了什么,实验告诉我能改变什么,而反事实告诉我——如果当初不同,现在会是怎样。这三句话,就是因果推理的三层阶梯。”

x∗=arg⁡min⁡x′ d(x,x′)s.t.f(x′)=ytargetx^{*} = \arg\min_{x'} \ d(x, x') \quad \text{s.t.} \quad f(x') = y_{target}
在所有能把结果翻转到目标的改动里,挑“最像现实”的那一个——这就是给用户看的反事实解释。
  1. 现实样本与候选样本$d(x, x')$ 衡量从现实世界 x 到假设世界 x' 的改动幅度。目标是最小化这个距离,让解释尽量贴近现实。
    d(x,x′)d(x, x')
  2. 目标约束$f(x') = y_{target}$ 要求候选世界必须让模型给出目标结果,比如“贷款获批”或“销量更高”。
    f(x′)=ytargetf(x') = y_{target}
  3. 全局最优$\arg\min$ 表示在满足约束的所有候选里选出改动最小的那一个,它就是反事实解释。
    arg⁡min⁡x′  d(x,x′)\arg\min_{x'} \; d(x, x')

AI 应用场景

金融信贷反事实解释

阶段:模型可解释性与合规审查

解决的问题:传统黑盒模型只输出“拒绝”或一个风险分数,客户无法理解、监管无法审计;反事实生成能把“拒绝”翻译成可操作的整改建议,这是观察数据和普通 SHAP 值给不了的“如果”式回答。

具体案例:某消费金融公司对被拒贷款用户生成反事实解释:“若每月还款额提高 2000 元,或负债率降低 8 个百分点,本申请将被批准。”用户按建议调整后复贷通过率明显提升,投诉量下降 30%。

医疗决策评估

阶段:治疗方案上线前的因果评估

解决的问题:随机对照试验成本高、伦理受限,无法对所有病人做干预实验;用观察数据加结构因果模型做反事实推理,可估计“若当初采用新疗法,该病人的恢复概率”。

具体案例:对 ICU 患者的历史电子病历构建结构因果模型,对“若在 2 小时内使用抗生素”这一反事实场景做推理,辅助医生在败血症早期做用药决策,既绕开伦理红线,又接近实验的可靠性。

智能推荐因果增强

阶段:推荐系统离线评估与在线实验的桥梁

解决的问题:推荐模型在离线日志上评估的是“看到→点击”的相关性,但上线后“推荐→点击”是干预效应,两者往往不一致;反事实方法可以低成本校准这个偏差。

具体案例:视频平台对每个“未曝光”的候选视频做反事实曝光模拟,预估“若推荐给该用户,点击概率会是多少”,用它替代昂贵的全量 A/B 流量,离线指标与线上收益的相关性提升了 25%。

Python 演示

python49 行
import numpy as np  class LinearSCM:    """线性结构因果模型: Y = alpha * X + U_y, X = U_x"""     def __init__(self, alpha=2.0, noise_scale=1.0):        self.alpha = alpha        self.noise_scale = noise_scale     def observe(self, x):        """生成本次观察, 返回真实世界的一组 (X, Y, U)."""        u_y = np.random.normal(0.0, self.noise_scale)        y = self.alpha * x + u_y        return x, y, u_y     def abduct(self, x, y):        """外推: 由现实观察反推不可见背景因子 U_y."""        return y - self.alpha * x     def predict(self, x, u):        """预测: 在外推出的 U 与反事实干预 x 下计算 Y."""        return self.alpha * x + u     def counterfactual(self, x_obs, y_obs, x_cf):        """三步法: 外推 -> 行动(do X=x_cf) -> 预测."""        u = self.abduct(x_obs, y_obs)        return self.predict(x_cf, u)  def main():    np.random.seed(7)    model = LinearSCM(alpha=2.0, noise_scale=1.0)     x_obs = 2.0    _, y_obs, u_real = model.observe(x_obs)    u_abducted = model.abduct(x_obs, y_obs)    y_cf = model.counterfactual(x_obs, y_obs, 3.0)     print("== 三层因果阶梯: 反事实推演示例 ==")    print("现实: 投入 X=%.1f, 销量 Y=%.2f, 隐藏因子 U=%.2f" % (x_obs, y_obs, u_real))    print("外推: 由现实反推 U=%.2f (与真实 U 一致, 说明机制正确)" % u_abducted)    print("行动: do(X=%.1f) 即假设投入提高到 3.0" % 3.0)    print("预测: 反事实销量 Y_x=%.2f" % y_cf)    print("增量: 多投入 1 单位 -> 多卖 %.2f" % (y_cf - y_obs))  if __name__ == "__main__":    main()
目的:用一个小型线性结构因果模型实现“外推–行动–预测”三步法,回答“如果投入从 2.0 改成 3.0,销量原本会是多少”。
  1. u_y = np.random.normal(0.0, self.noise_scale)随机生成隐藏背景因子,代表天气、客流等看不见的影响。
  2. y = self.alpha * x + u_y因果机制:销量 Y 由投入 X 的线性效应叠加上隐藏因子 U 决定。
  3. def abduct(self, x, y):外推步骤的入口:输入现实观察,输出对隐藏因子的估计。
  4. u = self.abduct(x_obs, y_obs)三步法第 1 步:从“实际投入 2.0、实际销量 y_obs”反推出 U。
  5. return self.predict(x_cf, u)三步法第 2、3 步:把 X 拧到反事实值 3.0,沿机制算出新销量。
  6. model.counterfactual(x_obs, y_obs, 3.0)一次调用回答“若投入 3.0 而非 2.0,销量原本会是多少”。

常见误区

误区报表显示“气温每升高 1℃,抹茶可颂多卖 0.8 个”,那天气就是可颂畅销的原因,只要让天气变热就能提高销量。

正解观察层只给出关联,不区分方向与混杂。可能有一个第三变量(比如周末游客数)同时推高了气温和销量。要看因果,得用第二层的干预实验或因果模型,而不是直接解读相关系数。面包坊里“一起出现”的两个人,未必是“谁拉着谁”。

为何常见:人脑天生倾向把“先后发生”或“一起变化”解释为因果,这是进化留下的快速判断习惯,在统计上却常常出错。

误区都是“给定 X 看 Y”,do(x) 和条件概率应该是一回事,算出来都一样。

正解do(x) 是“用外力把 X 固定为 x”,会切断 X 与其原因的连边;条件 x 只是“碰巧观察到 X=x”,连边还在。存在混杂时两者可以相差很大甚至方向相反,辛普森悖论是经典例证。就像小竹“看到天热时卖得好”与“动手把温度调高”完全是两码事。

为何常见:教材里条件概率写得多,容易把“给定”当成“控制”,忽略了观察与干预在因果结构上的本质差异。

误区反事实问题“如果当初怎样会怎样”和预测问题“明天会怎样”都是推测没发生的事,本质一样。

正解预测未来是沿时间向前推,依据是历史的延续;反事实是“回到过去改写一个条件,再顺着因果机制重演”。它需要现实观察做证据(竖线右侧的 X=x'、Y=y'),再借助因果模型外推隐藏因子。预测不需要“证据加改写”,反事实两者都要。“预测明天卖多少”和“如果上周六多烤 50 个会卖多少”,是两种不同的推理。

为何常见:两者都需要模型推断,初学者容易把“未发生的”一概而论,忽略了反事实特有的“现实锚点”。

误区大数据时代,样本够多、模型够强,反事实问题自然能从数据里学出来。

正解数据只记录“已发生的世界”,反事实问的是“如果世界”的分布。仅凭观察数据,即使无限多,反事实概率也不可识别;必须有结构因果模型和对机制的假设才能计算。小竹翻遍所有报表,也找不到那 50 个不存在的可颂。

为何常见:深度学习的成功让“数据万能”的观念深入人心,忽略了因果问题中“反事实世界没有样本”的硬约束。

误区给样本的特征加一点随机噪声,或者用 GAN 生成几个改动样本,就算反事实生成了。

正解反事实生成要求改动“沿着因果机制”走:改动最小、结果可解释、且能通过模型校验(比如 f(x')=y_target)。随机扰动生成的样本可能与现实脱节,不能作为解释或决策依据。小竹想象中的“多烤 50 个”也严格遵守面包、客流、陈列的因果链条,而不是乱改配方。

为何常见:“生成”一词在生成式 AI 中被泛化,让人误以为只要能造出新样本就是反事实。

面试题

Q1. 三层因果阶梯是以下哪位学者提出的?

单选题 · easy

  • A.图灵奖得主 Judea Pearl← 正确答案
  • B.深度学习之父 Geoffrey Hinton
  • C.强化学习先驱 Richard Sutton
  • D.统计学家 Ronald Fisher

答案:A。三层因果阶梯由 Judea Pearl 在《为什么》等著作中系统提出,他把因果推理分为观察、干预、反事实三层。Hinton 是深度学习代表,Sutton 是强化学习代表,Fisher 是经典统计学派人物,均未提出该框架。记住“珍珠爬阶梯”这个联想即可。

Q2. 以下哪类问题属于因果阶梯的第一层“观察”?

单选题 · easy

  • A.把可颂挪到门口能否提升销量
  • B.天气越热抹茶可颂卖得越多← 正确答案
  • C.若上周六多烤五十个能多卖多少
  • D.降低定价后利润如何变化

答案:B。选项 B 只是“看到天气与销量相伴出现”,属于观察层的关联问题。A 和 D 都涉及动手改变一个变量(挪货架、改价格),属于第二层干预;C 是对未发生过去的假设,属于第三层反事实。区分三层的口诀是:看报表、做实验、想当初。

Q3. 关于 P(y|do(x)) 与 P(y|x),下列说法正确的是?

单选题 · mid

  • A.二者在数值上永远相等
  • B.do(x) 表示被动观察到 X 取值
  • C.存在混杂时二者可能相差很大← 正确答案
  • D.do 运算无需切断上游依赖

答案:C。do(x) 是人为固定 X 并切断其上游依赖,而 P(y|x) 只是被动观察。当存在混杂变量时,两者可以相差很大甚至方向相反(辛普森悖论),所以 C 正确、A 错误;B 混淆了条件与干预,D 与 do 的定义相悖。

Q4. 反事实推理的三步法正确顺序是?

单选题 · mid

  • A.行动-外推-预测
  • B.外推-行动-预测← 正确答案
  • C.预测-行动-外推
  • D.外推-预测-行动

答案:B。标准流程是“外推–行动–预测”:先用现实观察反推隐藏因子 U,再把 X 拧到反事实取值,最后沿机制算出 Y 的分布。顺序改变会导致推理失去“现实锚点”,所以只有 B 正确。可以联想小竹:先还原现场,再拧开关,最后看结果。

Q5. 嵌套反事实概率 P(Y_x=y | X=x', Y=y') 中,下标 x 的含义是?

单选题 · mid

  • A.反事实干预将 X 设为 x← 正确答案
  • B.现实中 X 的实际取值
  • C.Y 的目标期望取值
  • D.混淆变量的取值

答案:A。下标 x 标记的是“反事实干预”,即想象中把 X 强行设定为 x;现实中 X 的实际值是竖线右侧的 x'。Y 的目标值由等号左边的 y 表达,混淆变量不在这个记号中。记住“下标是假设,竖线右边是现实”。

Q6. 为什么观察数据无法回答反事实问题?

单选题 · hard

  • A.观察数据缺少未发生世界的轨迹← 正确答案
  • B.观察数据包含的样本量太少
  • C.观察数据存在测量误差
  • D.观察数据无法拟合复杂模型

答案:A。反事实问的是“如果世界”的事件,而观察数据只记录了现实世界中已发生的轨迹,根本没有“如果”那一列。无论样本量多大、模型多强、测量多准,缺失的信息不会自动补全,必须借助结构因果模型和假设才能外推,因此 A 正确。

Q7. 辛普森悖论说明的核心问题是?

单选题 · mid

  • A.分层越多结果一定越准
  • B.样本量越大悖论越明显
  • C.观察与干预结论可能方向相反← 正确答案
  • D.反事实问题可以用分层解决

答案:C。辛普森悖论指分层前后结论反转,本质是混杂变量导致的,它说明观察层的 P(y|x) 与干预层 P(y|do(x)) 可能方向相反。分层本身不会消除悖论,反而需要正确识别混杂并用干预公式调整,故 C 正确、A 和 D 错误。

Q8. 以下哪些属于第三层“反事实”能回答、下层答不了的问题?

多选题 · mid

  • A.若当初没吸烟病人现在是否更健康← 正确答案
  • B.天气炎热时可颂销量是否更高
  • C.若上周六多烤五十个营业额增量← 正确答案
  • D.把可颂挪到门口后销量是否提升

答案:AC。A 和 C 都改写了“已经发生的过去”,属于反事实问题;B 是观察层的相关性;D 是干预层的实验问题。反事实问题的标志是“事件已经发生,但我们问一个与现实不同的假设版本”。

Q9. 关于 do 运算符,下列哪些说法正确?

多选题 · hard

  • A.do(x) 模拟人为固定 X 的操作← 正确答案
  • B.do(x) 切断 X 与上游原因连边← 正确答案
  • C.do(x) 与条件概率永远等价
  • D.do(x) 表达干预层的因果效应← 正确答案

答案:ABD。do(x) 表示现实中人为固定 X 并切断其上游依赖,用来表达干预效应,因此 A、B、D 正确。C 错误:do(x) 与 P(y|x) 只在无混杂等特殊情况下才可能相等,一般并不等价。可以联想“拧开关”与“看开关”的区别。

Q10. 在反事实三步法公式中,P(U=u | X=x', Y=y') 这一项的作用是?

单选题 · extreme

  • A.用现实观察反推隐藏背景因子分布← 正确答案
  • B.直接计算目标结果 Y 的期望值
  • C.对 X 施加反事实干预操作
  • D.消除因果模型中的观测噪声

答案:A。这一项是“外推”步骤,它利用现实中观察到的 X=x'、Y=y' 反推隐藏背景因子 U 的后验分布,为后续的反事实预测提供“现实底子”。B 属于预测步骤的作用,C 属于行动步骤,D 不是该公式的功能。三步各司其职,外推先于行动与预测。