因果生成模型 (Causal Generative Models)

一句话定位

因果生成模型结合结构因果模型(SCM)对因果变量进行因果建模,与生成解码器(decoder)将因果变量映射到观测空间,是因果表示学习的主流方法之一。

前置知识

  • 因果表示学习基础:编码器、表示空间
  • SCM:结构因果模型、因果机制、do算子
  • 变分推断:ELBO、KL散度、重新参数化
  • 生成模型:VAE、GAN、 normalizing flows

核心直觉

因果生成模型的核心思想是:数据的生成过程包含两个层次:

  1. 因果层次:底层因果变量 按照因果结构(SCM)生成
  2. 观测层次:因果变量 通过解码器生成观测数据

这种分离有什么好处?假设我们有一个图像数据集,其中图像由少数几个因素决定(如物体位置、旋转角度、光照)。如果我们能学到这些因素的因果表示,那么:

  • 我们可以通过干预(do)某个因素来生成反事实图像
  • 我们可以理解每个因素对最终图像的贡献
  • 我们可以推广到新的条件组合

传统的生成模型(如VAE)只关心如何从低维表示重建图像,但不关心这些表示之间的因果关系。因果生成模型明确地建模了因果变量之间的关系。

问题形式化

模型结构

因果生成模型包含三个组件:

  1. 先验网络 :定义因果变量的先验分布,强制因果结构
  2. SCM/因果机制 :描述因果变量之间的生成关系
  3. 解码器/观测模型 :将因果变量映射到观测空间

生成过程

数据生成过程:

其中 在因果图中的父节点。

与标准生成模型的区别

标准 VAE

  • 先验 通常是简单的分布(如单位高斯)
  • 潜在变量 之间的统计独立性不编码因果关系
  • 重建是唯一目标

因果生成模型

  • 先验 由因果结构决定
  • 潜在变量 之间的依赖关系编码因果关系
  • 重建 + 因果结构约束

数学框架

ELBO 推导

给定观测数据 ,对数边际似然:

使用变分推断,引入近似后验

其中 ELBO:

因果先验的分解

由于 由因果结构决定,我们可以分解为:

这与标准 VAE 中的 不同。

因果结构约束

我们希望学到的表示满足因果结构:

其中第二个惩罚项强制后验分布与因果先验一致。

识别条件

因果生成模型的可辨识性来自以下条件:

  1. 解码器可逆性 足够灵活,可以区分不同的
  2. 因果结构约束 由稀疏因果结构决定
  3. 干预数据(可选):干预数据可以帮助识别因果方向

定理:在满足一定条件下,因果生成模型可以识别出真实的因果结构和因果变量。

训练与估计

变分 CRL 训练

训练循环:

for x in data:
    # 编码
    q_z_x = encoder(x)
 
    # 采样
    z = reparameterize(q_z_x)
 
    # 重构
    x_recon = decoder(z)
 
    # 计算损失
    recon_loss = -log_prob(x_recon, x)
    kl_loss = kl_divergence(q_z_x, causal_prior(z))
 
    loss = recon_loss + beta * kl_loss
    loss.backward()

因果结构学习

除了学习表示,我们还需要学习因果结构

其中 可以是 BIC、MDL 等准则。

对抗训练

一些方法使用对抗训练来增强可辨识性:

其中生成器 包含 SCM 和解码器。

VAE-based CRL 实现

class CausalGenerativeModel(nn.Module):
    def __init__(self, dim_x, dim_z, causal_graph):
        self.encoder = nn.Sequential(
            nn.Linear(dim_x, 256),
            nn.ReLU(),
            nn.Linear(256, dim_z * 2)  # 均值和对数方差
        )
        self.decoder = nn.Sequential(
            nn.Linear(dim_z, 256),
            nn.ReLU(),
            nn.Linear(256, dim_x)
        )
        self.causal_graph = causal_graph  # 邻接矩阵
 
    def prior(self, z):
        """
        构建因果先验:p(z) = prod_i p(z_i|Pa_i)
        """
        # 实现因果先验分解
        return prior_probs
 
    def forward(self, x):
        # 编码
        h = self.encoder(x)
        mu, log_var = h.chunk(2, dim=-1)
        sigma = log_var.exp()
 
        # 重参数化
        z = mu + sigma * torch.randn_like(mu)
 
        # 解码
        x_recon = self.decoder(z)
 
        return z, x_recon
 
    def elbo_loss(self, x, beta=1.0):
        z, x_recon = self.forward(x)
 
        # 重建损失
        recon_loss = F.mse_loss(x_recon, x)
 
        # KL 损失(使用因果先验)
        q_z_x = torch.distributions.Normal(
            self.encoder(x)[:, :dim_z],
            self.encoder(x)[:, dim_z:].exp()
        )
        p_z = self.prior(z)
 
        kl_loss = torch.sum(q_z_x.log_prob(z) - p_z.log_prob(z), dim=-1).mean()
 
        return recon_loss + beta * kl_loss

推理与干预

编码与解码

给定观测 ,推断因果表示

给定因果表示 ,生成观测

do 操作

在因果生成模型中,do 操作作用在因果变量上:

干预后的采样:

反事实生成

反事实生成的步骤:

  1. 给定原始观测 和干预
  2. 推断原始因果表示:
  3. 应用干预:
  4. 生成反事实观测:

因果效应计算

给定干预 ,因果效应:

其中:

优点与局限

优点

  1. 可解释性:因果结构明确,建模了变量之间的因果关系
  2. 干预能力:支持 do 操作,可以预测干预效果
  3. 反事实推理:可以生成反事实观测
  4. 组合性:因果变量可以组合生成新样本
  5. 可辨识性:因果结构约束增强了可辨识性

局限

  1. 模型复杂度:需要同时建模因果结构和生成模型
  2. 可辨识性挑战:在没有足够约束的情况下,因果结构可能不可辨识
  3. 训练难度:需要平衡重建质量和因果结构约束
  4. 假设依赖:可辨识性依赖于对因果结构的假设(如稀疏性)

与其他笔记的联系

  • 因果表示学习基础:因果生成模型是 CRL 的一种主要方法
  • 可辨识性问题:因果生成模型的可辨识性来自因果结构约束
  • 可控反事实生成:因果生成模型可以用于反事实生成
  • 解耦表示与因果变量:因果生成模型可以促进解耦

可重现性笔记

常用数据集

  • Shapes3D:包含6个独立因素的3D图像
  • MPI3D:机器人操作数据集,多种独立因素
  • Sprites:精灵图像数据集,可控因素
  • CIFAR-CO:带标注的因果图像数据集

评估指标

  • 离散因素度量(DCI):评估解耦程度
  • MIG(Mutual Information Gap):评估因素的可识别性
  • 重建误差:评估生成质量
  • 干预效果:评估 do 操作的效果

章节总结

  • 因果生成模型结合 SCM 和生成解码器
  • SCM 描述因果变量 之间的因果机制
  • 解码器将因果变量映射到观测空间
  • 变分 CRL 使用 ELBO 进行训练
  • 因果生成模型的可辨识性来自结构约束
  • ELBO 分解为重建损失和 KL 散度
  • 因果先验 强制因果结构分解
  • 生成模型和因果结构的联合学习是挑战
  • VAE-based CRL 是因果生成模型的典型实现
  • 应用:图像生成、数据增强、反事实推理、可解释AI

关键词

causal generative models, SCM, variational CRL, VAE, generative decoder, ELBO, causal prior, causal structure, intervention, counterfactual generation, identifiability