因果抽象:机制可解释性理论基础
1. 背景:从电路发现到因果抽象
1.1 机制可解释性的挑战
机制可解释性(Mechanistic Interpretability)旨在理解神经网络如何计算:
- 电路发现:识别实现特定功能的子图
- 特征分析:理解单个神经元/方向的含义
- 动态追踪:跟踪信息在网络中的流动
然而,缺乏统一理论框架导致:
- 方法不系统,难以推广
- 验证困难,缺乏可测试预测
- 难以处理复杂的多层交互
1.2 因果抽象的引入
因果抽象(Causal Abstraction)由Geiger等人提出(JMLR 2025),为机制可解释性提供严格的形式化基础:
- 将神经网络解释为因果模型
- 建立高层因果结构与低层实现的联系
- 提供可测试的预测
2. 因果抽象形式化
2.1 因果模型定义
高层因果模型 :
- 变量集合
- 因果图结构
- 机制函数
低层实现 :
- 神经网络层激活
- 网络计算图
- 激活函数和权重
2.2 实现映射
实现映射 将高层变量关联到低层激活:
2.3 因果抽象定义
定义:若存在实现映射 使得:
- 结构保持: 在 中存在边 和 在 中存在因果路径
- 机制保持:干预效果一致
则 因果抽象 。
3. 干预变换与机制变换
3.1 硬干预 vs 软干预
硬干预(-operator):强制变量取固定值
软干预:修改条件概率
3.2 机制变换
机制变换(Mechanism Transformation)是一类软干预:
其中 是对概率分布的变换。
性质:机制变换保持因果结构但改变机制参数。
3.3 抽象的稳定性
定理:如果 因果抽象 ,则 对机制变换保持抽象:
这解释了为什么神经网络的不同初始化仍能实现相同的因果算法。
4. ICL的因果解释
4.1 上下文学习作为因果推理
核心假设:Transformer的ICL(In-Context Learning)实现了隐式的贝叶斯因果推理。
4.2 因果模型
设高层因果模型 :
Z_context → Z_task
Z_task → Z_output
其中:
- :演示示例
- :任务变量
- :预测输出
4.3 实现验证
实验设计:
def test_causal_abstraction(model, task_description):
"""
测试模型是否实现了因果抽象
"""
# 定义因果干预
interventions = [
# 干预1: 修改演示对的标签
{"type": "hard", "variable": "Z_context", "value": counterfactual_context},
# 干预2: 改变任务描述
{"type": "soft", "variable": "Z_task", "distribution": shifted_distribution},
]
# 收集预测
predictions_before = model(original_prompt)
predictions_after = model(intervened_prompt)
# 计算因果效应
causal_effect = predictions_after - predictions_before
# 验证因果一致性
return verify_causal_consistency(causal_effect, expected_effect)4.4 关键发现
| 干预类型 | Transformer响应 | 因果预测 | 一致性 |
|---|---|---|---|
| 标签翻转 | 预测翻转 | 强因果效应 | ✅ |
| 任务改变 | 预测改变 | 条件因果效应 | ✅ |
| 演示顺序 | 基本不变 | 无因果效应 | ✅ |
5. 可验证的电路发现
5.1 传统电路发现的局限
- 手动分析耗时且易出错
- 统计方法难以提供因果保证
- 无理论框架连接发现和分析
5.2 因果抽象框架
框架流程:
高层因果模型 → 因果预测 → 实现映射假设 → 实验验证 → 电路确认
5.3 具体案例:IOI任务
Indirect Object Identification(IOI) 任务的电路发现:
# 高层因果模型
class IOICausalModel:
"""
IOI任务的因果模型
"""
def __init__(self):
# 变量定义
self.S1 = "subject 1 token"
self.S2 = "subject 2 token"
self.IO = "indirect object token"
self.END = "end of sentence"
# 因果结构
# S1 → Vocab Prediction
# S2 → Attention to S1
# IO → Output
def predict_causal_effect(self, intervention):
"""预测干预的因果效应"""
if intervention.type == "remove_S1":
# 移除S1应该破坏对IO的预测
return {"IO_prob": -0.8}
return {}已发现的电路:
- 名称移动头(Name Mover Heads):移动S1信息到输出位置
- 备份头(Backup Heads):在主要头失效时接管
- 抑制头(Inhibition Heads):抑制错误路径
6. 形式化验证算法
6.1 干预对应
算法:给定实现映射 ,验证干预对应:
def verify_intervention_correspondence(model, causal_model, pi):
"""
验证干预对应:高层干预与低层干预效果一致
"""
results = []
for intervention in causal_model.interventions:
# 高层因果预测
high_level_effect = causal_model.predict(intervention)
# 构建低层对应干预
low_level_intervention = build_low_level_intervention(
intervention, pi, model
)
# 运行实验
with model.set_intervention(low_level_intervention):
low_level_output = model.forward(test_inputs)
# 比较效果
effect_match = compare_effects(high_level_effect, low_level_output)
results.append(effect_match)
return all(results)
def build_low_level_intervention(intervention, pi, model):
"""
将高层干预转换为低层实现
"""
if intervention.type == "hard":
# 硬干预:直接修改对应激活
target_activations = pi(intervention.variable)
return {
"target": target_activations,
"value": intervention.value,
"mode": "replace"
}
elif intervention.type == "soft":
# 软干预:修改激活的分布
target_activations = pi(intervention.variable)
return {
"target": target_activations,
"distribution": intervention.distribution,
"mode": "resample"
}6.2 抽象等价类
定理:实现相同因果抽象的网络形成等价类:
这允许:
- 跨模型比较:不同架构实现同一算法
- 跨初始化比较:不同训练结果实现相同因果结构
7. 与其他理论框架的联系
7.1 与贝叶斯网络解释的联系
Transformer的贝叶斯网络解释(见transformers-bayesian-networks-belief-propagation)为因果抽象提供低层实现基础:
- 信念传播 = 计算后验概率
- 消息传递 = 因果效应的量化
7.2 与因果表示学习的联系
因果表示学习(见causal-representation-learning)关注学习因果变量,而因果抽象关注验证因果结构。
两者结合:
- 表示学习:从数据中发现因果变量
- 因果抽象:验证学习到的表示是否实现因果结构
7.3 与电路发现的联系
电路发现是因果抽象的实践方法:
| 因果抽象 | 电路发现 |
|---|---|
| 理论框架 | 实现方法 |
| 形式化验证 | 实验验证 |
| 抽象等价类 | 具体电路 |
8. 开放问题与未来方向
8.1 可扩展性
当前局限:
- 仅验证小规模电路
- 难以处理大规模Transformer
研究方向:
- 模块化抽象验证
- 层次化抽象组合
8.2 自动化抽象发现
挑战:如何自动发现高层因果模型,而非手动指定?
初步探索:
- 基于因果发现的神经符号方法
- 基于对比干预的变量识别
8.3 与LLM的关系
大型语言模型是否实现可解释的因果算法?
- 部分证据支持(IOI、induction heads等)
- 但仍缺乏全面验证