Sparsity Principle for Partial Observability
一句话定位
稀疏性原则是处理部分可观测下因果表示学习的关键归纳偏置,通过假设最小数量的隐变量和稀疏的连接来增强因果结构的可辨识性。
前置知识
- 部分可观测 CRL:隐变量、混杂因子
- 可辨识性理论:不可辨识性的来源
- 稀疏模型:Lasso、正则化、稀疏回归
- 因果结构:因果图、因果机制
核心直觉
在部分可观测的因果系统中,隐变量的存在使得识别因果结构变得困难。稀疏性原则提供了一种实用的解决思路:我们应该假设隐变量及其影响是稀疏的。
为什么稀疏性有帮助?考虑一个极端例子:
- 如果每个隐变量影响很多因果变量和观测变量,那么这些影响会高度混淆,使得识别任何真实的因果关系几乎不可能
- 如果隐变量只影响少数变量,那么每个隐变量的效应更容易被隔离和分析
类比:在标准机器学习中,稀疏性假设(如Lasso)帮助防止过拟合,使模型更容易解释。在因果学习中,稀疏性帮助减少隐变量带来的歧义,使因果结构更容易辨识。
关键洞察:因果学习中的稀疏性不是关于参数的稀疏性(如回归系数),而是关于因果结构的稀疏性(哪些变量之间存在直接因果关系)。
问题形式化
稀疏性定义
定义(结构稀疏):在因果图中,如果每个变量(无论是观测的还是隐式的)只与少数其他变量有直接因果关系,则因果结构是稀疏的。
对于隐变量
- 稀疏隐变量:每个
只影响少数 和 - 稀疏因果机制:每个因果机制
只依赖少数父节点
稀疏 SCM
稀疏 SCM 具有以下形式:
其中
稀疏性 vs 普通稀疏性
普通稀疏性(回归/特征选择):
- 目标:选择少数相关特征来预测输出
- 方法:L1 正则化、组稀疏等
- 本质:统计相关性问题
因果稀疏性(因果结构):
- 目标:确定少数变量之间存在直接因果关系
- 方法:因果发现算法、稀疏 SCM
- 本质:因果机制问题
关键区别:普通稀疏性选择与输出统计相关的特征,但这些特征之间可能有或没有因果关系。因果稀疏性确定直接因果机制,控制其他变量后,父节点的变化会导致子节点的变化。
数学框架
稀疏性假设的形式化
假设(稀疏隐变量):隐变量
假设(稀疏因果机制):每个因果机制
稀疏性下的可辨识性
定理(稀疏性增强可辨识性):在部分可观测设置下,如果满足以下条件,则因果结构是可辨识的:
- 稀疏性条件:每个隐变量
只影响少数变量 - 最小性条件:不存在多余的隐变量或连接
- 观测充分性:观测变量之间有足够的条件独立性测试
证明思路:考虑两个可能的稀疏 SCM 产生相同的观测分布
稀疏性正则化
目标函数包含稀疏性正则化:
其中:
惩罚复杂的因果结构 惩罚隐变量的数量和连接
与 Lasso 的比较
Lasso 正则化:
目标是使权重向量
因果稀疏正则化:
目标是使因果图
训练与估计
稀疏性约束下的学习
学习算法需要同时优化:
- 因果表示
- 因果结构
(稀疏) - 隐变量模型
(稀疏)
常用方法:
- 贪心搜索:从空图开始,逐步添加使损失下降最多的边
- 松弛优化:使用连续松弛使优化可微
- 变分推断:使用变分分布近似隐变量和结构
算法框架
class SparseCRL(nn.Module):
def __init__(self, dim_x, dim_z, max_confounders=3, sparsity_reg=0.1):
self.encoder = Encoder(dim_x, dim_z)
self.decoder = Decoder(dim_z, dim_x)
self.max_confounders = max_confounders
self.sparsity_reg = sparsity_reg
def forward(self, x):
z = self.encoder(x)
x_recon = self.decoder(z)
return z, x_recon
def sparsity_loss(self, adjacency_matrix):
"""
计算稀疏性损失:边的数量
"""
return torch.sum(torch.abs(adjacency_matrix))
def learn(self, data):
z, x_recon = self.forward(data)
# 重构损失
recon_loss = F.mse_loss(x_recon, data)
# 稀疏性损失
adj = self.get_causal_adjacency()
sparse_loss = self.sparsity_loss(adj)
# 总损失
total_loss = recon_loss + self.sparsity_reg * sparse_loss
total_loss.backward()
return total_loss.item()隐变量数量选择
使用 BIC 或 MDL 准则选择隐变量数量:
其中
推理与干预
稀疏性下的推理
稀疏性假设简化了推理:
- 后验推断:由于每个变量只依赖少数父节点,后验分布更容易计算
- 干预效果:干预一个变量只影响少数其他变量
- 反事实推理:反事实计算只在局部进行,不涉及整个系统
干预分析
在稀疏 SCM 中,do 操作的效果更容易预测:
由于
反事实一致性
稀疏性有助于保持反事实一致性:
- 稀疏性减少了隐变量的数量,使得推断更可靠
- 每个变量的因果机制更简单,更容易验证
优点与局限
优点
- 增强可辨识性:稀疏性假设大大减少了可能的配置数量
- 减少过拟合:稀疏模型在未见数据上通常更好
- 解释性:稀疏因果结构更容易理解和验证
- 计算效率:稀疏模型通常计算更快
局限
- 假设强度:稀疏性假设可能过于强,在某些问题中不成立
- 局部最优:稀疏性约束可能使优化陷入局部最优
- 阈值选择:稀疏性阈度的选择依赖于问题
- 欠拟合风险:过度稀疏可能导致欠拟合
与其他笔记的联系
- 部分可观测 CRL:稀疏性是处理部分可观测的关键工具
- 可辨识性问题:稀疏性增强可辨识性
- 因果生成模型:稀疏性可以在生成模型中强制执行
- 可控反事实生成:稀疏性使反事实生成更可靠
可重现性笔记
合成数据生成
def generate_sparse_scm(n_samples, n_z, n_u, n_x, sparsity_level):
"""
生成稀疏 SCM 的合成数据
"""
# 随机生成稀疏因果结构
adj_z = generate_sparse_adjacency(n_z, sparsity_level)
adj_u_z = generate_sparse_adjacency((n_u, n_z), sparsity_level)
adj_z_x = generate_sparse_adjacency((n_z, n_x), sparsity_level)
# 生成 SCM 参数
scm = SCM(adj_z, adj_u_z, adj_z_x)
# 生成数据
u = np.random.randn(n_samples, n_u)
z = scm.generate_z(u)
x = scm.generate_x(z, u)
return x, z, u, scm评估指标
- SHD(结构汉明距离):估计因果图与真实因果图的边差异数量
- MSE:重构误差
- BIC/MDL:模型选择准则
章节总结
- 稀疏性作为归纳偏置帮助在部分可观测下识别因果结构
- 最小隐变量数量假设减少不可辨识性
- 稀疏性不同于回归中的普通稀疏性(是结构稀疏,不是参数稀疏)
- 稀疏 SCM 强制隐变量到观测的连接是稀疏的
- 稀疏性使因果机制更易辨识,因为干扰更少
- 稀疏性原则在机器学习中广泛使用,但在因果学习中需要新理解
- 与 Lasso 回归的稀疏性区别:因果结构 vs 特征选择
- 稀疏性可以帮助识别因果方向
- 实践中需要平衡稀疏性和模型拟合度
- 稀疏性假设的强度需要根据问题调整
关键词
sparsity principle, partial observability, causal representation learning, minimal latent confounders, sparse SCM, structural sparsity, inductive bias, causal discovery, lasso comparison, identifiability