可控反事实生成 (Controllable Counterfactual Generation)
一句话定位
可控反事实生成通过在因果表示空间中干预特定变量并保持其他变量不变,生成符合因果语义的反事实观测,是因果表示学习的重要应用方向。
前置知识
- 因果生成模型:编码器、解码器、SCM
- do 操作:因果干预、条件分布变换
- 反事实推理:反事实定义、一致性要求
- 变分推断:ELBO、重建损失
核心直觉
考虑一个图像生成场景:我们有一张图片,编码后得到因果表示
这就是反事实生成的核心问题:
- 干预:改变
(颜色)为一个新值 - 保持:其他因果变量
不变 - 生成:使用解码器生成新的图像
关键挑战是反事实一致性。一个合理的反事实图像应该:
- 看起来自然,像是在真实机制下生成的
- 与干预一致(颜色确实变了)
- 与未干预的变量一致(形状、大小等保持不变)
这要求我们的因果表示和生成模型正确地建模了因果机制。
问题形式化
基本设置
给定因果表示学习模型:
- 编码器:
- 解码器:
- 因果结构:
(描述 之间的因果关系)
反事实生成过程
对于观测
- 编码:
- 干预:
- 生成:
反事实轨迹
定义(反事实轨迹):从原始观测到反事实观测的因果传播路径。
给定干预
其中只有被干预变量直接相关的变量会发生变化,其他变量保持不变(假设没有其他因果路径连接)。
数学框架
反事实一致性条件
定义(反事实一致性):一个反事实生成过程是一致的,如果:
- 干预后的因果变量
遵循因果机制 - 干预后的观测
由解码器正确生成 - 反事实分布与干预后的 SCM 一致
形式上:
counterfactual consistency loss
为了确保反事实一致性,我们可以定义一致性损失:
这强制反事实生成的后验与干预后的因果分布一致。
干预下的条件分布
干预后,因果变量的联合分布变为:
即只保留因果机制中涉及
反事实损失的推导
给定原始观测
反事实生成损失:
其中
训练与估计
训练数据
可控反事实生成需要:
- 观测数据
:未干预的观测 - 干预数据
:干预后的观测对(可选)
在实际中,干预数据通常难以获取,因此需要使用合成数据或无监督方法。
无监督训练方法
由于配对干预数据难以获取,我们可以使用:
- 重构一致性:确保
其中 - 因果一致性:确保干预只影响相关变量
- 对比正则化:对比干预前后的表示
class CounterfactualGenerator(nn.Module):
def __init__(self, dim_x, dim_z, causal_graph):
self.encoder = Encoder(dim_x, dim_z)
self.decoder = Decoder(dim_z, dim_x)
self.causal_graph = causal_graph
def counterfactual(self, x, intervention):
"""
生成反事实观测
intervention: dict, {idx: value}
"""
# 编码
z = self.encoder(x)
# 应用干预
z_cf = z.clone()
for idx, val in intervention.items():
z_cf[idx] = val
# 生成反事实
x_cf = self.decoder(z_cf)
return x_cf
def consistency_loss(self, x, x_cf, intervention):
"""
计算反事实一致性损失
"""
z = self.encoder(x)
z_cf = self.encoder(x_cf)
# 确保干预维度不同,其他维度相同
loss = 0
for idx, val in intervention.items():
loss += (z[idx] - val)**2 # 强制接近干预值
# 其他维度应该接近
for i in range(len(z)):
if i not in intervention:
loss += (z[i] - z_cf[i])**2
return loss
def train_step(self, x, intervention):
x_cf = self.counterfactual(x, intervention)
# 重构损失
recon_loss = F.mse_loss(x_cf, x)
# 一致性损失
consistency_loss = self.consistency_loss(x, x_cf, intervention)
return recon_loss + consistency_loss评估指标
- 反事实质量:生成的图像是否逼真
- 干预精度:干预的变量是否确实改变
- 一致性:未干预的变量是否保持不变
- 因果效应:反事实图像是否反映了预期的因果效应
推理与干预
单一干预
最简单的情况:干预单个因果变量
多重干预
更复杂的情况:同时干预多个变量:
因果传播
干预
在反事实生成中,我们需要模拟这种传播。
反事实插值
除了离散干预,我们还可以进行连续干预(插值):
这允许我们探索连续的因果效应空间。
优点与局限
优点
- 可解释性:反事实生成提供了因果关系的直观理解
- 可控性:用户可以指定要改变的变量
- 数据增强:可以生成反事实数据来增强训练集
- 决策支持:可以帮助理解干预的效果
- 组合性:多个干预可以组合
局限
- 可辨识性挑战:如果因果结构不唯一,反事实可能不可靠
- 生成质量:生成的图像可能不够逼真
- 因果结构假设:需要假设的因果结构是正确的
- 计算成本:反事实生成需要多次编码/解码
与其他笔记的联系
- 因果生成模型:反事实生成基于因果生成模型
- 解耦表示与因果变量:解耦使得可控反事实更容易
- 因果表示学习基础:反事实生成是 CRL 的应用
- CRL与动力系统结合:时序反事实生成
可重现性笔记
生成流程
# 反事实生成完整流程
def generate_counterfactual(model, x, intervention):
# 1. 编码原始观测
z = model.encoder(x)
# 2. 应用干预到因果表示
z_cf = apply_intervention(z, intervention)
# 3. 解码生成反事实
x_cf = model.decoder(z_cf)
# 4. 可选:验证一致性
z_verify = model.encoder(x_cf)
return x_cf, z_verify
def apply_intervention(z, intervention):
z_cf = z.clone()
for idx, value in intervention.items():
z_cf[0, idx] = value
return z_cf数据集
- CF-ImageNet:反事实图像数据集
- Clevr-NK:组合问答中的反事实图像
- Synthetic:合成因果数据集
章节总结
- 反事实生成在 CRL 中需要干预因果变量
并保持其他因素不变 - 重建一致性:反事实观测应与在真实机制下观察到的一致
- 可控反事实生成需要清晰的因果语义
- Counterfactual trajectory 描述干预后的因果传播路径
- 解码器重建质量影响反事实生成的质量
- 反事实一致性是评估反事实生成的关键指标
- 与标准生成模型的区别:反事实生成关注干预效果而非普通生成
- 实现方式:通过 SCM 定义因果机制,通过解码器生成观测
- 挑战:确保反事实的合理性和一致性
- 应用:可解释AI、数据增强、决策支持
关键词
counterfactual generation, controllable generation, causal representation learning, intervention, counterfactual consistency, counterfactual trajectory, causal intervention, reconstruction consistency, counterfactual reasoning