解耦表示与因果变量 (Disentangled Representations and Causal Variables)
一句话定位
解耦表示关注统计独立性,而因果变量强调干预不变性和因果机制,两者的结合是通往可解释、可操控表示的关键。
前置知识
- 解耦表示学习:β-VAE、InfoGAN、独立分量分析
- 因果表示学习:SCM、do操作、可辨识性
- 变分推断:ELBO、KL散度
- 信息论:互信息、条件熵
核心直觉
考虑一个数据集,其中图像由几个独立因素生成:物体颜色、形状、大小、位置等。
统计解耦(如β-VAE)的目标是:学到的表示
因果解耦的目标是:学到的表示中,每个
关键洞察:统计独立不等于因果独立。
举例:考虑两个变量
反过来,统计上独立的变量(如
问题形式化
解耦表示
定义(统计解耦):表示
这意味着
β-VAE 目标:
当
因果表示
定义(因果解耦):表示
- 存在因果结构
描述 之间的关系 - 每个因果机制
是独立的 - 干预某个
不影响其他 ( )
因果分解:
注意:这与统计解耦不同,因为
独立可控因素
定义(独立可控因素):如果表示
形式上,对于任意干预
这意味着干预
数学框架
ACL (Autonomous Causal Learning) 目标
ACL 的目标是学习可自主控制的因果机制:
其中:
是在干预 的条件下, 和观测 之间的互信息 是 和 之间的互信息(鼓励独立性)
因果与统计独立的区别
考虑一个简单例子:
统计上:
因果上:如果真实因果关系是
信息论视角
统计独立性:
因果独立性:
关键区别:因果独立性涉及干预下的条件互信息,而统计独立性涉及边缘互信息。
解耦 vs 因果变量
| 属性 | 统计解耦 | 因果变量 |
|---|---|---|
| 目标 | $p(z) = \prod_i p(z_i | |
| 独立性 | 边缘独立 | 条件独立(干预下) |
| 可控性 | 不保证 | 保证 |
| 可辨识性 | 需要假设 | 需要更强的假设 |
| 解释性 | 统计上 | 因果上 |
训练与估计
统计解耦训练
使用 β-VAE 或类似方法:
def beta_vae_loss(x, x_recon, q_z_x, p_z, beta=1.0):
recon = F.mse_loss(x_recon, x)
kl = kl_divergence(q_z_x, p_z)
return recon + beta * kl因果解耦训练
使用 ACL 目标:
def acl_loss(model, x, i):
"""
计算第i个因子的ACL损失
"""
# 编码
z = model.encoder(x)
# 干预第i个因子
z_cf = intervene(z, i, random_sample())
# 重构
x_cf = model.decoder(z_cf)
# 编码反事实
z_cf_recon = model.encoder(x_cf)
# ACL损失:干预的因子应该改变,其他应该保持
loss = 0
for j in range(dim_z):
if j == i:
loss += (z_cf_recon[j] - z_cf[j])**2 # 干预的因子应该匹配
else:
loss += (z_cf_recon[j] - z[j])**2 # 其他因子应该保持
return loss结合统计和因果解耦
综合目标:
其中:
是重构损失 鼓励统计独立(如 β-VAE) 鼓励因果独立(如 ACL)
推理与干预
统计独立推理
给定观测
每个
干预不变性
定义(干预不变性):表示
这意味着干预某个维度不影响其他维度。
因果推理
因果推理需要:
- 确定因果结构
- 根据
计算干预效果 - 干预时保持因果机制不变
优点与局限
优点
- 解释性:因果变量提供了更强的解释性
- 可控性:因果变量可以独立操控
- 泛化性:因果结构通常在分布转移下更稳定
- 组合性:因果变量更容易组合
局限
- 可辨识性:无监督解耦在理论上不可辨识
- 因果结构学习:学习因果结构是困难的
- 假设依赖:需要额外的归纳偏置
- 计算成本:联合学习表示和因果结构成本高
与其他笔记的联系
- 因果生成模型:因果变量可以用于生成模型
- 可控反事实生成:独立可控因素使反事实生成更容易
- 可辨识性问题:统计解耦和因果解耦的可辨识性条件不同
- Multi-View CRL:多视图可以辅助解耦
可重现性笔记
评估指标
解耦指标(DCI):
- 缺失性:每个因素是否只由少数观察决定
- 清晰性:每个观察是否由少数因素决定
MIG(Mutual Information Gap):
其中
代码框架
class DisentangledCausalRepresentation(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 forward(self, x):
z = self.encoder(x)
x_recon = self.decoder(z)
return z, x_recon
def statistical_loss(self, z):
"""鼓励统计独立"""
# 计算协方差矩阵
cov = torch.cov(z.T)
# 惩罚非对角元素
return torch.sum(cov ** 2) - torch.sum(torch.diag(cov) ** 2)
def causal_loss(self, x, i):
"""ACL损失"""
z = self.encoder(x)
z_cf = intervene(z, i, random_intervention())
x_cf = self.decoder(z_cf)
z_cf_recon = self.encoder(x_cf)
# ... 计算ACL损失章节总结
- 解耦和因果表示既有联系又有区别
- 统计独立(β-VAE)和因果独立不同
- 独立可控因素是更强的监督信号
- 因果分解
编码因果依赖 - ACL 目标强制每个因素可以独立控制
- 解耦可能不涉及因果结构,因果结构不一定解耦
- 干预不变性是因果表示的核心特征
- 无监督解耦在理论上不可辨识,需要归纳偏置
- 未来方向:结合统计解耦和因果结构的优点
关键词
disentangled representations, causal variables, independently controllable factors, causal factorization, ACL, intervention invariance, statistical independence, causal independence, beta-VAE, autonomous causal learning