ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

神经网络学不了因果?这可能正是AI行业最大的经验陷阱

神经网络学不了因果?这可能正是AI行业最大的经验陷阱 那次评审会上的场景我到现在还记得很清楚。一位做了五年算法开发的工程师指着一份模型报告说神经网络就是学相关性的它学不了因果更别说什么严格意义上的因果了。真要谈因果得上结构方程模型或者贝叶斯网络。当时会议室里没有人反驳他连我也只是皱了皱眉。但这句话在我心里扎了根——因为在过去几年做过的好几个项目里我分明见过神经网络展现出一些不太像纯相关性的行为却又拿不出一个干净利落的框架去解释。围绕神经网络和因果推断的争论大概是AI圈里最容易被一句话带过去的深水区之一。说神经网络没有严格因果听起来很科学、很清醒但这句断言本身很可能就是AI行业当下最大的经验陷阱。我见过太多团队因为这个论断放弃了本可以挖掘的因果能力也见过太多研究者在深度学习和因果推断两座山头之间画出一条不可逾越的鸿沟结果两边都吃亏。这篇文章就想把我这些年踩过的坑、观察到的现象、以及最终形成的方法论摊开来讲一讲。它适合所有对神经网络上限有好奇、在业务里被相关性≠因果折磨过的从业者也适合刚入门、但已经被各种说法搞得晕头转向的朋友。1. 那次会议上没人追问的问题严格因果到底指什么先说回到那个评审会。那位工程师说出神经网络没有严格因果之后最奇怪的不是这句话本身而是全场居然没有一个人追问一个最基础的问题——你说的严格因果究竟是哪个意义上的因果1.1 因果不是一句话是三层阶梯在因果推断领域Judea Pearl提出的因果之梯算是讨论这类问题的通用坐标系。我理解下来它可以被粗略地分成三层。第一层是关联层。这一层的典型问题是看到X会对Y的认知产生什么影响——也就是P(Y|X)。大部分机器学习模型从线性回归到大型神经网络主要都在做这件事。你喂给它一堆历史数据它学会的是特征和标签之间的统计关联。广告点击率预估、商品推荐排序、图像分类本质上都停留在这一层。第二层是干预层。这层的问题变成如果我主动把X设定为某个值Y会变成什么——记作P(Y|do(X))。注意区别关联层里你只是看到XX是自然发生的干预层里你操作了X切断了外界对X的影响。经典例子是看到猫头鹰叫和下雨有关但你把猫头鹰的嘴绑上并不会让雨停。能做到干预层意味着系统开始理解操控一个变量对另一个变量的后果。第三层是反事实层。这一层问的是如果当初没有发生XY会怎样——哪怕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翻车事件本质上都是我们把关联层的指标误当成了因果层的保障。这些年我最大的体会回头再看那个评审会上的一句话我现在能更平和地理解它了。那位工程师的直觉有它的来源——大多数神经网络项目的确停留在相关性层面这是事实。但经验久了会变成惯性惯性久了会变成偏见偏见最后会伪装成真理。这个行业里太多理所当然的断言撑不了多问一句为什么。我在实际项目里收获最大的转变不是让神经网络真的变成了教科书意义上的因果模型而是把自己从能不能的争论中解放出来转去关心在什么条件下能和如何创造那些条件。同样的网络架构、甚至同一条训练数据只因为换了一套含干预信息的数据增强方案模型在分布外场景下的表现就可能完全不同。这些时刻让我越来越确信神经网络里严格因果的存在与否从来不是一个可以被一句话封印的问题而是一个藏在训练范式深处、等待被好好设计才能显现的行为特性。最后再分享一个实操层面的小建议下次再有人在你面前斩钉截铁地说神经网络学不了因果别急着反驳请他先把因果这个词定义清楚。你问完这一句讨论通常就会变得有意思很多。因为绝大多数人会被这个问题卡住——而卡住的那个瞬间正是思考真正开始的地方。
返回列表