机器学到的是相关,永远不会是因果
这不是对机器学习的批评,是对它的准确描述。损失函数里没有「因果」这一项,所以它当然不会去学。而这个事实解释了从分布外泛化、到指标失效、到「AI 说得头头是道却建议错了」的一大批现象。
一个模型在验证集上准确率 96%,上线后掉到 60%。数据分布确实变了。最根本的原因是?
A、B、D 都是常见的应对,而且都有用。但它们处理的是症状。
损失函数里没有因果
先把话说清楚:机器学习学不到因果,不是因为模型不够大,是因为它没有被要求去学。
# 你写的目标函数 loss = 交叉熵(模型(x), y) # 它要求的是:给定 x,尽量准确地预测 y # 它没有要求:如果我【拨动】x 的某一维,y 会怎么变
这两件事在训练分布里经常一致(所以模型看起来很聪明),在分布变化时就分道扬镳。因为——
相关会随分布变,因果不会。
「云的形状」和「地面湿不湿」在雨季高度相关,在旱季就不相关了。而「下雨」导致「地面湿」这件事,在哪个季节都成立。
模型学的是前者,因为前者在训练集里预测得更准。
亲手训一个,看它崩
下面这个 demo 真的训了两个逻辑回归。数据里有两维特征:
- 真原因:和标签有真实的因果联系,但信号弱(噪声大)。
- 捷径:和标签没有因果关系,但在训练分布里和标签高度重合,而且很干净。
训练分布 换个分布 ──────────────── ──────── ──────── 两个特征都用 96.3% 17.5% ← 比瞎猜(50%)还差得多 只用真原因 79.5% 77.7% ← 几乎不掉 模型自己学出来的权重: 真原因这一维 1.692 捷径这一维 4.010 ← 它压倒性地押在捷径上
请注意三件事:
- 模型没有做错任何事。捷径在训练分布里确实预测得更准,把权重压在它上面是损失函数的正确解。
- 用了捷径的模型在训练集上明显更强(96.3% vs 79.5%)。如果你用验证集选模型,你必然会选它——只要验证集和训练集同分布。
- 换个分布之后,它比瞎猜还差。17.5% 不是「退化到随机」,是学到的关系反过来了,于是它系统性地答反。
拖动那根滑杆,你会看到测试分布里捷径的方向逐渐反转时,准确率是怎么一路掉下去的。而只用真原因的那条线,几乎是平的。
捷径学习(shortcut learning)是 Geirhos 等人 2020 年那篇综述给这类现象起的名字。虚假相关(spurious correlation)说的是同一件事的另一面。
「虚假」这个词有点误导:那些相关在训练分布里是真的,一点不虚假。它们只是不稳定——依赖于分布,而不依赖于机制。
更准确的说法是:模型学到的是一个只在某个分布下成立的关系,而你把它当成了普遍规律。这正是这本书从第 1 章开始说的那件事。
几个你可能见过的例子
- 医学影像模型学会了识别医院。不同医院的机器有不同的成像特征,而某些医院的重症比例更高——于是模型通过「这张片子来自哪台机器」预测病情。换一家医院就崩。
- 狼和哈士奇分类器学会了看雪。训练集里狼的照片多在雪地。这是 LIME 那篇论文(Ribeiro et al. 2016)里的经典例子。
- 简历筛选模型学会了性别相关的词。历史数据里录用决定本身带着偏见,模型忠实地复现了它——而且因为它「只是在预测历史数据」,它没有任何理由不这么做。
- 推荐系统的反馈回路。模型推荐什么,就只能观察到什么的反馈。这是第 7 章那道门,而且它每天都在收紧。
更麻烦的一层:模型的输出会变成干预
上面那些还只是「预测失准」。有一类问题更深:当模型的输出被用来做决策时,它就变成了对世界的干预,而这个干预会改变它赖以生存的那个分布。
回到第 5 章那个例子。假设:
代码质量 := f(团队水平) 单测覆盖率 := g(代码质量) # 覆盖率是质量的【后果】,所以它是一个很好的【预测指标】
模型学到「覆盖率高 → 质量高」,完全正确。现在你根据它做决策:要求覆盖率必须到 80%。
这是 do(覆盖率 = 80%)。那条 质量 → 覆盖率 的箭头被剪断了,覆盖率不再由质量决定。于是覆盖率和质量之间的相关也就消失了。指标还在,含义没了。
「一个指标一旦成为目标,它就不再是一个好指标。」
因果版本的解释更清楚:一个指标之所以有用,是因为它是某个你真正关心的东西的后果;而你一旦去拧它,它就不再是那个东西的后果了。
换句话说:你把一个结果,当成了旋钮去拧。而结果不是旋钮——旋钮在上游。
(《意外》第 23 章从信息论那边给了同一件事的另一个证明:调节器必须是被控对象的模型,否则控制不住。两本书在这里握手。)
推荐系统、风控模型、内容审核、KPI 体系——凡是「模型的输出会影响世界」的地方,都有这个问题。而它无法靠更多数据或更大模型解决,因为问题出在你用一个预测量去做了干预。
那么,怎么办
诚实的答案是:没有银弹,但方向是清楚的。
| 做法 | 在做什么 |
|---|---|
| 拿到真正的干预数据(A/B 测试、随机探索) | 直接买那一刀。最贵也最有效 |
| 不变风险最小化(IRM)、跨环境训练 | 在多个环境上训练,逼模型只用各环境都稳定的关系 |
| 因果表征学习 | 试图从数据里学出结构本身。很活跃,但远未成熟 |
| 用因果框架设计特征 | 最土也最可靠:不要把处理之后才有的东西当特征 |
| 报告决策而不是预测 | 「这个用户会流失」是预测;「给他发券能减少多少流失」是因果。后者才是要的 |
最后一行值得展开一句。很多业务模型的真正目标其实是因果的:你不想知道谁会流失,你想知道对谁做什么能减少流失。这两件事经常给出完全不同的名单——「铁定会流失的人」和「你能挽回的人」不是同一批。
这个问题叫提升度建模(uplift modeling)或异质效应估计(CATE),它是第 17 章那套双重机器学习最主要的应用场景之一。而它需要的输入,正是这本书讲的东西。
关于大语言模型:它们能非常流畅地讨论因果关系,也确实能在很多标准的因果推理题上答对——因为它们读过大量讲这些的文本。
但要区分两件事:复述关于因果的知识,和从数据里识别因果结构。前者是文本上的能力,后者需要的信息(哪条箭头指向哪边)在纯观察数据里根本不存在——这是第 1 章那个结论,它对任何算法都成立,不管多大。
实用的启示:让 LLM 帮你画图、帮你想有哪些可能的混淆、帮你检查调整集,都是很好的用法。它在这些任务上是一个不错的领域知识来源。但「把数据丢给它让它告诉你因果关系」不是——那个问题的答案不在数据里,它也变不出来。
这是一个信息论意义上的限制,不是工程限制。缺的信息不在数据里,所以任何只看数据的算法都拿不到。
拿得到它的办法只有两个:做干预(自己剪那一刀),或者带进假设(画那张图)。这本书讲的就是这两件事,而它们都不是模型能替你做的。
C模型学到的是训练分布里的相关,而其中一部分相关在新分布里变了。
数字:训练 96.3% → 换分布 17.5%。而只用真原因的那个模型 79.5% → 77.7%,几乎不掉。
A 「过拟合」——不是。上面那个模型在训练分布的独立测试集上照样 96%,它没有过拟合训练样本,它「过拟合」的是训练分布。这是两件事,而常规的正则化、早停、交叉验证都只治前者。 B 「更多数据」——同分布的数据再多,捷径的权重只会更高,因为它在这个分布里确实更准。更多数据会让问题更严重。 D 「定期重训」——有用的补丁,但它是在追着分布跑。而且每次重训之后,你仍然不知道模型这次押在了什么上面。这一章的一句话
损失函数里没有因果这一项,所以模型不会去学;而它一旦被用来做决策,就变成了干预,会亲手拆掉自己赖以生存的那个相关。
最后一章要做一件有点冒险的事:把这本书自己放到审判席上。你读完了 23 章,判断力有没有变好?——这是一个因果问题,而这本书没有对照组。