各位做AI的朋友,先聊个我自己的观察。我见过很多人讨论神经网络,张嘴就是“深度学习只学到相关性,学不到因果”。这话听起来很严谨,好像是把AI的边界说透了,但越往深里做,我越觉得它是个经验陷阱。它不是全错,而是“武断”两个字害死人。今天这篇文章不打算站队说“神经网络到底有没有因果”,而是想把这个陷阱本身拆开:为什么我们总爱在“严格因果”面前盖棺定论?这种武断会给实际项目带来什么麻烦?以及真正做研究、做落地的时候,怎么讨论因果才不会翻车。
1. “严格因果”这个词,一上来就埋了一个坑
1.1 教科书里的因果定义,和工程里的因果定义不是一回事
很多人说“严格因果”,默认指的是概率图模型里的结构因果模型(SCM)那一套,尤其是Pearl提出的因果阶梯:关联、干预、反事实。按照这个标准,你要算一个因果效应,不能只看条件概率P(Y|X),必须考虑干预后的分布P(Y|do(X)),甚至要回答“如果当初没有做X,Y会变成多少”这种反事实问题。
这个标准确实很“严格”。但问题在于,当我们把这句话搬到神经网络头上时,常常偷换了对象。神经网络是一个参数化函数,或者说是一个从输入到输出的映射。你问“这个函数内部有没有因果结构”,和你问“这个函数在数据上能不能估计因果效应”,其实是两个问题。前者说的是模型自身的机制,后者说的是模型在数据上的行为。很多争论就是在这两个问法之间滑来滑去,最后变成“公说公有理,婆说婆有理”。
严格来说,一个普通的前馈神经网络内部确实没有显式的因果图变量,没有do算子,没有反事实生成器。它在默认设定下只是用BP算法拟合训练集的联合分布或条件分布。但这是“网络结构里没有写死因果结构”,不等于“网络的训练过程完全无法捕捉数据生成过程中的因果特征”。这个区分非常关键,一旦搞混,后面所有的讨论都会乱。
1.2 为什么“武断否认”和“武断承认”同样危险
我在不少技术群里看过两类人。第一类人喜欢说:“别吹了,神经网络就是曲线拟合,所有因果关系都是人类自作多情。”第二类人正好相反,拿一个高精度的模型说:“你看它准确率这么高,肯定已经学出了世界的因果规律。”这两类说法我都不太赞同,因为它们都是先射箭后画靶。
武断否认的问题在于,它会屏蔽掉一类很有价值的建模思路。比如,如果你完全不相信神经网络能处理任何因果信息,那你看到域外泛化失败、数据分布偏移这类现象时,只能得出“深度学习就是脆”的结论,而不会去想“是不是模型抓错了特征,把颜色、背景、位置这些伪相关当成了规律”。其实很多失败的案例,恰恰说明模型隐含地把某些与因果机制无关的表象特征当成了可靠依据。
武断承认的问题更隐蔽。模型准确率高、拟合得好,并不说明它学到了真实机制。2019年前后很多论文里都有类似例子:一张图片里有牛,但训练集里牛大多出现在草地上,于是模型可能只是记住了草地。你把这个模型拿到沙漠场景,它就会失灵。这时候你坚持说“模型学到了牛的因果本质”,那是在骗自己。
所以我说“严格因果”这个词一上来就埋了个坑,它诱导我们站队。而真正做项目的人,其实更该关心的是:在什么样的条件下,一个神经网络可以被当作因果模型来用;在什么样的条件下,它只能被当作相关模型来用。
2. 神经网络实际学到的,比“相关性”要多一点
2.1 从BP到CNN:最朴素观察里藏着稳定的结构信号
很多人对“神经网络只学相关性”的印象,来自于BP网络时代的线性可分思维。一个最简单的全连接网络,本质上是在高维空间里做特征变换和分类,它的输出确实高度依赖训练数据里的统计频率。但这不代表它完全抓不住“机制”。
拿卷积神经网络来说,它之所以在图像任务上比全连接网络强那么多,不是因为卷积运算本身神奇,而是因为它把“局部性”和“平移不变性”作为先验塞进了网络结构里。这两条先验其实就是关于图像生成过程的因果假设:真实世界里,一个物体无论出现在图片左上角还是右下角,它的类别不应该改变;一个物体的边缘和纹理,往往在小范围内连续。这些结构约束让CNN更容易学到与真实世界生成机制相符的表征,而不只是死记硬背特定像素组合。
我做过一个实际的图像分类小实验,训练集里所有的“杯子”照片都放在木质桌面上,测试集换成大理石台面,模型准确率立刻掉了十几个点。这时候网络学到的显然不是“杯子”这个实体,而是“木质桌面+杯口纹理”这一簇相关性。但有趣的是,如果在训练时故意对图片做随机裁剪、旋转、换背景,模型反而表现得更稳。这说明同样的网络结构,在数据增强的干预下,能够放弃伪相关,转而去学习更接近因果本质的形状特征。
所以我说“比相关性多一点”,不是指神经网络自发地产生了因果结构,而是说它有能力在合适的训练信号下,把那些在多个环境下都稳定的特征凸显出来。这种稳定特征,在哲学意义上就已经很接近因果了:因为它是事物之所以成为它自己的那个属性。
2.2 时间序列里的因果痕迹:RNN和LSTM的状态记忆
讲到循环神经网络和LSTM,又有一层更微妙的因果讨论。时间序列天然带有方向性,过去影响现在,现在影响未来,这是时间本身给我们的因果约束。RNN在做的事情,无非是把历史信息压缩到隐状态里,再通过这个隐状态预测下一步。从形式上看,这个“状态迭代”非常接近一个离散时间动态系统。
我见过很多人做股票预测、电力负荷预测或交通流量预测时,习惯把LSTM当黑盒。其中一个经典误区是:直接把预测误差当成模型好坏的全部依据,完全不看模型的隐状态到底记住了什么。实际上,如果你把LSTM的隐状态抽出来做可视化,会发现它经常能捕捉到周期信号、趋势拐点这类结构。这些结构不是简单的“同时发生”,而是“前一时刻的状态推动下一时刻的输出”,在局部窗口内是有方向性因果痕迹的。
当然,这离“严格因果”还有距离,因为观测时间序列里可能存在隐藏的混淆因素。比如预测冰淇淋销量和溺水人数,它们同时上升,但真正的共同原因是气温。LSTM在数据中看到的可能是“冰淇淋销量高的时候,溺水人数也在涨”,它未必知道气温这个变量。如果训练数据刚好只覆盖夏天,模型的内部“规律”在冬天就可能崩掉。所以LSTM的状态记忆可以被看成一种对时间因果的弱代理,但绝不能直接当成因果图里的边。
2.3 对抗样本、域偏移与因果线索的间接证据
对抗样本这件事,特别能说明神经网络到底学到了什么。一张熊猫图片加一点点人眼看不出的噪声,网络就把它识别成长臂猿。这说明模型的决策高度依赖某些高频像素模式,而这种模式是统计上的捷径,不是人类认知里的“长臂猿特征”。
反过来说,如果我们把“能否抵抗某些干预”作为因果性的检验标准,那么一个能抵抗常见域偏移的模型,往往更接近因果学习。域偏移相当于对输入分布做了某种干预,比如换背景、换光照、换说话人。如果模型在干预后的分布上仍然稳定,那说明它学到的函数在多个环境下保持在同一组生成机制上。这虽然不是严格意义的do算子计算,但在工程上已经是“以因果为目标”的学习了。
这里有个经验:你在做模型评估时,别只看测试集准确率,一定要做“干预式测试”。所谓干预式测试,就是手动改动输入中你认为不重要的因素,比如图像背景、文本语气、音频音色,观察输出是否稳定。如果模型对这些不重要的因素敏感,说明它大概率在用相关性偷懒。这套方法不需要任何高深的因果推断理论,但能帮你避开很多虚假的“因果幻觉”。
3. 否认因果的代价,往往在换场景时才暴露
3.1 换分布就翻车:相关模型与因果模型的典型差异
很多团队在研发阶段用同一个数据集又训又测,效果很好,一上线换到真实场景就开始拉胯。这种情况我见过太多次。最典型的解释就是“训练集和测试集分布不一致”,但更深层的原因,是模型没有抓住稳定机制,只能靠数据里的伪相关撑场面。
我举一个相对好懂的电商例子。假设你在做一个商品推荐模型,特征包括用户点击次数、浏览时长、商品销量。训练数据来自一个促销季,用户因为打折狂点某些商品。模型学到了“点击次数高→用户喜欢”的规律。等到促销结束,点击次数还是高,但用户并不买,推荐效果暴跌。这里点击、浏览和购买在促销季里被共同的“打折”因素驱动,它们之间只是相关,不是因果。模型如果不会区分“促销干预”这个混淆变量,换一个场景就会彻底失灵。
因果模型或者说因果导向的模型,标准做法是用结构方程把“打折”对“点击”和“购买”的影响分开,或者至少在训练时引入多场景数据,让模型必须找到一个跨场景不变的规则。神经网络的灵活性让它有潜力做到这件事,但它不会自动做,需要人去设计训练目标、数据粒度、评估方式。如果一开始就武断地认为神经网络与因果无关,那这些设计根本不会发生。
3.2 推荐、风控、医疗里的因果边界:不能只靠相关
在推荐系统里,我们常常想回答的问题不是“用户会不会点”,而是“如果我把这个物品排到第一位,用户会不会点”。前者是相关性预测,后者是干预效应预测。如果系统A的排序策略刚好把热门物品放在前面,模型就会把“热门”和“点击”混在一起。等到你上线一个真正个性化排序策略,原来的模型预测就会失真,因为它在训练阶段从未真正区分“物品原本的吸引力”和“排位带来的曝光效应”。
在风控场景里,这个问题更严重。反欺诈模型如果只学相关性,它很容易把“某设备ID出现过多次”当成欺诈特征,但这可能只是两个正常用户共用了同一台旧手机。你需要区分的是“该设备当前操作是否异常”这种动态机制,而不是静态的相关频次。一个严格意义上的因果模型应该回答:如果把设备ID改掉,风险是否还会发生。这个问题如果不搞清楚,误杀率会高得离谱。
医疗场景就更不用说了,我们最关心的是“这个用药方案是否导致了病情好转”,而不是“用药患者里的好转比例更高”。后者会被很多混淆因素污染,比如病情轻的人更可能被开某种药。任何有医学背景的人都知道,要判断疗效必须做随机对照试验,可现实是很多数据只有观察记录,没有随机分组。这时候如果把神经网络预测出的“高风险”直接等同于“因”,就容易导致过度治疗或漏诊。
这些领域共同的特点是:我们真正想要的是在干预之后发生的结果,而训练数据往往只记录了自然发生的内容。神经网络可以建得很好,但如果不在数据采集、特征构造、模型结构里加入因果意识,它本质上就只是在为旧政策打分,而不是为未来的决策服务。
3.3 这条经验陷阱如何误导团队设计
当团队里某个核心成员笃定“神经网络没有因果”的时候,他对项目方向的影响是破坏性的。他会拒绝做任何干预式数据增强,认为那是白费功夫;他会忽略特征之间的依赖关系,只管堆特征;他会在模型效果变差时,简单归因于“数据不干净”,而不是思考“模型抓住了错误的机制”。
反过来,如果团队里有人过分迷信“神经网络已经学出因果”,他可能会跳过因果检验,直接拿着模型结果做高风险的业务决策。这两种极端,都是因为缺少一套对话框架。我们需要承认:因果性不是藏在模型参数里的一个“自带属性”,而是模型与数据、与外部假设的交互结果。
我自己带项目时会定一条规矩:讨论因果相关问题时,不许用“绝对肯定”和“绝对否认”这两种语气。要么说“在什么假设下可以认为它有因果特征”,要么说“在什么假设下它只是相关性”。这个简单的语言约束,能让团队避免很多无效争吵。
4. 实操中怎么正确讨论和验证“因果存在性”
4.1 提问方式决定答案:从“有无因果”改成“在什么假设下”
面对一个神经网络,与其问“它到底学到因果没有”,不如把它拆换成三个更清楚的问题:
第一,数据里有没有可识别的干预来源?比如随机实验分组、时间先后顺序、天然的突发事件,这些都能为因果识别提供抓手。
第二,模型内部有没有显式的机制约束?比如图神经网络里定义了节点之间的边,LSTM里有时间方向,注意力机制里有依赖关系,这些结构本身就带有“谁影响谁”的假设。
第三,模型的预测在多大程度上能经受住干预变化的考验?如果数据分布变化后模型依然稳定,它就更像在学习不变机制,而不只是记忆统计频率。
这三个问题没有一个是非黑即白的,但它们把“因果”从一个玄学概念变成了可以操作的工程指标。我在实际项目里,会把这些指标直接写进评审清单,跟准确率、AUC并列。
4.2 干预实验、反事实增强、稳定学习的三板斧
先说干预实验。这是最朴素也最有效的办法。你不用把整个因果图学出来,你只需要在数据收集阶段或训练阶段,人为改变你认为无关的变量。图像分类里做随机裁剪、旋转、色彩抖动,文本分类里做同义词替换、句式变换,这些都是对无关变量的干预。干预之后模型如果还能保持平稳,那说明它没把无关变量当成依赖。
再说反事实增强。这是一种非常实用的数据构造方法。在图像里,你要把“牛”识别出来,那就别只给牛配草地背景,可以合成牛在沙漠、海边、城市里的图片。通过让同一个核心对象出现在不同环境下,强迫模型去找到那个不变的“牛”的因果特征。在文本里同理,把“电影评论的情感”作为核心对象,把“评论中出现的品牌名”作为环境变量,通过换品牌名来测试模型是否仍然判断正确。
最后说稳定学习。稳定学习本质上是一类训练策略,它希望模型学到在所有环境下都稳定的预测关系。具体做法常见的有两种:一种是域对抗训练,让特征提取器骗过“环境分类器”,从而学出环境无关的特征;另一种是样本重加权,通过给反向传播加权,降低那些会随着环境变化而波动的特征的影响。
这三板斧不是严格因果推断的替代品,它们更像是“面向因果的神经网络训练脚手架”。当你把这三件事做完,再回看“神经网络有没有因果”这个问题,你会觉得问题本身不重要了,因为你已经有了更具体的验证手段。
4.3 一个完整的排查示例:图片分类中的颜色背景伪相关性
假设我有一个二分类任务:区分“蘑菇是否有毒”。训练数据里,有毒蘑菇大多长在阴暗潮湿的地方,拍摄出来背景偏暗;无毒蘑菇大多长在明亮草地,背景偏亮。一个高准确率的CNN很可能只是在读图片亮度,而不是读蘑菇的菌盖、菌褶、菌柄等形态。
怎么排查?第一步,我把所有训练图片的蘑菇区域抠出来,换到统一背景里重新训练或做迁移学习,看看模型效果是否剧烈下降。如果下降明显,说明模型依赖背景亮度的可能性很大。第二步,我再做颜色扰动,把蘑菇本身的颜色调偏一点,同时保持背景不变,观察模型是否敏感。第三步,我可以构造反事实样本:把有毒蘑菇的图片整体调亮并放到绿色草地上,看模型是否还会把它判为有毒。如果模型在第三步里大量误判,那我能很肯定地说,它学的不是“有毒形态”,而是“整体场景亮度”。
这个排查过程不需要用到复杂的do演算,但它本质上就是一套干预和反事实思维。做完之后,我们再回头去修正数据或者模型结构,比如加形态特征分支、去掉色彩通道、使用分割掩码输入。最后模型的线上稳定性会有肉眼可见的提升。这件事如果用“神经网络没有因果”这类结论开头,大概率就停在抱怨数据太脏了。
5. 常见误区速查表:哪些话不能随便说
5.1 常见错误说法与对应纠正
| 常见说法 | 问题在哪 | 更稳妥的说法 |
|---|---|---|
| “神经网络只学相关性,不学因果” | 把模型结构局限和训练目标局限混为一谈 | “默认监督学习的目标是拟合条件分布,但通过结构调整和数据干预,可以让它逼近因果函数” |
| “这个模型准确率这么高,说明它学到了因果规律” | 把统计拟合度与因果机制等同 | “它在当前数据分布上表现好,还需要做干预式测试才能判断是否学到了稳定机制” |
| “深度学习就该堆数据,不需要因果假设” | 放弃结构先验会导致样本效率低下 | “纯数据驱动只能覆盖已出现的分布,换场景时必须有针对性的干预或环境变量建模” |
| “图神经网络自带因果关系” | GNN只建模关联图,不自动区分方向 | “GNN适合编码变量间依赖结构,因果方向还要靠额外假设和实验确认” |
| “LSTM记住了时间顺序,所以它是因果模型” | 时间先后不等于因果作用 | “LSTM能编码时序依赖,但要排除混淆因素才能谈因果效应” |
这张表不是教条,它背后是我踩过的坑。尤其是在给别人讲模型结果的时候,措辞稍微极端一点,后续解释成本就会暴涨。
5.2 排查自检清单:五分钟检查你的模型有没有踩“武断”陷阱
我自己在交付模型前,会随手续一遍下面这几个问题,不全但很实用:
- 训练集和业务真实场景的分布差异在哪里?有没有环境变量没被记录?
- 模型对哪些特征最敏感?把最重要的特征列出来,看看它们是不是只是“数据里的高频巧合”?
- 如果我把某个不重要的外观特征强行改变,模型的预测会变多少?
- 我的评估指标里有没有包含干预式测试,还是只有单一测试集准确率?
- 团队的讨论里,有没有人把“模型表现好”直接等同于“模型理解了机制”?
这五个问题未必能证明一个模型是否有因果性,但能帮你避免在“武断”的路上越走越远。尤其是最后一个问题,我见过太多项目死在“自信的因果叙事”上。
做AI时间越长,我越觉得“因果”不是一个可以盖棺定论的属性,而是一套持续验证的过程。神经网络当然不是天生就把因果写在参数里,但它也绝不该被一句话定性为“绝对没有因果”。最实际的姿态是:把因果当成模型的某种品质,通过数据采集、结构设计、训练策略和评估方法来打磨它。我跟团队说,别急着给神经网络定罪,也别急着给它封神,先在干预式测试里走一圈,再回来讨论。