TASK06 | Reasoning Kindom 因果的边界——观测数据永远不够
归纳的幽灵
从逻辑上讲,“过去太阳每天升起”和”明天太阳会升起”之间,没有必然的推导关系。你能想象一个世界,在那里太阳升起了一万次,然后在第一万零一次停止了——这个想象不包含逻辑矛盾。这就是归纳问题(Problem of Induction):从有限的观测,我们无法逻辑地推导出普遍规律。
休谟的论证在哲学史上引发了巨大的震动,因为它触及了科学方法的根基。科学依赖归纳——从实验数据推导出自然定律。如果归纳在逻辑上不可靠,科学的地位是什么?三百年后,这个问题以一种更技术化的形式回来了:从观测数据,我们能推导出因果关系吗?
答案依然是:不能。
这一章要讲的,就是这个”不能”的精确含义,以及我们如何在这个限制下依然做出有用的推断。
相关性的陷阱
在1950年代,流行病学家观测到一个强烈的统计相关性:吸烟者的肺癌发病率显著高于非吸烟者。这能证明吸烟导致肺癌吗?烟草公司的律师说:不能。他们提出了一个替代解释:也许存在某个隐藏变量——比如基因型——同时导致了”喜欢吸烟”和”易患肺癌”。在这个解释下,吸烟和肺癌之间没有因果关系,它们只是共同原因的两个结果。
假说1(因果):
- 吸烟 → 肺癌
- 假说2(混淆):
假说2:(混淆)
- 基因型 → 吸烟
- 基因型 → 肺癌
在假说2里,吸烟和肺癌之间的相关性是虚假的(spurious)——它们在统计上相关,但没有直接的因果联系。

只要基因型这个共同原因是不可观测的(比如 1950 年代还没法测基因),你永远没法从 “吸烟和肺癌的相关关系” 里,区分出到底是 “吸烟导致肺癌”,还是 “基因同时导致了吸烟和肺癌”。
观测 vs 干预:因果推断的核心区别

这张图的核心意思就是:相关性不等于因果性,只靠观测数据永远没法证明因果,因为你永远没法排除 “隐藏的共同原因” 这种混淆变量;要确定因果,必须引入 “干预”(比如实验),而不是只看数据里的相关关系。
相关性是观测出来的,因果性是干预出来的。

贝叶斯网络:概率的因果外衣
贝叶斯网络(Bayesian Network)是一个有向无环图(DAG),节点是随机变量,边表示条件依赖关系。


贝叶斯网络的边,只是告诉你 “变量之间在统计上有关系”,但它不告诉你 “这个关系是怎么来的”,更不告诉你 “谁是因,谁是果”。把统计依赖当成因果关系,就是本节要提醒你的陷阱。
真实的因果结构是:
B → A ← E
入室盗窃或地震都会触发警报。
但从纯粹的概率角度,以下结构也可以编码相同的条件独立性:
A → B, A → E
警报响了,增加了入室盗窃和地震的概率
这两个网络在观测数据上是等价的——它们对应相同的联合分布 P(A,B,E)。但它们的因果含义完全不同。

贝叶斯网络是概率模型,不是因果模型。 它的边表示的是[条件依赖],不是因果流。Pearl的贡献,就是在贝叶斯网络的基础上,加入了因果语义——【把边解释为因果关系,然后定义在这个解释下,干预和反事实意味着什么。】
============
贝叶斯网络的边不是因果关系——这已经够让人不安的了。但还有更深的问题:即使你有了Pearl的因果图,你怎么知道这张图是对的?
因果图本身是你画的,是你对世界结构的先验假设。数据可以告诉你哪些变量是条件独立的,但这只能缩小可能的因果图的范围,无法唯一确定一张图。这意味着:因果推断的所有结论,都建立在一个无法从数据中验证的假设之上——你画的那张图。
如果图画错了,do算子算出来的干预效果也是错的。你得到的是一个内部自洽的错误答案。那么,我们凭什么相信自己画的因果图?经验?直觉?领域知识?这些都是答案,但它们都不是从数据里来的。
Pearl的因果阶梯
Judea Pearl在2000年出版的《Causality》一书里,提出了一个三层的因果推理框架,后来被称为因果阶梯(Ladder of Causation)。
do算子是什么:






涉及对未发生事情的推理:
例子:
- 观测:这个病人吃了药,康复了。
- 反事实:如果这个病人没吃药,他会康复吗?
反事实推理需要的不只是数据,还需要一个结构因果模型——关于世界如何运作的机制性假设。
Pearl的核心论点是:这三层不能互相替代。 你不能用第一层的信息回答第二层的问题,也不能用第二层的信息回答第三层的问题。
每一层都需要更强的假设,更多的结构。


结构因果模型:世界的机制蓝图 (SCM)


do演算:从观测到干预的桥梁
do - 演算的本质是 “在因果图的约束下,对概率表达式做合法的‘手术’”,每一条规则都对应一种因果图的 “边删除” 操作,核心是判断变量间的独立性。




============
给定观测数据,我们能计算干预分布吗?

因果效应可识别是什么意思? 就是能够通过着三条规则转换成不含do算子的纯观测概率表达式。如果用这三条规则推不出来,就说明这个因果效应是不可识别的,只靠现有数据和图,永远算不出它的真实值。


后门准则与前门准则


如果我们能观测G

Pearl发现了一个巧妙的情况:即使混淆变量不可观测,如果存在一个中介变量 M,满足
这是一个深刻的结果:在某些结构下,观测数据足以识别因果效应,即使存在不可观测的混淆。
但”某些结构”是关键——不是所有因果图都满足后门或前门准则。
观测等价类


仅凭观测数据,因果发现(causal discovery)只能恢复到马尔可夫等价类,无法确定唯一的因果图。
- 干预数据:如果你能做实验,强制改变某些变量,观察其他变量的反应,你可以确定因果方向
- 时间顺序:如果你知道X发生在Y之前,那么 Y->X是不可能的
- 函数形式假设:如果你假设因果机制是线性的、或者是加性噪声模型,某些等价类可以被打破
- 先验知识:如果你知道某些边不可能存在(比如”年龄不能被收入影响”),你可以排除某些图
但如果你只有观测数据,没有任何额外假设,因果图是不可识别的。


忠实性假设:一个脆弱的桥梁
因果发现算法(如PC算法、GES算法)通常依赖两个假设:
假设1:因果马尔可夫条件
给定其父节点,每个变量与其非后代独立。这是贝叶斯网络的标准假设,通常是合理的。
假设2:忠实性(Faithfulness)
观测分布中的所有条件独立性,都由因果图的d-分离蕴含。

这个假设看起来无害,但它其实很强。
反例:参数的巧合抵消
考虑以下因果图和结构方程:
X → Y → Z
X → Z
Y = a·X + U_Y
Z = b·Y + c·X + U_Z

如果参数恰好满足 b⋅a+c=0b \cdot a + c =0b⋅a+c=0,那么X对Z的总效应为零——直接效应c和通过Y的间接效应b⋅ab\cdot ab⋅a相互抵消。
在这种情况下,观测数据会显示
,但这不是因为图结构,而是因为参数的巧合。
忠实性假设排除了这种巧合——它假设参数是”一般位置”的,不会恰好抵消。
但在真实世界里,这种巧合可能并不罕见。生物系统、经济系统中存在大量的反馈和平衡机制,它们的参数可能恰好使得某些效应相互抵消。
忠实性失败的后果
如果忠实性不成立,因果发现算法会推断出错误的图结构——它会认为某些边不存在,因为对应的变量在数据中看起来独立,但实际上它们有因果关系,只是效应被抵消了。
这是一个深层的脆弱性:因果发现依赖一个关于参数的假设,而这个假设在数据中是无法被检验的——因为你无法区分”真正的独立”和”巧合的抵消”。
忠实性假设:假设因果图中的所有条件独立关系,都只能由图的结构本身导致,而不是由参数的特殊取值巧合导致。
=======
反事实
Pearl的因果阶梯的第三层——反事实——是最难的,因为它涉及对未发生的事情的推理。

假设我们有以下SCM:
X = U_X (是否服药,由外生因素决定)
Y = a·X + U_Y (康复情况)

反事实的不可识别性
关键问题:反事实通常是不可识别的。
即使你知道因果图,即使你有无限的观测数据,你依然无法从数据中唯一确定反事实分布——因为反事实依赖于外生变量UUU的分布,而UUU是不可观测的。在上面的例子里,如果我们不知道Y0Y_0Y0的值(药物效应的大小),我们无法计算Y0Y_0Y0。反事实需要的不只是因果图,还需要参数化的结构方程——这比图结构更强的假设。这就是为什么反事实推理在实践中很难:它需要一个【完整的、参数化的世界模型,而这个模型通常是无法从数据中完全学到的】。
伪代码:因果推断的核心算法
算法1:后门调整(Backdoor Adjustment)
import itertools
import numpy as np
def backdoor_adjustment(data, x_col, y_col, z_cols, x_val):
"""
后门调整估计因果效应 P(Y | do(X=x_val))。
data: pandas DataFrame,包含观测数据
x_col: 干预变量列名
y_col: 结果变量列名
z_cols: 调整集列名列表(满足后门准则)
x_val: 干预值
返回: P(Y=1 | do(X=x_val)) 的估计
"""
if not z_cols:
raise ValueError("调整集为空,因果效应不可识别(通过后门调整)")
# 枚举 Z 的所有取值组合
z_values = [data[z].unique() for z in z_cols]
result = 0.0
for z_combo in itertools.product(*z_values):
# 条件概率 P(Y | X=x_val, Z=z_combo)
mask_xz = (data[x_col] == x_val)
for z_col, z_val in zip(z_cols, z_combo):
mask_xz &= (data[z_col] == z_val)
if mask_xz.sum() == 0:
continue
p_y_given_xz = data.loc[mask_xz, y_col].mean()
# 边际概率 P(Z=z_combo)
mask_z = np.ones(len(data), dtype=bool)
for z_col, z_val in zip(z_cols, z_combo):
mask_z &= (data[z_col] == z_val)
p_z = mask_z.mean()
result += p_y_given_xz * p_z
return result
观测数据只能告诉我们变量之间的联合分布 P(X,Y)P(X,Y)P(X,Y),而因果关系是关于干预P(Y∣do(X))P(Y|do(X))P(Y∣do(X))的。这两者通常是不同的,因为观测包含了混淆效应。观测、干预、反事实。每一层都需要更强的假设。机器学习的绝大多数任务停留在第一层,而真正的因果推理需要第二层或第三层。
结构因果模型(SCM)提供了一个框架,用结构方程和因果图来编码世界的机制。有了SCM,我们可以定义干预(删除指向被干预变量的边)和反事实(溯因-行动-预测三步法)。
do-演算给出了从观测分布推导干预分布的完备规则。后门准则和前门准则是实践中更直接的工具——在某些图结构下,观测数据足以识别因果效应。
==========
1. 忠实性假设(Faithfulness Assumption)的失效与检测
问题:
忠实性假设在真实世界中有多常失败?我们有办法检测忠实性失败吗?
背景
忠实性假设(Faithfulness)是因果发现算法(比如PC算法、GES算法)的基础前提,它说的是:
数据中的所有条件独立性,都对应因果图中的结构独立性。
换句话说:如果两个变量在数据里看起来独立,那它们在因果图里就必须是d-分离的,不能有“因果存在但相关性刚好抵消”的情况。
为什么会失效?
真实世界中存在**“因果抵消”**的情况:
- 比如,一个变量X对Y有两条路径:
- X→Y(正效应)
- X→Z→Y(负效应)
如果这两条路径的效应大小刚好相等、方向相反,X和Y在数据里会表现为完全独立,但在因果图里它们其实是相连的。
这就违反了忠实性假设,会让算法错误地删掉边,得出错误的因果图。
这个问题在问什么?
- 真实数据中,这种“抵消”的情况到底多不多?是极端罕见,还是很常见?
- 我们有没有统计方法,能在数据中检测到忠实性假设被违反,而不是盲目依赖它?
2. 马尔可夫等价类中的因果图选择
问题:
如果两个因果图在马尔可夫等价类中,但给出不同的干预预测,我们应该相信哪一个?这是一个科学选择问题,还是一个哲学问题?
背景
- 马尔可夫等价类:指一组不同的因果图,它们能产生完全相同的观测数据分布。
比如 X→Y→ZX→Y→ZX→Y→Z 和 X←Y←ZX←Y←ZX←Y←Z 和 X←Y→ZX←Y→ZX←Y→Z,在没有额外干预数据时,从观测数据里是无法区分的,它们属于同一个等价类。 - 但这些等价的图,在干预预测上可能完全不同:
比如对Y做干预,不同的图会给出不同的 P(Z∣do(Y))P(Z|do(Y))P(Z∣do(Y))。
这个问题在问什么?
- 当观测数据无法区分这些图时,我们该选哪一个?
- 这是一个需要额外数据/实验来解决的科学问题,还是涉及“因果实在论”的哲学问题?
比如:是否存在一个“真实”的因果图,还是说因果结构只是我们用来预测干预的工具?
3. 反事实推理与SCM参数学习
问题:
反事实推理需要完整的参数化SCM。在什么条件下,我们可以从数据中学到这些参数?什么时候这是不可能的?
背景
- SCM(结构因果模型):是Pearl因果推断的核心框架,它不仅定义了变量间的结构关系,还包含具体的函数形式和噪声分布。
- 反事实推理(比如“如果当时没有吃药,病人会不会活下来?”)需要完整的SCM参数,因为它要模拟“从未发生过的干预”。
- 但仅凭观测数据,很多时候无法唯一确定SCM的所有参数(比如混杂变量的影响、非线性函数的具体形式)。
这个问题在问什么?
- 我们需要什么样的数据(观测/干预/实验),才能唯一确定SCM的所有参数?
- 哪些情况下,SCM的参数是不可识别的?也就是说,存在多个不同的SCM,都能拟合观测数据,但给出完全不同的反事实结论?
4. 大语言模型(LLM)的因果推理能力边界
问题:
大型语言模型能做因果推理吗?它们从文本中学到的是 P(Y∣X)P(Y|X)P(Y∣X) 还是 P(Y∣do(X))P(Y|do(X))P(Y∣do(X))?这个问题的答案,决定了LLM的能力边界。
背景
- 大语言模型是在海量文本数据上训练的,本质上学习的是条件分布 P(Y∣X)P(Y|X)P(Y∣X)(即“当看到文本X时,下一段文本Y的概率分布”)。
- 但因果推理需要的是干预分布 P(Y∣do(X))P(Y|do(X))P(Y∣do(X)),这是主动改变X后的结果,和被动观测的相关性分布是两回事。
这个问题在问什么?
- LLM学到的知识,到底停留在“统计相关性”,还是已经具备了因果结构的理解?
- 当LLM回答“如果我推了杯子,它会掉下来”这类问题时,它是在基于相关性预测文本,还是在模拟因果干预?
- 这个问题直接关系到:LLM能不能可靠地解决反事实问题、规划问题、科学推理问题,还是说只能做相关性匹配?
5. 因果发现算法的跨分布泛化失败
问题:
如果你用纯粹的观测数据训练一个因果发现算法,然后在干预数据上测试,它会系统性地失败在哪里?这个失败模式能告诉我们什么?
背景
- 绝大多数因果发现算法,都是在观测数据上训练的,它们的目标是还原生成观测数据的因果图。
- 但当我们把学到的因果图用到干预/分布偏移数据上时,往往会出现系统性的错误预测。
这个问题在问什么?
- 观测数据学到的因果图,为什么在干预数据上会失效?是因为忠实性假设、马尔可夫假设被违反,还是因为算法学到的只是“统计等价类”而非真实结构?
- 这些失败模式,能不能反过来告诉我们,观测数据本身能学到的因果知识的极限在哪里?
总结:这些问题的共同核心
这五个问题,本质上都在追问同一个底层矛盾:
仅凭观测数据,我们到底能学到多少因果知识?它的边界在哪里?
- 忠实性假设、等价类问题:是在问“观测数据本身的信息局限性”。
- SCM参数学习、LLM因果推理:是在问“我们的模型/算法,能不能突破这种局限性”。
- 跨分布泛化失败:是在问“这种局限性会在实践中如何体现”。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)