那次评审会上的场景,我到现在还记得很清楚。一位做了五年算法开发的工程师,指着一份模型报告说:"神经网络就是学相关性的,它学不了因果,更别说什么严格意义上的因果了。真要谈因果,得上结构方程模型或者贝叶斯网络。"当时会议室里没有人反驳他,连我也只是皱了皱眉。但这句话在我心里扎了根——因为在过去几年做过的好几个项目里,我分明见过神经网络展现出一些"不太像纯相关性"的行为,却又拿不出一个干净利落的框架去解释。
围绕神经网络和因果推断的争论,大概是AI圈里最容易被一句话带过去的深水区之一。说"神经网络没有严格因果",听起来很科学、很清醒,但这句断言本身很可能就是AI行业当下最大的经验陷阱。我见过太多团队因为这个论断,放弃了本可以挖掘的因果能力;也见过太多研究者在"深度学习"和"因果推断"两座山头之间画出一条不可逾越的鸿沟,结果两边都吃亏。这篇文章就想把我这些年踩过的坑、观察到的现象、以及最终形成的方法论摊开来讲一讲。它适合所有对神经网络上限有好奇、在业务里被"相关性≠因果"折磨过的从业者,也适合刚入门、但已经被各种说法搞得晕头转向的朋友。
1. 那次会议上没人追问的问题:"严格因果"到底指什么
先说回到那个评审会。那位工程师说出"神经网络没有严格因果"之后,最奇怪的不是这句话本身,而是全场居然没有一个人追问一个最基础的问题——你说的"严格因果"究竟是哪个意义上的因果?
1.1 因果不是一句话,是三层阶梯
在因果推断领域,Judea Pearl提出的"因果之梯"算是讨论这类问题的通用坐标系。我理解下来,它可以被粗略地分成三层。
第一层是关联层。这一层的典型问题是"看到X会对Y的认知产生什么影响"——也就是P(Y|X)。大部分机器学习模型,从线性回归到大型神经网络,主要都在做这件事。你喂给它一堆历史数据,它学会的是特征和标签之间的统计关联。广告点击率预估、商品推荐排序、图像分类,本质上都停留在这一层。
第二层是干预层。这层的问题变成"如果我主动把X设定为某个值,Y会变成什么"——记作P(Y|do(X))。注意区别:关联层里你只是"看到"X,X是自然发生的;干预层里你"操作"了X,切断了外界对X的影响。经典例子是:看到猫头鹰叫和下雨有关,但你把猫头鹰的嘴绑上并不会让雨停。能做到干预层,意味着系统开始理解"操控一个变量对另一个变量的后果"。
第三层是反事实层。这一层问的是"如果当初没有发生X,Y会怎样"——哪怕X实际上已经发生了。它需要系统具备想象平行世界的能力,在已有的观测事实之上,回答一个没有发生过的假设性问题。
那位工程师说神经网络没有"严格因果"的时候,他心里想的"严格",大概率就是第二层和第三层。这个直觉不能说全错——绝大多数神经网络项目确实只训练了第一层。但问题是,"大多数项目停留在第一层"和"神经网络无法抵达第二层、第三层"之间,差着十万八千里。
1.2 训练方式决定层级,而不是架构决定层级
我后来想明白一个很重要的点:一个神经网络最终展现出哪个层级的因果能力,很大程度上取决于它的数据和训练目标是围绕哪一层来设计的,而不是由"它是神经网络"这件事天然决定的。
举一个我自己的例子。前几年做一个智能定价系统,我们用的就是一个多层的全连接网络,输入是商品属性、库存、竞品价格,输出是预测销量。一开始它就是典型的第一层模型——竞品价格和销量相关,但它分不清是竞品降价导致了销量流失,还是因为我们的商品本身冷门所以竞品才敢降价。说白了,它学到的相关性里混着很多混淆因素。后来我们调整了训练方式:在数据里加入了一些基于定价实验获得的样本,把"人工干预价格后销量的变化"作为监督信号一起喂进去。同样还是那个神经网络的架构,但它的行为明显不一样了——当我把测试集里的竞品价格人为调低,这个模型给出的销量下降幅度,开始和真实市场实验的结果对得上,而不再只是复现历史均值。
这个项目的经验让我意识到,神经网络能不能触及"严格因果",本质上是训练范式问题,不是架构原罪。如果非要说神经网络"学不了因果",那等于把"大多数从业者没用因果范式训练过网络"这个事实,错误地理解成了"网络本身不具备这种潜力"。
2. 为什么"武断否认"会变成行业经验陷阱:三个来自认知层面的根源
现在我要认真谈谈那个"陷阱"本身。一个错误的观点如果只是错误,它不会成为陷阱。它之所以能坑到这么多人,是因为它的表面逻辑太顺滑、背后的代价又太隐蔽。
2.1 认知根源:把"模型不等于因果"偷换成"模型学不到因果"
这个偷换几乎是行业标配话术。严格来说,"一个训练好的神经网络权重"确实不等于"一份因果结构声明"——你无法从100万个浮点数里直接读出哪个变量是哪个变量的因。这个事实经常被人拿来当论据:"看吧,神经网络根本表达不了因果。"
但这其实是在混淆两个完全不同的命题。命题A:神经网络内部没有显式的因果图变量,它不用do算子做推理。命题B:神经网络在训练过程中,无法把数据背后的因果结构编码进自己的行为里。A几乎是废话,B则是个实证问题,而且越来越多的证据表明B是错误的。把一个实证问题包装成一个定义问题,再用一句轻飘飘的断言带过去,这就是陷阱的第一层伪装。
2.2 归因偏差:拿"模型的失败"当"模型的宿命"
另一个根源来自过去失败的教训。我见过不少团队尝试让模型做因果推断,比如用神经网络拟合因果效应,结果效果不好,于是得出结论"神经网络不行"。但仔细复盘会发现,失败往往来自其他环节:训练数据里没有足够的干预样本、模型的超参没调对、评估指标选的是关联层面的准确率而不是干预层面的效果、甚至因果关系本身在数据里就不存在基础。这些问题没有一个是"神经网络架构"造成的,但它们最后全被记在了"神经网络"的账上。
这种归因偏差和我们平常调试代码时遇到的情况很像。程序崩了,如果你只看到报错信息就说"这台电脑不行",那后面所有的排查方向都会跑偏。同理,把一个方法论层面的失败错误归因为"网络天生学不了因果",后面的所有探索也就都跑偏了。
2.3 行为危害:否认本身会重塑你的实验设计
前面两条还停留在认知层面,接下来这条是真正会产生实际损失的。当一个人打心底相信"神经网络没有因果能力",他的行为会不自觉地被这个信念塑造。
我给很多项目做过技术咨询,最常见的一种情况是:团队在评估模型时,天然地放弃了一大批本应该做的测试。比如分布外泛化测试——把和训练数据分布明显不同的样本丢给模型,看它崩不崩。如果一个团队坚信模型"只是学相关性",他们通常会觉得分布外测试结果差是必然的,不值得深究,更不会去想"模型在分布外表现还不错的那一部分,是不是已经捕捉到了某种稳定的因果结构"。
另一个更隐蔽的行为危害是特征工程上的自废武功。做决策系统的团队,明知一个因素可能有因果影响,但因为"反正神经网络也学不会因果",于是不把因果先验设计进输入结构、不构造反事实样本、不做干预模拟,结果模型果然只能学相关性——这成了一个自我实现的预言。武断否认从一个观点,变成了砍掉整条探索路径的刀。
3. 我看到的实锤:神经网络里的因果真的存在
前两章讲了很多"为什么不能否认",这一章我想给点正面证据。我不想列一篇论文综述,我只讲我亲眼见过、亲手做过、以及业内公认度比较高的几种现象。
3.1 分布外迁移:当相关性模型表现得像因果模型
最让我印象深刻的实证,来自电脑视觉方向。有个项目是识别工业零件表面的缺陷,训练集里所有零件的拍摄角度几乎一样,光照也比较固定。按照"纯相关性"理论,这个模型很容易学到"亮度偏暗=有缺陷"这种虚假关联。但奇怪的是,当我们把生产线上的摄像头换了个角度、换了照明环境,模型的准确率并没有像想象中那样崩掉,只是略有下降。
后来分析才发现,网络并没有依赖单一的表面亮度特征,而是学到了"局部纹理的连续性断裂"这种更本质的结构性特征。光照和角度变了,纹理断裂的模式没变,所以模型依然能判断。这个现象如果放在因果框架里理解,可以说:数据生成过程中的某些结构因果,被网络以一种隐性的方式编码进了权重里。它没有显式的因果图,但它的行为对干预(改变光照、改变角度)展现出了某种程度的不变性——而这,正是因果模型的典型特征。
3.2 潜空间里的可控生成:反事实的雏形
另一个让我反复琢磨的案例是生成模型。用生成对抗网络或扩散模型做图像编辑的从业者都会遇到一个现象:在潜空间里沿某个方向移动潜变量,生成出来的图像会出现语义层面的改变。比如沿着"年龄"方向移动,人脸会变老;沿着"表情"方向移动,嘴角会上扬。从因果的角度来看,这种操作其实就是一种反事实推理——"如果这个人老了十岁,会长什么样"。
当然,这里的因果不是严格意义上的"这个人老了十岁导致皱纹增加"的生物学因果。网络学到的是一种统计上的耦联模式:年龄变化通常伴随皱纹、发色、皮肤弹性的协同变化。但问题在于,生成模型的这种能力,已经远远超出了"看到A推出B"的关联层,它已经能够回答"如果我不改变其他因素,只改变某一个因素,结果会怎样"这类问题——尽管这个"其他因素不变"的隔离程度并不完美。把这种能力完全排除在"因果"范畴之外,我觉得是定义上的苛求,不是事实上的清醒。
3.3 面向因果设计的架构:从卷积到循环网络都有承载能力
还有一种实锤来自模型的结构本身。很多人在讨论神经网络与因果的时候,默认把"神经网络"等同于"一堆全连接层堆叠的黑箱",但实际上神经网络家族里有大量结构设计本身就是冲着"变量的相互影响"去的。
卷机神经网络靠局部感受野和权值共享,天然建模了图像里空间上的局部因果影响——像素之间的空间依赖关系不再是平权的。循环神经网络和长短时记忆网络的时间门控机制,本质是在建模时序上的因果递推——前一个时刻的状态如何影响后一个时刻的输出。图神经网络的注意力机制和信息传递过程,更是直接在变量之间建立消息传递路径,这和因果图上的信息流在形式上有很高的相似性。
这些架构在标准训练下能发挥出多少因果能力,取决于任务和目标函数。但至少,说"神经网络架构无法表达因果结构"是不符合事实的——它只是没有把因果表达成一张显式的有向无环图,而是把因果结构隐式地揉进了连接权重、门控单元和时间递推关系里。
4. 破局的思维方式:把"有没有因果"换成"因果在什么条件下涌现"
聊了这么多否认的陷阱和存在的证据,我想试着跳出来,说说我这些年最终形成的、用来替代"武断否认"和"武断宣称"两极心态的分析框架。
4.1 因果能力是一条光谱,不是一盏开关
我越来越倾向于把因果能力想象成一条光谱。光谱的一端是纯关联:模型只是把输入输出之间的共现模式给记住了;光谱的另一端是理想化的严格因果:模型能在各种干预和反事实问题下,都给出符合真实世界机制的答案。现实中的神经网络,绝大多数落在这条光谱的中间——它们在部分干预条件下表现稳健,在另一些条件下崩塌;它们能回答一部分反事实问题,但在边界情形下给出荒谬答案。
一旦接受这条光谱,很多争论就没意义了。你不再需要纠结"神经网络到底能不能学因果"这个非此即彼的问题,而是可以问:以我现在手里的数据、架构和训练目标,我的模型处在光谱的什么位置?我能不能用一套实验设计,把它往因果的一端推进一步?
4.2 决定因果涌现的三个因素
在这条光谱上,推动模型从"关联端"向"因果端"移动,主要看三个因素。第一个是数据生成过程。如果数据是从一个带有明确干预机制的过程中采集的,比如A/B实验、随机对照试验、自然实验,那么网络在训练中就有机会接触到"干预后的结果分布",因果信号就藏在里面。反之,如果数据全是观测性的、充满了混杂偏倚,那再大的模型也难以单凭一个分布去分清因果方向。
第二个因素是网络对输入结构的利用方式。同样的数据,直接拼成一个大特征向量喂进去,和按因果关系组织成结构化输入、再配合合适的架构去处理,网络能学到的因果信息差之千里。我在前面讲的定价系统案例就是例子:当我们把"竞品价格"和"自身库存"的关系通过输入结构明确分层之后,网络对价格干预的响应才变得靠谱。
第三个因素是目标函数和训练约束。如果目标函数只要求预测准确率,网络没有额外动力去区分"纯粹的相关性"和"可干预的因果性"。近年来很多研究在目标函数上动了脑筋——比如引入不变风险最小化思想,让模型在多个环境下的表现保持一致,或者引入因果表征学习的损失项,强制潜变量之间保持某种独立性——本质上都是在给网络一个"朝因果方向走"的推力。
4.3 别从"武断否认"滑向"武断宣称"
这一节我必须写,因为我见过太多人从我前面说的"否认陷阱"里跳出来,直接跳进了另一个坑——宣称"我的神经网络有因果关系"。这个坑同样深。
有段时间,我们团队在做一个预警系统。模型在历史数据上表现极好,团队里有人说"这个模型已经理解了事件的因果链,可以提前预判"。结果一上线就翻车了:某个外部环境变量发生变化后,模型的预测完全失控。复盘下来,之前的好表现全是因为测试集和训练集共享了同一个隐藏的季节性模式——模型只是对那个日历特征敏感,和什么因果机制一点关系都没有。
这件事教会我一个原则:宣称一个神经网络学到了因果,必须有干预性证据,不能只凭分布外表现好就来。分布外表现好是一个必要条件,但不是充分条件。要证明因果,最扎实的办法还是做干预实验——你主动改变某个输入变量,看模型输出是否按照真实世界的因果机制发生变化。如果十个干预实验里七八个都符合,你才有资格说"这个网络在一定程度上学到了因果结构"。
5. 在实际项目里怎么落地:设计干预实验、利用因果先验、避开指标陷阱
最后一章我想给出一些能直接用的操作建议。如果你看完前四章觉得"有点道理,但我回去还是不知道怎么做",那这一章就是给你准备的。
5.1 用"迷你干预实验"检验模型到底学到了什么
第一步,是最简单也最容易被忽略的一步——给手头的神经网络设计一套干预测试。具体做法不复杂:选一个业务上你认为存在因果关系的输入变量,构造几组反事实样本,然后看网络的输出变化是否符合预期。
举个例子,你在做一个内容推荐系统。你怀疑模型会把"热门程度"误当"用户偏好"的因。那你可以把同一个内容的各项特征保留,只把热度值人为拉高到两倍,看模型对某个具体用户的推荐概率是涨了还是几乎没变。如果模型对热度变化极其敏感,说明它很可能在依赖这条特定的相关性路径;如果你同时再做一个实验——把内容本身的题材特征、作者特征改一改但保持热度不变,发现模型输出大幅变化,那么恭喜,模型的因果结构比你想的要丰富。
这种测试不需要工程上大动干戈,往往只需要在推理阶段对输入张量做几处修改就够了。但它的价值很大:它把"我的模型有没有因果能力"从一个哲学问题,变成了一个可以在半天之内获得证据的工程问题。
5.2 数据层面埋因果先验:数据增强、分层输入、反事实采样
如果你想更进一步,把模型往因果方向推,我的经验是在数据层面动手最划算、见效最快。三个手段我都在项目里用过,按性价比排序依次是:因果导向的数据增强、分层输入设计、反事实样本的拼接。
因果导向的数据增强,核心是把"干预模拟"做成数据变换。做视觉检测的时候,我们手动构造了物体之间的遮挡关系变化、光照变化、相对位置变化,逼着模型学到"遮挡改变不等于物体类别改变"这类不变性。这个做法本质上就是让数据的生成过程覆盖更多的干预情形,网络自然能学到更多的因果不变性。
分层输入设计,是把你知道的因果先验翻译成输入结构。如果你知道A影响B、B影响C,那就别把A、B、C全塞成一个平铺的特征向量,不如按依赖关系分层组织,让网络的前几层先处理A和B的关系,后几层再处理B和C的关系。虽然网络不一定按你设想的路径去学,但起码它有了沿正确方向走的便利路径。
反事实样本拼接,适合数据规模不大的场景。你可以基于领域知识人工构造一些"如果当初价格低一点,销量本来会更高"这类样本,把它们和真实样本混合训练。这里要小心,反事实样本的质量直接决定效果,领域知识不足时宁可少造也别乱造,否则会引入灾难性的噪声。
5.3 评估指标别停留在关联层
很多团队在评估一个模型"有没有学到因果"时的指标设计,本身就在用关联层的问题去考因果层的能力,考不出结果很正常。
这里我常用的做法是给评估体系分三层。关联层看常规的准确率、召回率、AUC,这只是底线指标;干预层做"干预后预测值与真实干预结果的对齐程度",比如把A/B实验里的真实结果拿来和模型的干预预测做对比;反事实层则使用那种"改变某个输入但保留其余输入"的对比测试,看模型在反事实问题上的响应是否符合业务语义。这三层指标分开跑,互相不混淆,才能准确刻画一个网络到底站在光谱的什么位置。
我见过太多团队只跑第一层指标,模型在测试集上准确率高到离谱,就觉得万事大吉。这种评估习惯,才是让"神经网络没有因果能力"这个论断看起来成立的真正土壤——你从来没有给它机会展示干预层和反事实层的能力,然后得出结论说它不具备这种能力。这不是模型的问题,是评估设计的问题。
提示:如果你把一个神经网络模型报告里的"test accuracy 98%"换成"干预一致性 55%、反事实一致性 40%",你对这个系统可靠性的判断会发生很大的变化。很多"AI翻车"事件,本质上都是我们把关联层的指标误当成了因果层的保障。
这些年我最大的体会
回头再看那个评审会上的一句话,我现在能更平和地理解它了。那位工程师的直觉有它的来源——大多数神经网络项目的确停留在相关性层面,这是事实。但经验久了会变成惯性,惯性久了会变成偏见,偏见最后会伪装成真理。这个行业里太多"理所当然"的断言,撑不了多问一句"为什么"。
我在实际项目里收获最大的转变,不是让神经网络真的变成了教科书意义上的因果模型,而是把自己从"能不能"的争论中解放出来,转去关心"在什么条件下能"和"如何创造那些条件"。同样的网络架构、甚至同一条训练数据,只因为换了一套含干预信息的数据增强方案,模型在分布外场景下的表现就可能完全不同。这些时刻让我越来越确信,神经网络里"严格"因果的存在与否,从来不是一个可以被一句话封印的问题,而是一个藏在训练范式深处、等待被好好设计才能显现的行为特性。
最后再分享一个实操层面的小建议:下次再有人在你面前斩钉截铁地说"神经网络学不了因果",别急着反驳,请他先把"因果"这个词定义清楚。你问完这一句,讨论通常就会变得有意思很多。因为绝大多数人会被这个问题卡住——而卡住的那个瞬间,正是思考真正开始的地方。