AI 工程基础体系 · 第 56/100 篇。内容覆盖机器学习、深度学习与生成式 AI;模型、数据、评测、权限和成本会作为同一生产系统处理。
因果推断基础:相关与因果、DAG、混杂、实验和反事实
机器学习通常回答“给定输入,结果会是什么”,因果推断进一步回答:
如果主动改变某个变量,结果会如何改变?
例如:
- 哪个用户会流失,是预测问题;
- 给用户发送优惠券是否会降低流失率,是因果问题;
- 把模型从版本 A 切换到版本 B 是否提高了生成质量,是因果问题;
- 增加 GPU 数量是否降低端到端延迟,也是因果问题。
预测模型关注条件分布:
因果问题关注干预后的分布:
其中 表示系统被外部操控,强制把 设置为 ,而不是观察到 。两者在某些条件下相等,但不能默认相等。
一、相关不等于因果
1. 相关描述共同变化,因果描述干预结果
假设观察到:
这只能说明 与 在数据中有关联。它可能由三类情况产生:
- 导致 ;
- 导致 ;
- 第三个变量 同时导致 和 。
第三种情况称为混杂。例如,观察发现夏季冰淇淋销量和溺水人数同时上升。冰淇淋不会导致溺水,真正的共同原因可能是气温:
因此,相关性是数据分布中的事实,因果性是关于改变系统后结果的假设或可识别结论。
2. 一个数值反例
设人群中有两类人:
- 低风险人群:不接受治疗时的康复率为 ,接受治疗后为 ;
- 高风险人群:不接受治疗时的康复率为 ,接受治疗后为 。
治疗对两类人都有正向作用。但如果治疗主要分配给高风险人群,可能观察到:
| 人群 | 治疗组康复率 | 未治疗组康复率 |
|---|---|---|
| 低风险 | 95% | 90% |
| 高风险 | 30% | 20% |
若治疗组几乎全是高风险人群,而未治疗组几乎全是低风险人群,直接比较总体康复率可能得出“治疗组更差”。这不是治疗的真实效果,而是治疗分配机制造成的混杂。
3. 预测准确不代表因果正确
一个特征可能非常适合预测,却不适合干预。
例如,医院模型用“是否住院”预测死亡风险,预测性能可能很好;但如果把“住院”从系统中人为删除,不能据此推断死亡率会下降,因为住院可能是疾病严重程度的结果,而不是可随意移除的原因。
同样,生成式 AI 系统中,“用户是否点击了答案”可以预测后续留存,但把界面改到更容易点击,并不必然提高真实任务完成率。点击可能只是代理指标,甚至会被界面诱导。
二、反事实:因果问题的正式表达
1. 潜在结果
设处理变量为 ,结果为 。最简单的二元处理场景中:
- :接受处理;
- :不接受处理。
对同一个个体,定义两个潜在结果:
个体处理效应是:
但同一个个体在同一时刻只能实际接受一种处理,所以只能观察到:
另一个潜在结果是反事实,无法直接观测。这就是因果推断的基本困难:缺失的不是普通随机缺失值,而是每个个体必然缺失一个潜在世界。
2. 常见因果 estimand
平均处理效应(ATE)为:
在期望具有线性的情况下:
条件平均处理效应(CATE)为:
它描述具有特征 的人群的平均处理效果,例如不同用户群体对推荐策略的增量响应。
个体处理效应(ITE)是:
ITE 在通常的观测数据中不能直接验证,因为两个结果不能同时观察。模型输出的个体增量效果必须依赖额外假设、实验数据或结构模型,不能当作无误差的“个人真相”。
3. 三个关键假设
从观测数据估计处理效果时,常见的识别假设包括:
一致性
如果个体实际接受了 ,则实际观测结果等于对应潜在结果:
这要求“处理”定义清楚。例如“使用新版模型”不能同时包含不同提示词、不同采样参数和不同流量路由,否则 到底代表什么并不明确。
可交换性或无未测混杂
给定协变量 后,处理分配与潜在结果独立:
直观上,控制 后,处理组和对照组在潜在结果上可比较。这个假设无法仅凭统计检验完全证明,因为未测变量本身不可见。
正值性
对所有关注的 ,两种处理都有非零概率:
如果某类用户永远接受新模型,从未使用旧模型,就无法仅靠该数据比较这类用户的两种结果。工程上,这对应流量覆盖不足或策略分配过于确定。
三、DAG:用图表示因果结构
1. DAG 的定义
DAG 是 Directed Acyclic Graph,即有向无环图:
- 节点表示变量;
- 有向边表示直接因果方向;
- “有向”表示方向;
- “无环”表示不能沿箭头回到原节点。
例如:
graph LR
Z[用户风险] --> T[是否接受治疗]
Z --> Y[康复结果]
T --> Y
这里:
- 是共同原因;
- 是处理;
- 是结果;
- 是处理路径;
- 是混杂路径。
DAG 不会自动从数据中“发现真相”。它表达的是领域知识、设计假设或待检验的结构假设。错误的图会导致错误的调整。
2. 路径与 d-separation
在 DAG 中,路径可以暂时不考虑箭头方向。例如:
这条路径连接处理和结果,但它不是处理导致结果的路径,而是混杂路径。
d-separation 是判断图中条件独立关系的规则。核心节点类型有三种:
链
不控制 时,路径开放;控制 后路径被阻断。
分叉
是共同原因。不控制 时,混杂路径开放;控制 可以阻断它。
碰撞点
同时接收两条箭头,是碰撞点。默认情况下该路径被阻断;控制 或控制其后代,可能把路径打开。
碰撞点是一个常见反直觉来源。
四、混杂、碰撞点和中介变量
1. 混杂变量
混杂变量是处理和结果的共同原因,导致非因果路径:
例如:
graph LR
A[广告曝光] --> B[购买]
U[用户购买意愿] --> A
U --> B
用户购买意愿 同时影响广告曝光和购买。直接比较曝光组与未曝光组,会把用户本来就更想购买的部分效果误认为广告效果。
混杂不是“相关性高”这么简单,而是由因果结构定义。一个与处理高度相关的变量未必是混杂变量;一个相关性不高但真正造成偏差的变量也不能被忽略。
2. 后门路径与调整集
从处理 到结果 的路径,如果第一条边是指向 的箭头,就称为后门路径。例如:
若协变量集合 :
- 不包含处理变量的后代;
- 阻断了所有从 到 的后门路径;
则 满足后门调整条件。此时可以用:
估计干预分布。
这个公式的步骤是:
- 按 分层;
- 在每层中比较 与 ;
- 按目标总体中 的分布重新加权。
二元结果下,ATE 可以写成:
这里的关键不是“把所有变量都放进模型”,而是根据因果图选择合适的调整变量。
3. 碰撞点:控制后反而产生偏差
设:
graph LR
T[治疗] --> C[是否进入研究]
Y[潜在康复结果] --> C
在总体中,治疗和康复结果可能没有关系。但如果只分析“进入研究”的人,就等价于条件化于碰撞点 。由于进入研究由两者共同决定,条件化后可能产生虚假的 与 相关性。
实际例子包括:
- 只分析已经通过审核的用户;
- 只分析已经点击的用户;
- 只分析成功调用模型的请求;
- 只分析被人工升级的工单。
“成功进入样本”可能是处理和结果的共同后果。对它做过滤会引入选择偏差。
4. 中介变量:总效应和直接效应不同
设:
graph LR
T[处理] --> M[中介变量] --> Y[结果]
T --> Y
如果治疗通过恢复速度 影响康复 ,那么 是中介变量。
- 总效应包括 和 ;
- 控制 后,通常不再估计总效应;
- 控制 可能接近某种直接效应,但需要更强的中介识别假设。
因此,若问题是“治疗总体是否有效”,不应机械控制所有治疗后的变量。若问题是“效果有多少来自某条机制”,才需要专门的中介分析。
五、一个完整的混杂调整算例
设用户风险 分为低风险和高风险,治疗 与康复 的数据如下:
| 风险 | 样本数 | 康复率 | |
|---|---|---|---|
| 低 | 1 | 90 | 95% |
| 低 | 0 | 10 | 90% |
| 高 | 1 | 10 | 30% |
| 高 | 0 | 90 | 20% |
直接比较:
直接差异为 个百分点,看起来治疗效果极强。
但这两个总体的风险构成不同。若目标总体中低、高风险各占一半,按风险调整:
因此:
调整后仍然是正向效果,但远小于未经调整的 个百分点。前者回答“在相同风险构成下,治疗带来的平均变化”,后者混入了治疗组更偏低风险这一事实。
若某个风险层中只有治疗组、没有对照组,则正值性不成立,不能从这张表可靠估计该层的反事实结果。
六、实验:用随机化制造可比性
1. 随机对照实验
随机实验把处理 随机分配给参与者。理想情况下:
因此:
于是:
随机化的价值不是让样本“完全相同”,而是让处理分配与潜在结果独立;有限样本中仍会有随机波动,所以需要置信区间和预先定义的分析方法。
2. A/B 实验的基本数据流
一个模型或产品实验通常包含:
- 请求进入实验路由;
- 根据稳定随机规则分配处理组或对照组;
- 记录实验版本、分配时间和实验单元;
- 收集结果指标;
- 按实验单元聚合并估计组间差异;
- 检查实验污染、缺失、延迟和副作用。
随机单元必须与干扰范围匹配:
- 若一个用户的推荐会影响另一个用户,按请求随机可能产生污染;
- 若团队成员共享缓存或资源,按单次请求随机可能无法隔离;
- 若对话上下文持续存在,应按会话或用户随机,而不是按每轮消息随机。
3. SUTVA、干扰和处理版本
潜在结果框架常依赖 SUTVA,通常包含两层含义:
一致处理版本
必须表示同一种处理。若新模型同时改变模型权重、系统提示词、检索库和温度,那么实验测到的是一个组合处理,而不是单一因素的效果。
无干扰
一个个体的处理不应改变另一个个体的潜在结果。推荐、广告竞价、社交产品和共享 GPU 资源经常违反这一假设。
违反无干扰时,简单的用户级 A/B 差异可能仍有业务意义,但不再等同于“对单个用户独立施加处理”的标准 ATE,需要使用集群随机化、网络实验或明确的市场级 estimand。
4. 指标、统计显著性和实际意义
假设实验组转化率为 ,对照组为 ,估计差异:
统计显著性回答“在零效果假设下,这种差异是否较不寻常”;它不回答效果是否足以覆盖迁移成本、延迟增加或安全风险。
生成式 AI 实验至少要区分:
- 任务成功率;
- 人工或模型辅助质量评分;
- 延迟和错误率;
- 单请求成本;
- 有害内容、隐私泄露和越权率;
- 长期留存或重复使用。
只优化即时点击,可能因奖励短期行为而损害真实任务完成率。多个指标和多轮查看结果还会增加偶然发现的风险,因此应在实验前定义主要指标、观察窗口和停止规则。
七、没有实验时:观测数据如何估计因果效应
1. 回归不是自动的因果推断
常见回归形式为:
若 阻断了所有相关后门路径,且模型形式、测量和正值性等条件成立, 才可能具有因果解释。
仅仅“把很多特征喂给回归模型”并不能保证这一点:
- 漏掉关键混杂变量会产生遗漏变量偏差;
- 加入碰撞点会打开非因果路径;
- 加入处理后的中介可能改变 estimand;
- 高维模型的预测最优特征集合不一定是因果调整集合。
scikit-learn 的回归、分类和交叉验证工具主要解决预测建模问题。它们可以作为因果估计中的结果模型或倾向得分模型,但不会替用户决定 DAG、识别调整集或验证无未测混杂假设。
2. 倾向得分
倾向得分定义为:
它描述具有协变量 的个体接受处理的概率。常见用法包括:
- 匹配;
- 分层;
- 逆概率加权;
- 双重稳健估计。
例如,逆概率加权可以让观测样本重新形成一个处理分配更接近随机的伪总体。处理组常使用权重 ,对照组使用 ,具体还需根据 estimand 和稳定化方案定义。
倾向得分模型预测得很准并不一定更好。若处理几乎完全可由 预测,可能意味着正值性很差,权重会爆炸,估计方差很大。诊断时要查看:
- 处理组和对照组的协变量平衡;
- 倾向得分分布和极端权重;
- 不同模型设定下的敏感性;
- 缺失值和选择进入样本的机制。
3. 双重稳健的直觉
双重稳健方法通常同时建模:
- 结果模型 ;
- 处理模型 。
在一定条件下,只要其中一个模型正确,估计仍可能保持一致;但“双重稳健”不是免检验保证,也不能修复未测混杂、错误处理定义或违反正值性。
八、反事实与机器学习
1. 反事实预测和普通预测的区别
普通预测输入实际观测的 ,输出:
反事实预测需要回答:
它要求模型学习“同一个对象在不同处理下的结果差异”,而不是只学习观察到的相关模式。
例如,对一个用户推荐优惠券:
- 普通模型预测该用户是否购买;
- 因果模型分别预测“发券时购买概率”和“不发券时购买概率”;
- 两者之差才是增量购买概率。
只给最可能购买的人发券可能浪费预算,因为他们即使不发券也会购买。因果策略应优先考虑:
较高的人群。
2. 因果机器学习的边界
CATE、uplift、因果森林和神经网络等方法可以估计异质处理效应,但异质性更难验证:
- 个体反事实无法直接观测;
- 子群体切分会减少样本量;
- 多次搜索容易得到虚假的“高效果人群”;
- 训练目标可能与业务 estimand 不一致;
- 分布变化会改变处理机制和响应规律。
因此,因果模型的评测不能只看预测误差。还应使用留出实验、策略价值、校准、子群体稳定性和成本约束进行验证。
九、生成式 AI 中的因果问题
1. 模型版本切换是干预,不是普通特征
设:
- :模型版本 A;
- :模型版本 B;
- :任务成功、人工评分或安全事件。
若请求随机路由到两个版本,组间结果差异可以估计版本切换的平均效果。若高价值客户被优先路由到 B,则“B 的用户平均质量更高”不能直接归因于 B。
需要记录处理发生前的协变量,例如:
- 任务类型;
- 用户等级;
- 输入长度;
- 语言;
- 风险等级;
- 历史使用频率。
但不能把模型输出后的人工升级、用户是否点赞等后处理变量直接当作普通控制变量,否则可能控制了中介或碰撞点。
2. 检索增强生成的干预边界
RAG 系统至少有多个可能干预:
如果只改变检索器,应该固定模型、提示词、上下文预算和采样配置,才能将差异主要解释为检索器变化。若同时更新知识库和生成模型,实验估计的是整条组合流水线的效果。
3. 离线评测不能自动代表线上因果效果
离线数据集常常固定了输入和参考答案,测得的是条件下的质量差异。线上系统还会受到:
- 用户改变提问方式;
- 失败后重试;
- 延迟导致放弃;
- 内容改变后下游行为变化;
- 缓存、限流和成本策略;
- 安全过滤器触发。
因此,离线分数适合做筛选和回归测试,线上随机实验或准实验才更接近“部署该版本会造成什么变化”。
十、代码:模拟混杂与调整
下面的示例只使用 NumPy,模拟一个由风险 造成混杂的数据集。真实治疗效果设为正向,但治疗更常分配给低风险用户。
import numpy as np
rng = np.random.default_rng(7)
n = 100_000
# Z=0 表示低风险,Z=1 表示高风险
z = rng.binomial(1, 0.5, size=n)
# 高风险用户更可能接受治疗:这是混杂分配机制
p_treat = np.where(z == 0, 0.90, 0.10)
t = rng.binomial(1, p_treat)
# 不治疗时的康复概率
p_y0 = np.where(z == 0, 0.90, 0.20)
# 治疗使两类人的康复概率分别提高 0.05 和 0.10
p_y1 = np.where(z == 0, 0.95, 0.30)
# 生成实际观测结果
p_y = np.where(t == 1, p_y1, p_y0)
y = rng.binomial(1, p_y)
# 1. 直接比较:混入风险构成差异
naive = y[t == 1].mean() - y[t == 0].mean()
# 2. 按风险分层调整,再按总体风险分布加权
effect_low = y[(t == 1) & (z == 0)].mean() - y[(t == 0) & (z == 0)].mean()
effect_high = y[(t == 1) & (z == 1)].mean() - y[(t == 0) & (z == 1)].mean()
adjusted = 0.5 * effect_low + 0.5 * effect_high
# 3. 由于模拟过程知道真实潜在结果,可计算真实 ATE。
# 真实数据中通常无法同时观察 y1 和 y0。
true_ate = (p_y1 - p_y0).mean()
print(f"naive difference: {naive:.3f}")
print(f"adjusted difference: {adjusted:.3f}")
print(f"true ATE: {true_ate:.3f}")
典型输出会接近:
naive difference: 0.615
adjusted difference: 0.075
true ATE: 0.075
每一步的含义是:
z影响治疗概率,制造了 的后门路径;y只生成实际接受的那一种处理结果;naive把不同风险构成的两组直接混合比较;adjusted在每个风险层内比较,再恢复到总体风险分布;true_ate使用模拟器内部同时生成的 和 ,现实数据通常没有这个条件。
这段代码说明了调整为什么有效,但不能证明真实项目中的调整一定有效。真实项目还必须回答:风险变量是否测量准确、是否存在未测混杂、处理是否有足够重叠、结果窗口是否定义一致,以及样本是否因进入系统而产生选择偏差。
十一、常见失败表现与诊断路径
1. 把时间顺序当成因果关系
“先发生”只是因果的必要条件之一,不是充分条件。日志中模型调用早于用户点击,并不能证明调用导致点击;共同原因可能是用户任务难度或渠道来源。
诊断时应先明确:
- 干预对象是什么;
- 干预发生在结果之前的哪个时间点;
- 哪些变量在干预前已知;
- 结果窗口从何时开始;
- 是否存在延迟反馈。
2. 控制了处理后的变量
如果模型版本 影响响应延迟 ,而延迟又影响任务成功 ,控制 会移除一部分总效果。若问题是“部署新模型的总影响”,这通常是错误调整。
应先画出时间顺序和 DAG,再决定调整变量,而不是看到相关特征就全部加入。
3. 只分析完成请求或活跃用户
失败请求、超时请求和未继续使用的用户通常不是随机缺失。只保留成功调用或完成问卷的样本,可能条件化于处理和结果的共同后果。
生产诊断需要同时保留:
- 分配到实验的全部单位;
- 实际接收处理的单位;
- 成功、失败、超时和退出状态;
- 结果缺失的原因。
随机实验中,按最初分配分析的 intention-to-treat 通常能保留随机化带来的可比性;按实际接受处理分析可能回答另一个问题,并受到合规或执行差异影响。
4. 忽略权限、成本和安全结果
如果新模型只能对部分用户启用,那么“平均效果”依赖于可触达用户群。权限规则本身可能与用户风险和结果相关,成为处理分配的一部分。
因果评估不应只记录质量指标,还应记录:
- 谁被允许接受处理;
- 谁实际接受处理;
- 每次调用和重试成本;
- 延迟、限流和资源争抢;
- 越权、隐私泄露和安全拦截;
- 数据访问是否符合最小权限和审计要求。
例如,降低安全拦截率可能提高表面任务成功率,但如果同时增加高风险输出,不能称为整体改进。
十二、如何形成一条可信的因果论证
一个完整的因果结论至少应包含以下逻辑链:
- 定义处理:明确要改变的变量、版本、时间和作用范围;
- 定义结果:指定指标、观测窗口、缺失规则和副作用;
- 定义 estimand:是 ATE、CATE、总效应、直接效应,还是某个策略的价值;
- 画出 DAG:列出已知共同原因、中介、碰撞点和选择机制;
- 选择识别方法:优先随机实验;否则说明调整、加权、工具变量、断点或差分设计所依赖的假设;
- 检查支持条件:一致性、可交换性、正值性、干扰和稳定的处理定义;
- 估计不确定性:报告置信区间、敏感性分析和多重比较处理;
- 验证迁移风险:检查不同用户群、模型版本、数据分布、成本和安全结果;
- 保留可审计记录:保存分配、版本、输入摘要、结果、权限和失败路径,同时遵守隐私与访问控制。
最重要的边界是:数据本身通常只能告诉我们“在某种生成机制下发生了什么”,而因果推断要进一步说明“如果改变某个变量,会发生什么”。这个额外结论来自随机化,或来自明确且可信的结构假设。没有干预设计、因果图和反事实定义时,单纯的相关性、预测精度或回归系数都不足以承担因果解释。
系列导航与关联阅读
- 系列入口:AI 工程完整学习路线:从机器学习与 Transformer 到 RAG、Agent 和生产治理
- 上一篇:模型可解释性:特征重要性、SHAP、局部解释与误用边界
- 下一篇:深度学习张量与形状:维度、广播、布局、批次和调试方法
官方资料
本文依据研究论文、标准组织与主流框架官方文档重新梳理;正文、示例与工程清单由 WR BLOG 编写。

评论
0 条讨论