深夜的剧场空无一人,你这位话剧导演还坐在观众席上,望着刚刚谢幕的《罗密欧与朱丽叶》。罗密欧与朱丽叶相恋、殉情,结局凄美。可你的脑海里突然冒出一个挥之不去的念头:“如果罗密欧那天晚上没有走进舞会,这一切还会发生吗?”你很想倒回午夜前的那一刻,轻轻剪去罗密欧入场的那个画面,然后重新播放,看看两位主角是否都能活下来。在因果科学中,这种“对已发生的事假设不同条件”的追问,叫做反事实。 要严谨地回答它,不能靠胡思乱想,而是需要三样东西:一份完整的剧本——结构因果模型,它写下每个角色在什么情境下会做什么决定;演员们在每个岔路口的反应表——潜在响应变量,记录每个背景条件下角色会给什么反应;以及一把能精准剪掉某一帧而不碰其他画面的外科手术剪——do 算子。剧本、反应表、手术剪按“倒带 → 剪辑 → 重播”的流程运作,就构成了反事实的严格数学定义。它也是因果推理这座金字塔的最高一层,支撑着可解释 AI 与安全对齐等前沿方向。

岗位关联

对 AI 从业者而言,反事实定义是让模型回答“假如……会怎样”的理论地基,是构建可解释 AI、做安全对齐的关键数学语言。掌握它,你才能从“看到相关性”升级为“推演因果性”。

目录
  1. 可视化演示
  2. 反事实含义:导演的“假如”之问
  3. 结构因果模型:完整的剧本
  4. 潜在响应变量:演员的“反应表”
  5. 外科手术干预:时光摄影机的“定点剪辑”
  6. 形式化定义:倒带—剪辑—重播
  7. 因果推理层级:看戏的三种境界
  8. 前沿应用:从复盘悲剧到指导未来
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示Pearl因果阶梯三层级(观察-干预-反事实)、反事实三步计算流程(abduction-action-prediction)、以及反事实与干预的本质区别对比。

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

Pearl因果阶梯三层级 L1观察P(y|x) L2干预P(y|do x) L3 cf P(y_x) 反事实是因果推理最高层级,回答假如类问题。

反事实含义:导演的“假如”之问

深夜的剧场,你这位导演看完《罗密欧与朱丽叶》的谢幕,望着空空荡荡的舞台,脑中冒出一个问题:“如果罗密欧没有参加舞会,他们还会殉情吗?”这个念头不请自来,挥之不去。其实每个普通人都做过类似的推导:考砸了想“要是昨晚多复习一小时就好了”,分手了想“如果那天没有说那句话”。生活里这种“事后评判”,在因果科学中有一个正式的名字——反事实。

反事实(counterfactual)字面意思就是“与事实相反”。它描述的是这样的推理结构:已知现实世界中 X 的取值是 x,Y 的取值是 y;现在假设在同一个世界、同样的背景下,把 X 强行改成另一个值 x',那么 Y 会变成什么?注意措辞里的关键词——“同一个世界背景下”。反事实不是去看别人,而是问“同一个个体在另一种剧本里的人生”。

用符号表达,数学家 Pearl 用一个带下标的变量记号 \(Y_{x'}\) 表示“在干预设定 \(X=x'\) 的世界中 Y 的取值”,再用竖线右侧表明这是“已知现实证据”之后的追问。反事实问题可以写成:

你作为导演,剧本里罗密欧入场了(\(X=x\)),两人殉情了(\(Y=y\))。现在你问“如果他不入场(\(X=x'\))会怎样”(\(Y_{x'}\))。这个问句看似简单,但要严谨回答,还需要两件东西:一份完整的剧本,以及演员们的“反应表”。

Yx′=y′  ∣  (X=x,  Y=y)\displaystyle Y_{x'} = y' \;\big|\; (X = x,\; Y = y)
这个式子读作:“在已知 \(X=x\)、\(Y=y\) 的现实中,若强行把 X 设为 \(x'\),则 Y 的取值会变为 \(y'\)。”
  1. 反事实变量 \(Y_{x'}\)下标 x' 是“外科手术式设定值”,代表假如条件被改成 x',这时 Y 会取什么值
    Yx′\displaystyle Y_{x'}
  2. 等号右端 \(y'\)在改动条件之后,Y 将产生的新结果
    =y′\displaystyle = y'
  3. 竖线与括号 \((X=x,\;Y=y)\)竖线右侧是现实证据,即“已经发生的事实”
    ∣(X=x,  Y=y)\displaystyle \mid (X = x,\; Y = y)
  4. 整体联系这个式子把“现实证据”和“假设条件”放进同一个推理框架,这正是反事实区别于普通条件概率的关键
    Yx′=y′  ∣  e\displaystyle Y_{x'} = y' \;\big|\; e

结构因果模型:完整的剧本

你到后台找到道具师,他说:“要回答你的假如之问,先得有一份完整的剧本。”这份剧本不只是台词,而是写清了整部戏的运转规则:谁在什么情境下会做出什么选择、角色的哪些举动由环境决定、哪些不可控的随机因素(比如演员当天的心情)会影响表演。在因果科学中,这份“剧本”叫做结构因果模型(Structural Causal Model,SCM)。

SCM 用三个部分描述世界:外生变量 U 相当于“天意”或“背景”,如天气、演员的随机灵感,它们不由模型内部解释;内生变量 V 是由模型内其他变量决定的状态,如罗密欧是否入场、是否喝下毒药;结构方程 F 是一组规则,说明每个内生变量如何由它的“父变量”和外生变量推出来。举个例子:球赛是否进行这个内生变量 B,由“是否下雨 A”和“场地随机因素 \(u_b\)”共同决定:\(B = (A\ 不下雨)\) 且(场地噪声够好)。

正式地写,SCM 是一个三元组,其中第 i 个内生变量的结构方程为:

有了这样一份“完整剧本”,导演才知道:罗密欧是否参加舞会,是由“邀请函是否送达”(父变量)、“他当天的任性程度”(外生因素)共同决定的。下一步,道具师又拿出一本厚厚的册子——演员们的“反应表”。

M=(U,  V,  F),xi=fi(pai,  ui),i=1,2,…,n\displaystyle M = (U,\; V,\; F),\qquad x_i = f_i(pa_i,\; u_i),\quad i = 1,2,\dots,n
通俗地讲:U 是剧本之外的“随机灵感”,V 是剧本之内的“角色状态”,F 是“每个角色如何被环境和剧情推向下一步”的规则集。
  1. 三元组 \((U,V,F)\)剧本三件套——背景、变量、规则
    M=(U,V,F)\displaystyle M = (U, V, F)
  2. 外生变量 U来自模型外部、不由剧本解释的因素,相当于演员当天的即兴状态
    U={u1,u2,…,un}\displaystyle U = \{u_1, u_2, \dots, u_n\}
  3. 内生变量 V模型内部要被解释的每个角色状态 \(X_i\)
    V={x1,x2,…,xn}\displaystyle V = \{x_1, x_2, \dots, x_n\}
  4. 结构方程 \(x_i = f_i(pa_i, u_i)\)第 i 个变量的取值由其父节点 \(pa_i\)(影响它的变量)和外部随机因素 \(u_i\) 共同决定
    xi=fi(pai,  ui)\displaystyle x_i = f_i(pa_i,\; u_i)

潜在响应变量:演员的“反应表”

道具师从箱子里掏出一本泛黄的册子,封面上写着“演员反应表”。每个演员在册子里都有一页,记录着:“如果当晚收到邀请函,他会入场;如果没收到,他会留在城外。”也就是说,演员在不同剧情分支下会怎么演,早已在表中写得清清楚楚。在因果科学里,这张“反应表”称为潜在响应变量(potential response variable)。

潜在响应的思想是:对于每一个可能的干预值 x,世界都有一个“如果 X=x 时结果是什么”的答案,记为 \(Y_x\)。这个答案对每个背景 u(相当于某个具体演员的独特气质加上当天状态)都存在。现实世界只显示其中一个入口:当 X 实际取值为 x 时,我们看到的 Y 只是反应表中的一行;其余行没有机会被看到,但它们依然客观存在——这就是“潜在”的含义。

反事实推理正是在这张表上做“查表”。定义式写作:

其中 \(M_x\) 是经过干预后的模型。这个式子给出了“反应表”的数学形态。

反应表让导演明白:要回答“罗密欧没入场会怎样”,不能靠猜,而是去查“罗密欧”这一页里“没收到邀请函”那一栏写着什么。但查表之前有个麻烦——册子上写的是“如果没收到邀请函”的完整反应,可现实里邀请函已经送达了,怎么把那一栏调出来?道具师神秘一笑,拿出一把金光闪闪的外科手术剪。

Yx(u) ≜ val⁡Y ⁣(Mx,  U=u)\displaystyle Y_x(u)\ \triangleq\ \operatorname{val}_{Y}\!\big(M_x,\; U = u\big)
对每个具体背景 u(可以被理解为“某个特定世界切片”),\(Y_x(u)\) 给出了“如果设定 X=x”时 y 的确定答案。
  1. 下标 x干预设定值,决定查“反应表”的哪一列
    Yx(⋅)\displaystyle Y_{x}(\cdot)
  2. 参数 u具体背景,决定查哪一行
    Yx(u)\displaystyle Y_x(u)
  3. 定义符号 \(\triangleq\)表示“定义为”,右边是它的展开形式
    ≜\displaystyle \triangleq
  4. 取值函数 \(\operatorname{val}_Y(M_x,\, U=u)\)在修改后的剧本 \(M_x\) 中、背景为 u 时,Y 的取值
    val⁡Y ⁣(Mx,  U=u)\displaystyle \operatorname{val}_{Y}\!\big(M_x,\; U = u\big)

外科手术干预:时光摄影机的“定点剪辑”

道具师手里的手术剪不是用来剪布景的,而是用来“剪剧本”的。它的名字叫 do 算子。操作方式很奇特:想要模拟“如果罗密欧没参加舞会”,你不需要改动他的性格、不需要改变朱丽叶的表姐、甚至不改变当晚的风向——你只需要剪断“邀请函 → 罗密欧入场”这条因果连线,然后把“罗密欧入场”这个变量直接固定为“否”,其余所有情节照旧运转。

这正是 do 算子与普通“条件”的本质区别。条件 \(P(Y \mid X=x)\) 就像问“在所有 X=x 的日子里,Y 分布如何”,它混进了其他变量可能同时变化的影响;而干预 \(\operatorname{do}(X=x)\) 则是“强行把 X 设为 x,同时剪断所有指向 X 的箭头”,从而切断了混杂因素的后门路径。结构上,干预产生了一个新模型 \(M_x\):把 X 的结构方程 \(f_x\) 替换成常数 \(X=x\),其他方程全部保留。干预分布写作:

就像导演用手术剪精确地剪掉“邀请函已送达”这一帧画面,再把“罗密欧入场”钉死为“否”,其他一切(朱丽叶的家族、神父的计划)都原封不动。但导演发现还差最后一步:剪完之后要如何“重播”?这就引出了反事实的完整三步流程。

P(y∣do⁡(X=x))=PMx(Y=y),Mx: X←x\displaystyle P\big(y \mid \operatorname{do}(X=x)\big) = P_{M_x}(Y = y),\qquad M_x:\ X \leftarrow x
do(X=x) 表示“剪断所有指向 X 的边,强制设定 X=x”。\(M_x\) 是修改后的模型,其他结构方程保持不变。
  1. 左边 \(P(y \mid \operatorname{do}(X=x))\)干预分布,问“强制 X=x 时 Y 的概率”
    P(y∣do⁡(X=x))\displaystyle P\big(y \mid \operatorname{do}(X=x)\big)
  2. 右边 \(P_{M_x}(Y=y)\)新剧本 \(M_x\) 里 Y 的分布
    PMx(Y=y)\displaystyle P_{M_x}(Y = y)
  3. 替换规则 \(X \leftarrow x\)把 X 的方程换成常数赋值,相当于剪断所有入边
    X←x\displaystyle X \leftarrow x
  4. 与条件分布的区别干预剪断了从祖先到 X 的箭头;普通条件 \(P(y \mid x)\) 没有剪断任何箭头
    P(y∣x) ≠ P(y∣do⁡(x))\displaystyle P(y \mid x)\ \neq\ P(y \mid \operatorname{do}(x))

形式化定义:倒带—剪辑—重播

道具师把三样工具摆在桌上:剧本(SCM)、反应表(潜在响应)、手术剪(do 算子)。“这三样配合起来,就是完整的时光摄影机。”他说,“操作只有三步:倒带、剪辑、重播。”因果科学中,反事实的严格定义正是这个三步流程的数学化:外推(abduction)、干预(action)、预测(prediction)。

第一步“外推”:既然现实已经发生(比如罗密欧确实入场了),我们就用这个事实去筛选“反应表”,找出与事实相符的背景切片,更新对 U 的信念,得到 \(P(U \mid e)\)。第二步“干预”:实施 \(\operatorname{do}(X=x')\),把罗密欧入场固定为“否”。第三步“预测”:在修改后的剧本里重新计算 Y 的分布,得到反事实概率。三步合并,就是反事实的黄金公式,其中 e 表示观察到的证据(现实事实):

导演倒带(外推:确认剧本里罗密欧确实入场了,并把“他当时的心境”这个背景锁定下来)、剪辑(干预:把入场脚本剪掉)、重播(预测:让摄影机顺着新剧本演一遍)。答案也许不是唯一的,但因为有了这三步,它第一次成为可计算、可验证的数学对象。

P(Yx′=y′∣e)=∑u P(Yx′=y′∣U=u)⋅P(U=u∣e)\displaystyle P\big(Y_{x'}=y' \mid e\big) = \sum_{u}\ P\big(Y_{x'}=y' \mid U=u\big) \cdot P(U=u \mid e)
这个公式把“假如”问题拆解为:先吸收现实(外推),再改变条件(干预),最后在新的剧本里求答案(预测)。它是整个反事实理论的“心脏”。
  1. 左边 \(P(Y_{x'}=y' \mid e)\)已知证据 e 时,反事实“若 X 被设为 \(x'\),则 \(Y=y'\)”的概率
    P(Yx′=y′∣e)\displaystyle P\big(Y_{x'}=y' \mid e\big)
  2. 求和符号 \(\sum_u\)对背景空间 U 的所有可能切片求和,也就是查遍反应表的每一行
    ∑u\displaystyle \sum_{u}
  3. 第一项 \(P(Y_{x'}=y' \mid U=u)\)在特定背景 u 下,干预后的剧本里 Y 的取值概率——对应“预测”步
    P(Yx′=y′∣U=u)\displaystyle P\big(Y_{x'}=y' \mid U=u\big)
  4. 第二项 \(P(U=u \mid e)\)给定证据后背景 u 的后验概率——对应“外推”步
    P(U=u∣e)\displaystyle P(U=u \mid e)
  5. 点积联动两项相乘再对 u 求和,等于“按证据加权平均所有背景下的预测”
    =∑u [预测]×[外推]\displaystyle = \sum_u\ \big[\text{预测}\big] \times \big[\text{外推}\big]

因果推理层级:看戏的三种境界

看同一出《罗密欧与朱丽叶》,观众有三种境界。第一种:看热闹——“罗密欧入场了,然后他们相爱了”;第二种:改戏——“如果我删掉舞会这一幕,故事会不会变”;第三种:问假如——“戏已经演完,罗密欧已经入场,但我还是想知道:如果当时他没入场,朱丽叶会不会嫁给帕里斯?”Pearl 把这三种境界概括为因果推理的三个层级。

第一层级是关联(seeing),回答“看到 Y 和 X 同时发生时,\(P(y \mid x)\) 是多少”,它只依赖观察数据,不做任何改动。第二层级是干预(doing),回答“如果主动去做 \(X=x\),Y 会怎样”,这需要 do 算子,需要知道因果结构。第三层级是反事实(imagining),回答“已知现实 e,假设当初 \(X=x'\),Y 会怎样”,它把观察证据和干预动作同时纳入,是金字塔尖。三个层级之间有严格的关系——上层能推出下层,下层推不出上层:

导演那晚的“假如”之问,不是第一层(看热闹),也不是第二层(改戏重演),而是第三层——在已经发生的悲剧之上,怀着“如果当初”的念头做严谨推演。这正是反事实定义在整个因果理论中占据最高层级的原因。

P(y∣x)⏟L1 seeing  →  do    P(y∣do⁡(x))⏟L2 doing  →  evidence    P(yx′∣x, y)⏟L3 imagining\displaystyle \underbrace{P(y\mid x)}_{L_1\ \text{seeing}} \;\xrightarrow{\;\text{do}\;}\; \underbrace{P\big(y \mid \operatorname{do}(x)\big)}_{L_2\ \text{doing}} \;\xrightarrow{\;\text{evidence}\;}\; \underbrace{P\big(y_{x'} \mid x,\,y\big)}_{L_3\ \text{imagining}}
L1 关联在观察数据中就能算;L2 干预需要一定的实验或假设;L3 反事实必须建立在完整的 SCM 之上。
  1. 第一层 \(\underbrace{P(y\mid x)}_{L_1\ \text{seeing}}\)看戏,只统计“看到 x 时 y 的比例”,不做任何改动
    P(y∣x)\displaystyle P(y \mid x)
  2. 箭头 \(\xrightarrow{\ \mathrm{do}\ }\)从观察到干预,需要 do 算子介入
    → do \displaystyle \xrightarrow{\ \mathrm{do}\ }
  3. 第二层 \(\underbrace{P(y \mid \operatorname{do}(x))}_{L_2\ \text{doing}}\)动手改戏,强制 \(X=x\) 再看结果
    P(y∣do⁡(x))\displaystyle P\big(y \mid \operatorname{do}(x)\big)
  4. 第三层 \(\underbrace{P(y_{x'} \mid x,\, y)}_{L_3\ \text{imagining}}\)已知结局后问假如,把观察证据与干预动作合起来
    P(yx′∣x, y)\displaystyle P\big(y_{x'} \mid x,\,y\big)

前沿应用:从复盘悲剧到指导未来

剧场里的时光摄影机,最初是用来复盘悲剧的;但聪明的导演很快发现,它还能用来指导下一部戏的编排——新剧本里,女主角要不要在第二幕出场?把“出场”剪掉重播一遍,就能预判剧情走向。现实中,反事实定义正以类似的方式,成为 AI 领域最前沿的“指导工具”。

在可解释 AI 中,当用户的贷款申请被模型拒绝时,光说“模型计算出的风险分数是 0.82”并不能让人信服;如果模型能回答“假如月收入再高 2000 元,这次申请就会被批准”,解释立刻就清晰了。这就是反事实解释(counterfactual explanation)——把分类器的决策转换成“最小改动”的假如叙事。在安全对齐中,反事实评估解决一个致命难题:系统在真实世界中只有一个行为轨迹,无法平行试错。通过结构因果模型,AI 可以回答“如果传感器当时没有误判,车辆是否会追尾”“如果用户的提示词里没有这句攻击性输入,模型是否还会泄露隐私”这类假如问题,从而在灾难发生之前,用想象力预演灾难。算法公平审计也用反事实检验“如果申请人性别不同,决策是否依然相同”。

这些应用的共同数学核心,都是下面这个“假如问题求解器”——给定现实证据 e,在所有可能结果中挑出反事实概率最高的那个:

从剧场到银行、从自动驾驶到 AI 安全,那把时光摄影机换了个场景依然好用。它让机器不止会“看”,还会“想象”——而这,正是因果推理赋予人工智能最强的一层能力。

y∗=arg⁡max⁡y′ P(Yx′=y′∣e)\displaystyle y^{*} = \arg\max_{y'}\ P\big(Y_{x'}=y' \mid \mathbf{e}\big)
给定现实证据 e,在所有可能结果中挑出反事实概率最高的那个,就是“假如”问题最可能的答案。
  1. 最优答案 \(y^{*}\)表示“假如这样,最可能的结果”
    y∗\displaystyle y^{*}
  2. \(\arg\max_{y'}\)在所有候选结果中找出使概率最大的一项
    arg⁡max⁡y′\displaystyle \arg\max_{y'}
  3. 反事实概率 \(P(Y_{x'}=y' \mid \mathbf{e})\)在证据 e 下,干预设定 \(X=x'\) 时 \(Y=y'\) 的概率
    P(Yx′=y′∣e)\displaystyle P\big(Y_{x'}=y' \mid \mathbf{e}\big)
  4. 整体含义回答“假如”类问题,就是求这个概率的最大值
    y∗=max⁡y′ P(Yx′=y′∣e)\displaystyle y^* = \max_{y'}\ P(Y_{x'}=y' \mid \mathbf{e})

AI 应用场景

信贷风控的反事实解释

阶段:模型可解释与结构化输出

解决的问题:传统风控模型只输出一个拒绝分数,客户和业务员都不知道“差在哪、差多少”。AI 接入反事实生成后,可以回答“假如月收入提高 2000 元,贷款申请是否会被批准”,把黑盒决策变成可沟通、可申诉的透明结论。

具体案例:某银行在信贷审批系统中部署结构因果模型,将年龄、收入、负债率、征信查询次数等变量用因果图连接起来。当一位自由职业者被拒贷时,系统生成反事实解释:“在保持您其他信息不变的前提下,若月收入增加 2000 元或征信查询次数减少 1 次,通过概率将从 12% 升至 74%。”客户据此调整申请材料,模型的公平性与用户体验同时提升。

自动驾驶的安全对齐评估

阶段:安全对齐与故障归因

解决的问题:自动驾驶系统在真实路上不能反复试错,传统测试无法覆盖“如果当时没误判会怎样”。反事实评估用 SCM 在数字孪生世界里剪掉“传感器误判”这一帧,重播事故发生前的场景,判断事故是否依然发生,从而区分“传感器故障”与“决策算法缺陷”的责任归属。

具体案例:某车企在仿真平台上对一起真实碰撞事故建模:感知模块把红灯误识别为绿灯(X=1),车辆未减速导致碰撞(Y=1)。工程师用反事实计算“若感知正确(X=0),碰撞是否还会发生”,发现碰撞概率从 95% 降至 3%,于是将修复重心放在感知模块而非常规的制动系统,大幅提升了迭代效率。

医疗决策的反事实疗效分析

阶段:个体化决策支持

解决的问题:传统随机对照试验给出的是群体平均疗效,无法回答“这位患者若当初服用该药,病情会怎样”。反事实分析把患者的病史、基因、生活习惯作为背景 U,通过 SCM 生成个体化假如推演,辅助医生做精准用药决策。

具体案例:一家医院利用结构因果模型分析高血压患者数据,对一位已服用旧药但效果不佳的患者,模型回答“若 3 个月前换用新药,其收缩压将比当前低 8 mmHg,同时发生头晕的副作用概率仅 6%”。医生据此与患者沟通换药方案,患者依从性显著提高。

Python 演示

python54 行
"""用结构因果模型回答反事实问题: 如果强制取消球赛, 心情会怎样?"""import numpy as np  class RainGameSCM:    """降雨影响球赛进而影响心情的小型结构因果模型.     内生变量 V: X=降雨, B=球赛是否照常, C=心情指数    外生变量 U: u_x, u_b, u_c 为背景噪声    结构方程 F:        X = 1 if u_x > 0        B = 1 if X == 0 and u_b > -0.5        C = 0.5 * B + u_c    """     def __init__(self, seed=42, n=2000):        rng = np.random.default_rng(seed)        # 外生背景变量: 天气, 场地, 情绪的随机因素        self.u_x = rng.normal(0, 1, n)        self.u_b = rng.normal(0, 1, n)        self.u_c = rng.normal(0, 1, n)        # 现实世界: 让结构方程运转一遍        self.rain = self.u_x > 0        self.game = (~self.rain) & (self.u_b > -0.5)        self.mood = 0.5 * self.game.astype(float) + self.u_c     def abduction(self, obs_game):        """第一步 倒带: 保留与观察事实一致的全部背景切片"""        mask = self.game == obs_game        return self.u_x[mask], self.u_b[mask], self.u_c[mask]     def action(self, u_c, force_game):        """第二步 剪辑: 外科手术式固定 B, 切断降雨对球赛的影响"""        mood_new = 0.5 * float(force_game) + u_c        return mood_new     def counterfactual(self, obs_game, force_game):        """第三步 重播: 在干预后的模型中预测心情"""        _, _, u_c = self.abduction(obs_game)        return self.action(u_c, force_game).mean()     def condition(self, force_game):        """对照: 普通条件概率 P(C | B=force_game)"""        return self.mood[self.game == force_game].mean()  if __name__ == "__main__":    model = RainGameSCM()    cf_mean = model.counterfactual(obs_game=True, force_game=False)    cond_mean = model.condition(force_game=False)    print(f"现实(球赛照常)下心情均值: {model.mood[model.game].mean():.3f}")    print(f"反事实(如果强制取消)预测: {cf_mean:.3f}")    print(f"条件概率 P(C|B=取消) 均值: {cond_mean:.3f}")    print(f"反事实与条件概率的差异: {cf_mean - cond_mean:.3f}")
目的:用 2000 个“世界切片”模拟一个微型结构因果模型,完整走一遍“外推—干预—预测”三步法,对比反事实结论与普通条件概率的差异。
  1. self.game = (~self.rain) & (self.u_b > -0.5)结构方程:球赛是否照常,由“没下雨”和“场地条件充分”共同决定,这正是剧本里的角色规则
  2. def abduction(self, obs_game):三步法第一步:从现实世界中筛选出“球赛照常”的样本,锁定它们的背景切片
  3. mask = self.game == obs_game相当于用时光摄影机倒带后,只保留与已发生事实相符的那部分世界切片
  4. mood_new = 0.5 * float(force_game) + u_c干预后的结构方程:B 被外科手术式固定,不再由降雨决定,只保留情绪噪声的影响
  5. return self.action(u_c, force_game).mean()在修改后的模型上重播,对所有背景切片求平均,得到反事实期望
  6. cf_mean = model.counterfactual(obs_game=True, force_game=False)提问:“在现实球赛照常的前提下,如果当初强制取消球赛,心情会怎样?”
  7. cf_mean - cond_mean反事实与条件概率的差,直观展示“挑选过的背景”与“原样保留的背景”造成的选择偏差

常见误区

误区初学者常认为“如果没下雨,球赛会怎样”就是统计条件概率,用历史数据筛选“没下雨”的日子看球赛比例即可。

正解条件概率只回答“没下雨的日子里球赛进行的比例”,它混入了“因没下雨所以进行”和“即使下雨也可能进行”等混杂因素;反事实则锁定住该样本的背景 u,只改变 X 值,并切断 X 的其他影响路径。就像时光摄影机重播时只剪掉罗密欧入场,其他所有细节(演员的即兴发挥、灯光、道具)都保持原样;条件概率则像是换了一批演员来演。

为何常见:因为在真实数据中永远看不到“同一个个体在不同世界”的结果,人们容易把不同个体之间的差异误当成同一个体的因果差异。

误区以为 do 算子就是反事实,两者是同一件事。

正解do(X=x) 是干预层级的操作,执行它不需要知道“现实已经发生了什么”;反事实则是“在已经观察到 \(X=x\)、\(Y=y\) 的前提下,假设改设为 \(x'\) 会怎样”,必须先吸收观察证据(更新 U)再做干预。类比到剧场:do 是“导演直接拍板改剧本”,不问过去的演出;反事实是“先看完已经完成的演出,再倒带改那一帧”。

为何常见:两者都涉及“改变 X”,形式上很相似,但反事实多了一个“给定证据 e”的前提,这个前提恰好是干预层级没有的。

误区认为只要数据足够多,反事实问题就能自动被回答。

正解纯观察数据只能回答关联层级的问题(\(P(y \mid x)\));要回答反事实,必须要有结构因果模型——包括结构方程、因果图和外生变量的分布。没有模型的反事实是空中楼阁,就像没有剧本、只有一堆演员的花絮视频,你无法严谨推演“如果当年没演这一幕会怎样”。

为何常见:大数据的成功让很多人误以为“相关即因果”,忽略了反事实问题中“世界如何运转”的结构信息不可从数据中凭空长出来。

误区认为反事实只能处理“下雨/不下雨”“入场/不入场”这类非黑即白的问题。

正解连续变量同样适用。SCM 的结构方程可以是任意函数,X 可以被设为任意值 \(x'\),比如“收入增加 2000 元”“温度升高 1.5 度”。关键不是变量的类型,而是你掌握了描述变量之间如何相互影响的结构方程与背景分布。

为何常见:教科书常以二值例子引入反事实,导致学习者误以为这是方法的边界。

误区以为反事实一定给出一个唯一的答案,比如“如果没入场,他一定不会死”。

正解反事实往往给出的是一个概率分布。因为给定证据之后,背景 U 可能依然存在不确定性(外推得到的 \(P(U \mid e)\) 不是单点),所以三步法的输出是“有多可能”,而不是“一定会”。导演重播十次,可能有九次罗密欧死在别处,一次活了下来——这个比例本身就是反事实的答案。

为何常见:人脑的直觉叙事倾向把“假如”讲成确定的故事,而数学上不确定性始终存在。

面试题

Q1. “如果昨晚没下雨,球赛就不会取消”这种句式属于哪种推理?

单选题 · easy

  • A.相关分析
  • B.干预推理
  • C.反事实推理← 正确答案
  • D.描述统计

答案:C。这句话是对已发生的现实(下雨了、球赛取消了)提出相反的假设,属于典型的反事实推理。相关分析只描述变量间的统计关联,干预推理强调主动操作,描述统计则只是概括数据特征。

Q2. 执行 do(X=x) 这种外科手术式干预时,首要的结构操作是什么?

单选题 · easy

  • A.删除 X 的所有入边← 正确答案
  • B.删除 X 的所有出边
  • C.删除全部结构方程
  • D.增加 X 的随机噪声

答案:A。do(X=x) 的核心是切断所有指向 X 的箭头(入边),再把 X 固定为常数 x,这样外部混杂因素无法再通过其他路径影响 X。出边应当保留,因为 X 对下游 Y 的影响正是我们关心的因果效应。

Q3. Pearl 反事实三步法的正确顺序是?

单选题 · mid

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

答案:B。三步法依次是:外推(用观察证据更新背景 U 的后验)、干预(实施 do(X=x') 修改模型)、预测(在新模型下计算 Y 的分布)。顺序不能颠倒,就像时光摄影机必须先倒带、再剪辑、最后重播。

Q4. 反事实记号 \(Y_x\) 中的下标 x 表示什么?

单选题 · mid

  • A.现实观测到的 X 值
  • B.被干预设定的 X 值← 正确答案
  • C.X 变量的方差大小
  • D.X 背后的噪声项

答案:B。下标 x 表示“在干预 \(\operatorname{do}(X=x)\) 下”的设定值,是反事实世界中的假设条件,而不是现实观测到的值。现实观测值写在竖线右侧的证据部分。

Q5. 下列哪些属于结构因果模型 SCM=(U,V,F) 的组成部分?

多选题 · mid

  • A.外生变量 U← 正确答案
  • B.内生变量 V← 正确答案
  • C.结构方程 F← 正确答案
  • D.损失函数 L

答案:ABC。SCM 三元组由外生变量 U、内生变量 V 和结构方程 F 构成,描述“剧本”的背景、状态与规则。损失函数是机器学习训练中的概念,不属于 SCM 的组成部分。

Q6. 给定观察证据 e=(X=1, Y=0) 时,反事实 \(P(Y_{X=0}=1 \mid e)\) 三步法中的“外推”步骤计算什么?

单选题 · hard

  • A.P(U | e)← 正确答案
  • B.P(Y | X)
  • C.P(X | U)
  • D.P(Y_{X=0})

答案:A。外推步骤是根据现实证据 e 更新背景变量 U 的后验分布 \(P(U \mid e)\)。它相当于锁定“反应表”中与事实相符的行,为后续干预与预测提供加权依据。P(Y|X) 是关联层级内容,P(X|U) 方向反了,P(Y_{X=0}) 忽略了证据。

Q7. 下列哪个属于因果推理层级中的最高层?

单选题 · mid

  • A.关联层级 seeing
  • B.干预层级 doing
  • C.反事实层级 imagining← 正确答案
  • D.观察层级 watching

答案:C。Pearl 的因果层级由低到高依次是:关联(seeing)、干预(doing)、反事实(imagining)。反事实需要同时依赖观察证据和干预操作,是金字塔塔尖,能回答“假如当初”类问题。

Q8. 关于条件概率 \(P(Y \mid X=x)\) 与反事实概率 \(P(Y_{X=x} \mid e)\) 的区别,下列说法正确的是?

多选题 · hard

  • A.前者不区分因果方向← 正确答案
  • B.后者需要结构因果模型← 正确答案
  • C.前者不需要任何干预← 正确答案
  • D.两者在数值上完全相同

答案:ABC。条件概率只是统计“看到 X=x 时 Y 的分布”,不区分因果方向,也不需要干预;反事实概率必须基于 SCM,先吸收证据 e 再做 do 干预,两者数值一般不相等。D 错在把两者混为一谈。

Q9. “如果罗密欧当晚没参加舞会”要得到严谨答案,相当于在剧本(SCM)上执行什么操作?

单选题 · easy

  • A.增设一个全新角色
  • B.剪断入场变量入边← 正确答案
  • C.删除整个第一幕
  • D.强制更换女主角

答案:B。正确做法是剪断“邀请函 → 罗密欧入场”这条入边,并把“入场”固定为“否”。这对应 do 算子:只改动一个变量,其余剧情结构保持不变,而不是大规模增删角色或场景。

Q10. 反事实推理在 AI 安全对齐中的应用包括哪些?

多选题 · hard

  • A.评估极端输入下的潜在危害← 正确答案
  • B.判定指令微变时的伤害风险← 正确答案
  • C.用于图片超分辨率生成
  • D.反事实验证系统行为的鲁棒性← 正确答案

答案:ABD。安全对齐关心“如果当时条件不同,AI 是否会造成伤害”。反事实可用于评估极端输入下的危害、指令微小扰动下的伤害风险,以及通过假如推演验证系统鲁棒性。图片超分辨率是生成任务,与反事实对齐无关。