Counterfactual / LLM causal reasoning · 逐篇深读 · 面向读者的解释

Executable Counterfactuals: Improving LLMs' Causal Reasoning Through Code

这篇论文不是在考模型会不会“把输入改掉,再运行一次程序”。 它刻意把程序内部的随机状态藏起来,只给模型一次真实运行的输入与输出;模型必须先从结果反推出当时可能的隐藏状态,再换输入,并且沿用 同一个隐藏状态 计算替代结果。作者用成对的 code/math tasks 发现:很多强模型会前向计算,却会在这一步“回看事实、恢复隐藏状态”的 abduction 上明显失速;只在 if_else 题上训练时,SFT 的迁移很脆,而 RLVR 更容易保住“先反推、再前向”的策略,但远没有把问题解决。

01 · Misconception repair

先拆掉最容易产生的误会

误会一:题目里有 “what if”,就是反事实

不一定。如果题目已经告诉模型隐藏状态 r=0.4,再问把 x 改成 3 会输出什么,模型只需做一次 forward execution。这是 intervention。

严格一些的反事实题会说:曾经输入 x=1,看见输出 y=-1,但 r 没告诉你;如果当时输入是 x=3同时保持那次运行中的 r 不变,输出会是什么?这里多出来的第一步才是 abduction。

误会二:executable counterfactual 是让模型调用 Python

不是。executable 指研究者可以执行程序或 computational graph,自动得到可核验的答案。论文的 code prompt 反而明确要求模型不要使用外部执行环境,而是在文本中推理。

误会三:RLVR 表现更好,等于模型学会了现实世界因果推理

也不是。模型看见完整程序,因果结构由代码预先给定;它学习的是一类受控 inverse-program problem 的解题策略。这个结果对“如何训练出可迁移的 abduction 行为”很有启发,但没有测试从现实数据发现机制,也没有证明模型内部形成了唯一、显式的 SCM。

02 · Objective verdict

先给一个客观判决

判决层级 最稳妥的表述
论文有力支持 在同一程序上,只把隐藏状态从“给出”改成“需要从事实结果反推”,就会造成很大的性能落差;当前模型的短板不只是 forward computation。
论文提供了较强但有限的证据 只在 if_else synthetic code 上用 RLVR 训练,能比 long-CoT SFT 更好地迁移到更长分支、多个隐藏变量、while loop 和 GSM-style 合成数学题。
论文尚未唯一证明 RLVR 学到的是一般性的 causal cognition,而不是逆向求解、搜索、程序模拟或适应该生成器的其他算法。
论文没有检验 未知机制的 causal discovery、现实 observational data、hidden confounding、连续 posterior、真实医疗决策,以及允许 agent 调工具时的表现。

最准确的定位是:一个把 abduction 从反事实措辞中剥离出来、变成可执行且可配对检验的受控 benchmark,同时给出一组 post-training 对比证据。

03 · Mental model

一个直观世界

想象一台封住旋钮的饮料机。每次运行前,机器内部先抽取一个隐藏档位 r,然后读取你按下的按钮 x,输出饮料量 y

你亲眼看见:

按钮 x = 1
机器输出 y = -1
内部档位 r = ?

现在问:“如果那一次按的是 x=3,输出会怎样?”

你不能重新抽一个档位,也不能随便假设 r=0。你要做的是:

事实证据 (x=1, y=-1)
-> 反推出与事实相容的 r
-> 把 x 改成 3
-> 保持同一个 r,重新计算 y

论文的全部设计都围绕这句“保持同一个 r”展开。它把人们口头上很容易混在一起的两件事分开了:

intervention:   已知世界状态,换动作
counterfactual: 从事实恢复世界状态,再换动作
04 · Real setup

真实问题与实验设定

程序对应一个小型 SCM

最小图是:

X ----> Y <---- R
  • X:可干预的输入;
  • R:本次运行中的隐藏随机状态;
  • Y=f(X,R):程序输出。

论文给模型源代码、事实输入 x、事实输出 y 和替代输入 x',但不直接给 r。如果多个 r 都能解释同一个事实输出,正确答案就可能是一个集合,而不是一个数字。

形式上,先找与事实相容的隐藏状态集合:

\[\mathcal R(x,y)=\{r:f(x,r)=y\},\]

再计算反事实答案集合:

\[\mathcal Y_{x'}(x,y)=\{f(x',r):r\in\mathcal R(x,y)\}.\]

这也是为什么论文同时报告 set-level F1 和 exact match:模型少找、多找或找错一个可能答案,含义不同。

四类 code task

split 程序结构 它在检查什么 规模
ID if_else 与训练同类的短分支 同分布能力 500
OOD if_else-long 更长、更深的嵌套分支 长度和组合复杂度 480
OOD multi_r 三个隐藏输入,另含简单 for loop 新 causal structure / 多隐藏状态 575
OOD while 训练未见的 while control flow 新控制逻辑 480

作者从少量 templates 生成可执行函数:训练侧有 8 个 function templates,并提供 15 组 template/code-block 组合;各 evaluation setup 使用 3-4 个 templates。完整 code block、operators 和 values 都可变化,生成后再 deduplicate。模板候选由 Claude-4-Sonnet 协助起草并经过人工检查。

一对题,只差 abduction

对每个 counterfactual code/math task,作者构造一个 interventional counterpart:代码与数值条件不变,只把原来隐藏的 r 明示出来。这样,两题的 forward computation 基本相同,主要差别就是是否需要根据 (x,y) 回推 r

从 code 迁移到 math

GSM-style math tasks 把隐藏状态改写成日常叙事里的未知费用、每件附加费或额外物品数量。例如总账单已知,但每盘服务费没写出;先从事实账单反推出服务费,再问订购数量改变后的总价。

ground truth 来自执行 computational graph。作者还会改变隐藏量检查最终答案是否真的随之变化;若不变化,就重新生成该题。

训练比较

  • SFT:在 5,500 个、只含 if_else 逻辑的 counterfactual code prompts 上训练;reasoning traces 来自 DeepSeek-R1-Distill-Qwen-32B,经 rejection sampling 筛选。训练对象是 Qwen2.5-1.5B/3B/7B-Instruct。
  • RLVR:同样从 Qwen2.5 三个规模出发,以 exact match 为 verifiable reward,用 GRPO 做 1,500 steps;prompt batch size 16,rollout size 24。
  • 测试:除受控训练模型外,还包含 32B/72B Qwen、Llama-3.3-70B、GPT-4o、Claude-4-Sonnet、R1-Distill-Qwen-32B、QwQ-32B 与 o4-mini。每题采样 k=3,报告 avg@k。
05 · Method walkthrough

方法或任务流程

对一条 code counterfactual,读者可以把正确流程压缩成下面五步:

  1. 执行事实路径。 用已知 x 沿代码控制流走一遍,把 y 写成关于隐藏量 r 的约束。
  2. Abduction。 解约束,得到所有与事实 (x,y) 相容的 r;不能因为麻烦就任选一个。
  3. Intervention。 把输入覆盖成题目给出的 x',不回改事实结果,也不重新抽 r
  4. Prediction。 对每个相容 r 运行替代路径,收集所有可能输出。
  5. 集合核对。 去重、排序并按要求输出完整集合。

论文在 reasoning-trace 分析中看到的三种典型失败,刚好对应流程被破坏:

  • 无目的地穷举所有 r,没有先利用事实约束;
  • 题目复杂时任意指定一个 r
  • 不必要地反复分情况,陷入循环分析。
06 · Worked example

自己走一遍最小例子

下面不是论文原题,而是一个保持其任务结构的“锁住档位的混合器”:

def mixer(x, r):
    if r % 2 == 0:
        return (x + r) % 5
    return (2 * x + r) % 5

已知 r 只能取 {0,1,2,3}。事实运行是:

x = 1
y = 3
r 未知

问题:如果当时 x=4,保持同一个 r,输出可能是什么?

第一步:abduction,不要先改 x

逐个检查事实运行:

r mixer(1,r) 与 y=3 相容吗
0 1 no
1 3 yes
2 3 yes
3 0 no

所以事实没有唯一确定档位,只得到:

\[\mathcal R(1,3)=\{1,2\}.\]

第二步:intervention

x 改为 4,但候选档位仍然只有事实允许的 {1,2}

第三步:prediction

r=1 -> mixer(4,1) = (2*4+1) mod 5 = 4
r=2 -> mixer(4,2) = (4+2) mod 5   = 1

因此完整反事实答案是:

\[\mathcal Y_4(1,3)=\{1,4\}.\]

如果题目直接告诉你 r=1,答案只剩 4;那就是配对的 interventional task。这个小例子也解释了为什么随便猜一个 r 可能“碰巧答中一个值”,却仍然没有完成反事实推理。

07 · Results and evidence

关键结果与证据层级

结果一:隐藏 r,会让同一个程序骤然变难

Figure 3 的 paired comparison 是论文最干净的证据。以下都是 exact match:

model / task counterfactual interventional 落差
o4-mini / multi_r 42.3 85.0 -42.7 pp
o4-mini / while 74.4 99.4 -25.0 pp
Claude-4-Sonnet / multi_r 58.8 99.5 -40.7 pp
Claude-4-Sonnet / while 46.9 89.8 -42.9 pp
Qwen2.5-72B / while 9.0 55.1 -46.1 pp

它有力说明:forward execution 能力不能代表完整 counterfactual ability。由于两题仍然在信息量和 inverse-search difficulty 上不同,这个 gap 最直接证明的是“abduction-like inverse problem 很难”,而不是单凭分数就证明模型缺少某个唯一的因果模块。

结果二:SFT 擅长见过的形状,却没有保住跨结构策略

以 Qwen2.5-7B 为例,Table 1 的 F1 为:

model ID if_else if_else-long multi_r while
base 38.8 54.9 21.6 7.3
SFT 75.8 61.4 24.9 2.5
RLVR 81.7 75.0 40.3 11.2

SFT 在 ID 上大涨,也能承受一部分“只是变长”的变化;但隐藏变量数量、控制流或问题领域一变,收益缩小,while 甚至从 base 的 7.3 降到 2.5。

结果三:code-to-math transfer 最能显示训练差异,也最能显示离“解决”还有多远

Figure 4 的 GSM-counterfactual accuracy:

Qwen size base SFT RLVR
1.5B 9.0 1.5 11.0
3B 22.0 8.5 27.7
7B 39.0 12.9 46.3

这里 SFT 明显负迁移,RLVR 则在三个规模上都超过 base。但最强的 7B RLVR 也只有 46.3:论文展示的是“更会迁移”,不是“已经可靠”。

结果四:行为痕迹支持“策略与计算是两个瓶颈”

作者用 o4-mini judge 将 trace 分成:

  • planning:是否遵守 abduction -> intervention -> prediction;
  • execution:程序模拟和数值计算是否正确。

Figure 5 中,大模型的 execution 往往提高,planning 却不随规模单调提高;SFT 的 planning 在 OOD 上下降;RLVR 的 planning 最稳定,但在 multi_rwhile 上仍因计算错误失分。

这是有价值的诊断性证据,但比自动 ground-truth 分数弱:judge rubric 预先把目标策略写成“正确计划”,它证明输出文本更符合该计划,不等于证明模型内部以 SCM 形式执行,也没有排除模型生成一段合规 trace 后用别的计算得到答案。

08 · Objective review

综合客观评价

这篇论文最有说服力的贡献不是“RL 胜过 SFT”这句口号,而是它设计了一个很好的差分测量:同一程序、同一替代输入、近似相同的 forward computation,只改变隐藏状态是否已知。这个配对把许多 benchmark 中被措辞掩盖的 abduction 缺口直接暴露出来。

证据 它真正削弱的解释 仍然存在的替代解释
paired counterfactual vs interventional gap “模型只要会执行程序,就会做完整反事实” 隐藏 r 只是额外 inverse-search / constraint-solving 难度;未必需要独立 causal faculty
template-held-out code OOD 只记住一个具体函数即可 仍可能学习少量 template family 上的程序启发式,而不是开放式结构泛化
code-to-GSM transfer 收益完全依赖 Python surface form 两域共享相似的合成 arithmetic graph 与隐藏量设计,离自然现实域仍远
RLVR 优于 SFT teacher-trace imitation 足以稳定迁移 两种训练的监督形态、优化轨迹和 compute 不同,不能推出 RL 普遍优于一切 SFT
trace planning score 模型输出完全没有三阶段结构 LLM judge 的 rubric adherence 不等于内部算法或因果表征

所以客观结论应是:论文很好地 operationalize 了“同一背景状态下改动作”这个反事实核心,并给出了 RLVR 在其合成 family 内更能保持该策略的证据;它还没有把“可执行的 inverse program solving”与“普遍的现实 causal cognition”唯一等同起来。

09 · Limitations

主要局限性

  1. 机制是已知代码,不是待发现的世界。 模型读到完整 f(x,r),无需从 observational/interventional data 识别 causal structure;它主要在做隐藏输入恢复与程序执行。
  2. OOD 仍位于小型生成器宇宙。 训练来自 8 个 if_else templates,evaluation 每类只有 3-4 个 templates;while、多 r 与 GSM 是有意义的结构迁移,但不是任意程序或任意现实机制。
  3. 隐藏状态被简化成可枚举、可精确核对的值。 现实反事实常涉及连续 latent posterior、噪声、非识别、多种 cross-world coupling 和模型不确定性;这里主要用有限答案集合处理歧义。
  4. paired gap 不只增加“因果性”,也增加 inverse difficulty。 隐藏 r 后,题目同时需要解约束、搜索可能值和维护集合;缺少一个计算量严格匹配但不具因果语义的 inverse-control task。
  5. RLVR 与 SFT 不是一项只改变学习算法的干净消融。 一个模仿 teacher traces,一个用 1,500-step outcome reward 优化;监督内容、训练动态与算力预算不同,不能据此断言 RL 天生比 SFT 更适合因果推理。
  6. 最难任务仍然很弱。 Qwen2.5-7B-RL 在 while 上只有 11.2 F1 / 8.1 EM;GSM transfer 最高示例为 46.3 accuracy。策略改善和可靠能力之间还有明显距离。
  7. reasoning-trace 证据依赖单一 LLM judge。 planning rubric 明确规定目标步骤;论文正文所述流程没有给出独立 human agreement 或内部 mechanistic evidence。
  8. 合成题可能携带 generator artifacts。 templates 和 code blocks 的有限组合、Claude 辅助起草方式,都可能留下可利用的表面规律;deduplication 不能自动排除结构泄漏。
  9. 现实 high-stakes 外推没有被测试。 医疗例子只是说明图,实验没有患者数据、临床 mechanism uncertainty 或真实决策损失。
  10. 当前公开可复现面仍不完整。 官方 GitHub 在本次核验时只有 README 和数据链接,没有论文所需的 runnable training/evaluation code;本导读也没有声称复现任何表格。
10 · Stronger tests

什么实验会让结论更强

  • 增加一个难度匹配的非因果 inverse-control benchmark:同样需要解隐藏量和集合搜索,但不要求 cross-world state persistence,用来分离 causal framing 与 generic inverse computation。
  • r 扩展成连续、带噪 posterior,要求模型输出 calibrated distribution,而不是有限 exact-match set。
  • 构造 observational/interventional marginals 相同、但 cross-world coupling 不同的程序世界;只有真正保持 unit-level background state 才能答对。
  • 用独立作者、不同编程语言和非 template-based generators 创建完全新机制,并在变量数、递归、stateful objects、并发与长 horizon 上做 structured OOD。
  • 在等训练 token、等 wall-clock、等 rollout compute 下比较 SFT、rejection-sampled SFT、DPO/RLVR 及混合训练,避免把 supervision budget 差异归因为算法差异。
  • 对 planning/execution traces 做盲评 human validation,并加入 process intervention:修改模型中间表示或交换 abducted state,检查后续预测是否局部、一致地改变。
  • 测试能调用 Python、symbolic solver 或 retrieval tool 的 agent:区分“模型内部算不出”和“系统能否可靠组织 abduction workflow”。
  • 完整发布 generator、splits、training scripts、model checkpoints 与每题 predictions,让 paired gap 和 post-training 对比可以独立复核。
11 · Claim boundary

论文可以支持什么结论

它可以支持:

  • 反事实 evaluation 若不要求 abduction,确实可能高估模型的 Level-3-like ability;
  • 在受控 code/math family 中,隐藏状态恢复是比 forward execution 更明显的瓶颈;
  • 5,500 个 if_else 训练题上的 long-CoT SFT 主要改善 ID,跨 causal structure / control flow / domain 的迁移不稳定;
  • 本文的 RLVR 配置比相应 SFT 配置更稳定地诱导出可见的 backward-then-forward strategy;
  • 正确的反事实计划和正确的程序计算可以异步发展,应该分开评估。

它不能支持:

  • 所有被称为 counterfactual 的既有任务都无效;
  • 会解 executable counterfactual 就等于发现或理解现实 SCM;
  • RL 是改善 causal reasoning 的唯一或普遍最优路线;
  • 更大模型不会改善 abduction,或 RLVR 已经解决 OOD counterfactual reasoning;
  • code-to-synthetic-math transfer 会自然推广到医疗、科学或政策决策;
  • 模型生成符合三步 rubric 的文字,就证明内部存在一个可识别的 causal model。
12 · Research connection

为什么它与当前研究有关

对当前 portfolio,D1 最有价值的不是把 P17 换成 code benchmark,而是强迫我们写清一个 operational counterfactual 的状态边界:

observed trace
-> abduce active runtime / source / tool / worktree / projection regime
-> apply one repair intervention
-> predict the trace under the same relevant background state

如果只把 repair 换掉、却重新假设了 source access、tool state 或 runtime regime,那仍然只是另开一个世界,不是“同一个事故如果换一种修复会怎样”。

它也为 DiscoSCM 留下一条更具体的后续问题:D1 的 r 把 unit identity、event noise 和 regime 压在一个隐藏量里。我们可以测试显式拆开这些对象后,agent 是否能更稳定地保持“同一个 unit / 同一事件背景”,并在 regime shift 或 noise-coupling 变化时给出 calibrated counterfactual。这个问题要靠新实验回答,不能把 D1 的结果直接当成 DiscoSCM 的证据。

13 · Reading path

推荐阅读顺序

  1. Figure 1 + Section 2:先看 code 例子,真正理解 counterfactual 与 interventional 只差在哪里。
  2. Section 3.1 + Figure 2:看 templates、三层 placeholders、modulo 为什么产生多个合法答案,以及四种 code structure 如何划分 ID/OOD。
  3. Section 3.2:看 GSM-style hidden fee 如何把同一结构移到自然语言数学题。
  4. Figure 3:先读 paired gap,不要先被训练方法吸走注意力;这是最核心的 benchmark evidence。
  5. Table 1 + Figure 4:逐列比较 base / SFT / RLVR;特别看 while 的绝对低分和 GSM 上 SFT 的负迁移。
  6. Section 5 + Figure 5:区分 planning 与 execution,并把 LLM-judge evidence 放在正确层级。
  7. Appendix D:核对作者为何认为许多“counterfactual”会退化成 intervention。
  8. Appendices H-I:直接读 counterfactual/interventional prompts,确认两种任务实际给了模型哪些信息。
  9. Appendix K:最后核对 5,500 条训练数据、1,500 RL steps、测试集规模与 sampling protocol。
14 · Sources and next reading

论文来源与相邻阅读

  • arXiv abstract: https://arxiv.org/abs/2510.01539
  • arXiv HTML: https://arxiv.org/html/2510.01539
  • Paper PDF: https://arxiv.org/pdf/2510.01539
  • OpenReview forum: https://openreview.net/forum?id=Lm46gJA0q8
  • Official author repository: https://github.com/AniketVashishtha/Executable_Counterfactuals
  • Released dataset surface: https://huggingface.co/datasets/Raidriar-Dai/executable-counterfactuals
  • Source boundary: arXiv HTML/PDF, official repository and released dataset surface were checked on 2026-07-10; OpenReview body was challenge-gated in this environment; no experiment was rerun.