
各位做AI的朋友先聊个我自己的观察。我见过很多人讨论神经网络张嘴就是“深度学习只学到相关性学不到因果”。这话听起来很严谨好像是把AI的边界说透了但越往深里做我越觉得它是个经验陷阱。它不是全错而是“武断”两个字害死人。今天这篇文章不打算站队说“神经网络到底有没有因果”而是想把这个陷阱本身拆开为什么我们总爱在“严格因果”面前盖棺定论这种武断会给实际项目带来什么麻烦以及真正做研究、做落地的时候怎么讨论因果才不会翻车。1. “严格因果”这个词一上来就埋了一个坑1.1 教科书里的因果定义和工程里的因果定义不是一回事很多人说“严格因果”默认指的是概率图模型里的结构因果模型SCM那一套尤其是Pearl提出的因果阶梯关联、干预、反事实。按照这个标准你要算一个因果效应不能只看条件概率P(Y|X)必须考虑干预后的分布P(Y|do(X))甚至要回答“如果当初没有做XY会变成多少”这种反事实问题。这个标准确实很“严格”。但问题在于当我们把这句话搬到神经网络头上时常常偷换了对象。神经网络是一个参数化函数或者说是一个从输入到输出的映射。你问“这个函数内部有没有因果结构”和你问“这个函数在数据上能不能估计因果效应”其实是两个问题。前者说的是模型自身的机制后者说的是模型在数据上的行为。很多争论就是在这两个问法之间滑来滑去最后变成“公说公有理婆说婆有理”。严格来说一个普通的前馈神经网络内部确实没有显式的因果图变量没有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时间越长我越觉得“因果”不是一个可以盖棺定论的属性而是一套持续验证的过程。神经网络当然不是天生就把因果写在参数里但它也绝不该被一句话定性为“绝对没有因果”。最实际的姿态是把因果当成模型的某种品质通过数据采集、结构设计、训练策略和评估方法来打磨它。我跟团队说别急着给神经网络定罪也别急着给它封神先在干预式测试里走一圈再回来讨论。