想象你是城市水务局的侦探,地下埋着纵横交错的污水管道,而你唯一能拿到的是每个城区每天的流量读数。暴雨天你会发现:东区的流量涨了,过几个小时南区的流量也跟着涨——你能从这些蛛丝马迹推断出地下管道的走向吗?更头疼的是,管网有个物理铁律:水只能从上游排向下游,绝不能形成环形,否则污水会在环里永远打转。这个“反推管网走向”的任务,就是因果发现;这张没有环的管网图,就是有向无环图(DAG)。DAG-GNN 是一套基于深度学习的因果发现方法:它把每个变量当成一个城区、把因果关系当成管道,用图神经网络模拟污水沿管道传播,用变分自编码器在虚拟沙盘上反复推演,最后用一条“无环物理法则”逼着推断出的管网必须是有向无环图。本文将带你从零理解这套方法如何从观测数据中反推因果结构,以及它和前辈方法 NOTEARS 的恩怨情仇。
对 AI 从业者而言,因果发现是从“相关”走向“因果”的关键一跃。DAG-GNN 展示了深度学习如何突破传统结构学习在规模与复杂度上的瓶颈,是因果推断研究者必须掌握的现代工具箱之一。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
因果发现与DAG
假设你是城市水务局的侦探,地下埋着纵横交错的污水管道,而你唯一能拿到的是每个城区每天的流量读数。暴雨天你会发现:东区的流量涨了,过几个小时南区的流量也跟着涨——你能从这些蛛丝马迹推断出地下管道的走向吗?更让人头疼的是,管道有个物理铁律:水流只能从上游排向下游,管网绝不能出现环形,否则污水会在环里永远打转。这个任务,就是因果发现;这张没有环的管网图,就是有向无环图(DAG)。
在因果推断的世界里,“城区”被称为变量(节点),“管道”被称为因果边。“东区流量影响南区流量”就是一种因果方向。给定一堆观测数据 X——比如几百个时刻的流量读数——我们要画出一张 DAG,指出每个变量的直接原因是谁。注意“直接”二字:间接影响通过路径传递,我们最终要得到的是最简洁的直接因果结构,也就是所谓结构学习(Structure Learning)。
用数学语言说,假设有 n 个变量,A 是一个 n×n 的邻接矩阵:A_{ij} 不为 0 就表示第 i 个变量到第 j 个变量存在直接因果边,数值表示因果强度。我们看到的是 m 行 n 列的观测矩阵 X,任务是解出 A,同时保证 A 对应的图没有环。传统方法如 PC 算法用条件独立性检验逐对判断,在变量成百上千、关系非线性的场景下,既慢又脆;DAG-GNN 则想用深度学习的整体建模来应对这个挑战。
所以 DAG-GNN 的本质,是一位会用大数据建模的侦探:不一家一户敲门排查,而是把整个城市管网放进一个可学习的数字模型里,让数据自己开口说话。
深度生成模型框架
面对迷宫般的管网,聪明的工程师选择先做一件事:在计算机里造一个“虚拟城市沙盘”。先假设一份候选管道图纸,模拟出每个城区的流量,然后和真实读数对比。图纸对了,仿真自然贴合;图纸错了,仿真会差得离谱。反复修改图纸、反复仿真,最后留下的就是最像真相的那张管网图。
这个沙盘在机器学习里叫生成模型。DAG-GNN 假设观测数据 X 并不是凭空出现的,而是由一组更底层的潜变量 Z(可以理解为各区域源头的“自然扰动”)经过管网系统传播后生成的。给定因果结构 A,从 Z 到 X 的生成过程写成下面的公式。这里的 f 是一个神经网络(MLP),负责把线性传播后的结果扭曲成非线性的现实。
工程师的沙盘越逼真,他对地下管网的判断就越有底气。生成模型的重建能力,就是沙盘对现实的仿真精度。
- Z(潜变量矩阵)形状为“样本数 × 节点数”的矩阵,每一列代表对应节点的未观测基础扰动,通常是独立高斯噪声,就像每个城区源头天然存在的随机波动。
- A(邻接矩阵)图结构参数,A_{ij} 表示节点 i 对节点 j 的因果强度,也就是管线图纸上每一段管道的“流通能力”。
- (I-A)^{-1}(Leontief 逆矩阵)把潜变量沿因果路径传播并累积,等价于无穷级数求和,表示从源头出发的所有多跳因果影响。
- f(·)(非线性映射)由多层感知机实现,把线性传播后的结果映射到观测空间,模拟现实世界中的非线性响应。
- X(观测矩阵)最终生成的可观测数据,也就是侦探手里拿到的城区流量读数。
DAG结构约束
管网设计有条物理铁律:不能有环。但麻烦的是,我们要用梯度下降去优化一个连续数值矩阵 A,而“有没有环”是一个离散的组合性质——你没法直接对“有环”求导。就像工程师没法把“别打转”写成一条可微的施工指令。
NOTEARS 论文给了一个漂亮的回答:把“无环”翻译成一个连续函数 h(A)。这个函数有神奇性质:当且仅当 A 是无环图时 h(A)=0,有环时 h(A)>0,而且 h 对 A 连续可微。于是“无环”从离散的组合约束,变成了可以放进损失函数里一起做梯度下降的光滑惩罚项。
有了 h(A),工程师就仿佛在沙盘里装了一个“环流报警器”:一旦图纸出现循环管,报警器立刻响,梯度下降沿着报警方向把 A 拉回安全区。离散的铁律,就这样被驯化成了平滑的软约束。
- A⊙A(逐元素平方)把可能有正有负的边权重变成非负的“双向容量”,避免正负抵消导致环检测失效,相当于把每根管道都标记为可通行的路径段。
- I + α(A⊙A)(单位增强)对角线上加 1,相当于给每个节点加一条“原地自环”路径,保证后续统计有一个稳定的基准。
- n 次矩阵幂([·]^n)矩阵幂的 (i,j) 元素等于从 i 出发沿图走 n 步到达 j 的路径条数(加权),步数 n 与节点数相同,确保任何环都能被“走到”。
- tr(取迹)累加所有“从某节点出发、走 n 步回到自身”的闭合路径加权和,这些闭合路径正是环存在的证据。
- 减 n如果没有环,闭合路径只来自 n 条自环(来自单位阵),迹恰好等于 n,于是 h(A)=0。
GNN消息传递机制
管网的奇妙之处在于远程影响:上游源头排出的污染物,会沿着管道一级一级传下去,让几十公里外的下游城区也出现异常。描述这种效应,我们需要的不是把数据简单相加,而是让每个区域的信息沿着因果路径一层层“漂移”下去。
图神经网络(GNN)天生就是干这个的。DAG-GNN 用矩阵 M=(I-A)^{-1} 作为传播矩阵(称为 Leontief 逆矩阵),每个节点的特征乘上 M 后,就相当于把所有经过任意长度路径到达它的上游信息都累积起来。每一层图卷积网络的操作可以写成下面的形式。
就像在每根管道里放一枚彩色标记球,球顺着水流漂过所有下游城区;最终每个城区的水样里,都带上了整个上游流域的“混合标记”——这正是 GNN 消息传递的物理直觉。
- H^{(l)}(第 l 层节点特征矩阵)一行对应一个节点,记录该节点在当前“信息融合阶段”携带的特征,初始层就是观测 X。
- M(传播矩阵)把每个节点的特征按因果结构扩散到所有下游节点,多跳影响被一次性叠加,就像把污染标记球同时抛向所有下游管道。
- W^{(l)}(可学习权重矩阵)对融合后的特征做线性变换,相当于给每个“信息流”配一个滤波器,决定哪些信号该保留、哪些该衰减。
- σ(非线性激活函数)比如 ReLU,让多层堆叠能够拟合复杂非线性关系,避免整个网络退化成线性变换。
- H^{(l+1)}(更新后的节点特征)每个节点聚合完邻居与多跳信息后得到的新表示,可以再送入下一层继续传播。
变分推断与ELBO
工程师虽然看不见污染源 Z,但他不会傻傻地猜一个确定值。他更聪明:“污染源八成在东区泵站附近,两成在北区,位置还可以微调。”用概率的语言说,他不求一个唯一答案,而是用一个分布去刻画 Z 的可能范围。
贝叶斯告诉我们,真正该用的后验 p(Z|X,A) 通常算不出来——分母的积分爆炸。变分推断的思路是:找一个结构简单、算得动的分布 q_φ(Z|X,A)(例如高斯分布)去近似它。φ 是编码器网络的参数,负责从观测数据 X 和结构 A 中输出这个高斯的均值与方差。我们需要一个目标函数来引导这个近似,这就是证据下界(ELBO)。
工程师不再吹胡子瞪眼地说“污染源一定在 X 地”,而是给出一个带置信区间的判断。这份“概率式的谦虚”,让他能在信息不足时依然稳健地推进管网推断。实践中还有一个关键技巧——重参数化:把采样写成 Z=μ+σ⊙ε,ε 是标准正态噪声,这样“采样”这个随机动作变成了可微的确定性变换,梯度就能顺利回传到编码器。
- q_φ(Z|X,A)(近似后验)编码器输出的高斯分布,给定观测数据和结构,给出潜变量 Z 的可能范围,对应工程师“八成在东区、两成在北区”的判断。
- 期望重建项(第一项)从 q 中采样 Z,再用解码器重建 X,计算对数似然。值越大说明潜变量越能解释观测。
- KL 散度(第二项)衡量近似后验与标准高斯先验的差距,防止编码器把 Z 推得太离谱,保持潜空间规整。
- 最大化 ELBO等价于“重建得更像 + 潜变量分布更规整”,这是整个变分自编码器训练的总目标。
损失与训练
一套方案是否靠谱,要由三张考核表打分:第一,沙盘仿真的流量要和真实读数对得上(重建要准);第二,推断出的污染源分布不能违背常识、不能太过离谱(先验要稳);第三,管网图纸不能有环(结构要合法)。
对应到 DAG-GNN 的总损失函数:重建损失用 X 与重建值 X̂ 的平方误差度量;KL 散度项强制潜变量 Z 的近似后验不要偏离标准高斯先验太远;λ 加权的 h(A) 项持续施压让 A 无环。整个模型——编码器 GNN、解码器 MLP、邻接矩阵 A ——一起端到端梯度下降。
三位考官一起打分,谁也不能只手遮天。工程师不断调整模型,直到三张考核表都过得去,一张既贴合数据又不违反物理的管网图才终于浮出水面。
- 重建误差(第一项)解码器输出的 X̂ 与原始观测 X 的逐元素平方误差之和,用 Frobenius 范数表示,衡量沙盘仿真与真实数据的差距。
- β·KL(第二项)KL 散度乘上权重 β,β 控制“潜变量分布规整”与“重建精确”之间的平衡,β 太大模型会忽略重建、β 太小潜空间会失控。
- λ·h(A)(第三项)DAG 惩罚权重 λ,λ 越大梯度下降越强烈地避开有环结构,通常配合逐步增大的策略使用。
- 端到端最小化对编码器参数 φ、解码器参数 θ 和邻接矩阵 A 同时求梯度并更新,最终收敛到既拟合数据又满足无环的解。
与NOTEARS对比
水务局有位老工程师 NOTEARS,经验丰富但有个信念:管道基本都是直来直去的,流动规律近似线性。他解决问题的方法很直接:列一个线性方程 X=XA+Z,在“无环”约束下解出 A。单次连续的优化就能跑完,快、稳、可解释。
AI 团队 DAG-GNN 不服:真实管网哪儿那么多直线?泵站、阀门、混合池到处都是非线性。他们认为,与其用线性回归硬套,不如用神经网络把“从潜变量到观测”的复杂映射学出来。于是除了共享同一个 h(A) 连续化思想,二者走了完全不同的路:NOTEARS 是带约束的线性优化问题,DAG-GNN 是端到端的深度生成模型。
老城区的直通管道,老工程师又快又省钱;新城区的复杂管网,AI 团队的沙盘推演更接近真相。两者不是取代关系,而是互补——DAG-GNN 的 h(A) 正是从 NOTEARS 手中接过的接力棒。
- X - XA(线性 SEM 残差)假设每个变量是其他变量的线性组合加噪声,即 X = XA + Z,残差 Z 就是噪声项,对应“直来直去”的管道假设。
- 范数平方(残差能量)对所有样本所有变量的残差求平方和再平均,衡量线性模型的拟合程度。
- 无环约束(等式约束)要求解出的 A 严格满足 h(A)=0,否则不合法,对应“管网绝不允许有环”的物理铁律。
- 增广拉格朗日求解把等式约束转化为惩罚项,用连续优化方法(如 L-BFGS)迭代求解 A。
评估与应用展望
任何管网诊断方案,都不能直接上工地。先要在实验室沙盘里检验:按已知图纸造一批流量数据,让算法反推图纸,看推得准不准。DAG-GNN 论文正是这样做的——在合成数据(Synthetic)上,用 SHD(结构汉明距离,即预测边与真实边不一致的数量)、召回率等指标与 NOTEARS、PC 等方法对比。
合成数据实验显示,DAG-GNN 在非线性关系、较大图规模上表现突出,代价是训练更慢、超参数更多。真实应用里,它已经被用于基因表达数据推断调控网络、从多公司财务数据推断风险传导方向、从传感器数据定位工业故障源头。这些场景的共同点:变量多、非线性强、因果结构才是真正想要的产品。
当然,DAG-GNN 也有短板:它假设潜变量 Z 是节点自身的扰动,不能自动处理“隐藏共同原因”;当数据不满足无隐变量假设时,可识别性仍然受限;大规模的 h(A) 计算和神经网络训练也相当吃算力。
沙盘演兵过关,才能真上工地。DAG-GNN 是一张值得期待的蓝图,但工程师们心里明白:任何推断方法都只是探针,最终因果关系还要靠实验和领域知识去验证。
AI 应用场景
基因调控网络发现
阶段:因果结构学习
解决的问题:基因表达数据维度高达数千、调控关系呈强非线性、样本量往往有限。传统 PC 算法做条件独立性检验,在样本不足时统计功效低;NOTEARS 的线性假设又限制了对复杂调控的刻画。DAG-GNN 用 GNN 编码器整合全网络的表达信号,用 VAE 生成式框架对非线性调控建模,端到端学习调控 DAG。
具体案例:给定某种癌细胞系在几百个样本中的上万基因表达谱,用 DAG-GNN 推断转录因子与靶基因之间的调控边,输出一张有向无环的基因调控网络。研究者重点检查已知癌基因(如 TP53、MYC)的出边,验证方法是否复现了文献中的关键调控关系。
金融风险传导分析
阶段:因果结构学习
解决的问题:系统性风险的核心是“一家公司违约会不会传导到另一家”。传统相关矩阵只能显示“一起下跌”却给不出方向,无法区分源头与受害者。DAG-GNN 从多家公司的时间序列中学习有向传导图,识别风险源头与传播枢纽。
具体案例:选取 50 家龙头公司两年日度收益率序列,用 DAG-GNN 学习行业间风险传导 DAG。输出结果中,银行与能源板块往往出现在上游、消费出现在下游,印证了“金融体系风险源头”的直觉。风控团队据此优先监控上游节点公司。
工业系统故障溯源
阶段:因果结构学习
解决的问题:一条自动化产线安装几十个传感器,某个环节故障会沿物理连接传播。传感器读数之间存在非线性、延迟耦合,人工排查因果链耗时费力。DAG-GNN 能从运行数据中推断故障传播方向,快速定位源头。
具体案例:在风电场 SCADA 数据上运行 DAG-GNN,输出传感器间的有向因果图。当某传感器读数异常时,工程师沿因果边上溯查找源头传感器,将故障定位时间从数小时缩短到十几分钟。
Python 演示
import numpy as np def h_func(A, alpha=1.0): """DAG 无环惩罚:h(A)=tr[(I+alpha*A*A)^n]-n,当且仅当 A 为 DAG 时 h=0""" n = A.shape[0] M = np.eye(n) + alpha * (A * A) return float(np.trace(np.linalg.matrix_power(M, n)) - n) def generate_data(A_true, n_samples=2000): """按线性 SEM 生成数据:X = Z (I-A)^{-1},Z 为独立同分布高斯噪声""" n = A_true.shape[0] I = np.eye(n) Z = np.random.normal(0, 1, (n_samples, n)) return Z @ np.linalg.inv(I - A_true).T def total_loss(A, X, lambda_dag=0.5): """简化版 DAG-GNN 损失:重建损失(负对数似然) + DAG 惩罚""" I = np.eye(A.shape[0]) residual = X @ (I - A) recon = 0.5 * np.mean(residual ** 2) - np.log(np.linalg.det(I - A)) return recon + lambda_dag * h_func(A) def numeric_grad(A, X, lambda_dag, eps=1e-6): """中心差分数值梯度,避免手推复杂反向传播""" d = A.shape[0] grad = np.zeros_like(A) for i in range(d): for j in range(d): Ap = A.copy() Am = A.copy() Ap[i, j] += eps Am[i, j] -= eps grad[i, j] = ( total_loss(Ap, X, lambda_dag) - total_loss(Am, X, lambda_dag) ) / (2 * eps) return grad def train_dag_gnn(A_init, X, lr=0.05, lambda_dag=0.6, steps=200, threshold=0.2): """梯度下降训练:更新 A 使其逼近真实因果结构""" A = A_init.copy() for _ in range(steps): A -= lr * numeric_grad(A, X, lambda_dag) np.fill_diagonal(A, 0.0) A = np.clip(A, -1.0, 1.0) return (np.abs(A) > threshold).astype(int), A if __name__ == "__main__": A_true = np.array([ [0.0, 0.8, 0.0], [0.0, 0.0, 0.6], [0.0, 0.0, 0.0] ]) X = generate_data(A_true, n_samples=2000) A_binary, A_score = train_dag_gnn(np.zeros((3, 3)), X) print("真实 DAG:\n", A_true.astype(int)) print("学习到的 DAG:\n", A_binary) print("边权得分矩阵:\n", np.round(A_score, 3)) print("h(A) 惩罚值:", round(h_func(A_score), 6))
residual = X @ (I - A)计算线性 SEM 的残差,相当于把“管网传播”反向剥离,残差反映当前结构 A 的解释力。recon = 0.5 * np.mean(residual ** 2) - np.log(np.linalg.det(I - A))高斯似然的负对数,第 2 项行列式是归一化常数,它推动 A 产生有效传播效应。return recon + lambda_dag * h_func(A)总损失 = 重建损失 + DAG 无环惩罚,对应正文中“三位考官一起打分”。M = np.eye(n) + alpha * (A * A)h(A) 的核心,先给每个边权平方保证非负,再加单位阵提供自环基准。np.trace(np.linalg.matrix_power(M, n)) - n用矩阵幂的迹统计闭合路径,有环时贡献非零、无环时恰好抵消为 0。grad[i, j] = (total_loss(Ap,...) - total_loss(Am,...)) / (2*eps)中心差分数值梯度,绕开手推反向传播。np.fill_diagonal(A, 0.0)禁止变量自己引起自己,对应“无自环”的因果常识。(np.abs(A) > threshold).astype(int)把连续边权按阈值二值化,输出 0/1 邻接矩阵作为最终 DAG。
常见误区
误区“NOTEARS 是传统优化方法,DAG-GNN 是深度学习方法,两者一点关系都没有,甚至连无环约束的写法都不一样。”
正解DAG-GNN 的“无环约束”直接继承自 NOTEARS 提出的 h(A) 函数,二者共享同一个连续化思想——把“有没有环”这种离散性质变成可微标量。区别仅在于结构学习器:NOTEARS 用线性回归 + 连续优化,DAG-GNN 用深度生成模型(VAE+GNN)端到端学习。就好比两位工程师都用“环流报警器”(h 函数),只是一个画直线、一个建沙盘。
为何常见:初学者看到“一个讲优化、一个讲神经网络”的表面差异,容易忽略论文之间的传承关系。
误区“h(A) 内部一定有个环检测算法,数一数图里有多少个环,个数为 0 才返回 0。”
正解h(A) 并不是在数环。它的本质是统计“闭合路径的加权和”——通过矩阵幂的迹,累加所有从某节点出发走 n 步回到自身的路径。有环时,可以在环上绕圈产生多条额外闭合路径,导致迹大于基准值 n;无环时只留下单位阵的 n 条自环,迹恰好为 n。它把“是否无环”编码成一个连续标量,而不是显式地枚举环。
为何常见:“h(A)=0 当且仅当无环”这个性质太强,让人误以为函数内部做了图论环检测。
误区“DAG-GNN 里 Z 的维度等于 n,既然变量有 n 个,潜变量也应该是 n 维,不用调。”
正解潜变量维度是超参数,不是由变量数硬性决定的。它需要足以承载数据生成所需的独立随机源,但又不能大到引发过拟合和额外算力开销。实践中需要根据重建误差和下游结构学习效果在验证集上调节,和选 λ、β、网络层数一样属于模型调优的一部分。
为何常见:看到公式里 Z 和 X 形状相同,容易想当然地认为必须匹配。
误区“VAE 不是能学潜变量吗?那 DAG-GNN 一定能把隐藏在变量背后的共同原因也自动找出来。”
正解DAG-GNN 的潜变量 Z 只是每个节点自身的高斯扰动,它并不显式建模“节点之间的隐藏共同原因”。当数据中存在未观测的混淆变量时,因果结构的可识别性依然受到很大限制。VAE 学到的潜变量是数据分布的压缩表示,不等于因果意义上的隐混淆因子。
为何常见:变分自编码器能“学会潜表示”,让初学者误以为它拥有自动发现一切潜在因素的神奇能力。
面试题
Q1. DAG 中 "Acyclic"(无环)指的是什么?
- A.图中没有重边
- B.图中没有闭合回路← 正确答案
- C.图中没有孤立节点
- D.图中没有双向箭头
答案:B。无环意味着沿着箭头方向走,不可能回到出发节点,也就是不存在闭合的有向回路。重边、孤立点都不是 DAG 禁止的;双向箭头等价于两条反向边,会构成 2 节点闭合回路,同样被无环性排除。这就像污水管网不能出现能让水流打转的环路。
Q2. DAG-GNN 中编码器的主要作用是什么?
- A.从观测反推潜变量分布← 正确答案
- B.从潜变量生成观测样本
- C.计算邻接矩阵特征值
- D.对数据做归一化处理
答案:A。DAG-GNN 是变分自编码器框架,编码器接收观测 X 和结构 A,输出潜变量 Z 的近似后验分布参数(均值与方差),也就是“从地表读数反推污染源的可能范围”。生成观测样本是解码器的职责;邻接矩阵是我们要学的参数而非编码器输出;归一化只是预处理步骤。
Q3. h(A) 函数中 A⊙A 的含义是什么?
- A.两个矩阵相乘
- B.两个矩阵逐元素平方← 正确答案
- C.两个矩阵做逻辑与
- D.转置后做矩阵乘法
答案:B。⊙ 是 Hadamard 乘积,即相同位置的元素直接相乘。A⊙A 就是每个边权自身平方,保证加入矩阵幂的“路径容量”非负,使迹能正确累计闭合路径。矩阵乘法是 A@A,逻辑与是布尔运算,转置乘法是 A^T A,三者都与逐元素平方不同。
Q4. 变分推断中“重参数化技巧”解决的核心问题是什么?
- A.梯度消失难以缓解
- B.采样过程不可求导← 正确答案
- C.过拟合现象非常严重
- D.训练数据严重不充足
答案:B。从近似后验 q_φ 中采样 Z 是随机操作,随机性让梯度无法回传到编码器参数 φ。重参数化把采样写成 Z=μ+σ⊙ε(ε 为标准正态随机数),随机性全部来自 ε,而 μ、σ 是确定性函数,梯度可以正常回传。好比固定骰子、对结果做可微缩放,骰子的随机性不再阻塞求导。
Q5. 与 NOTEARS 相比,DAG-GNN 的主要优势是什么?
- A.计算速度显著更快
- B.能建模非线性关系← 正确答案
- C.不需要任何数据假设
- D.保证得到全局最优解
答案:B。NOTEARS 假设线性 SEM 并用解析方法求解;DAG-GNN 用神经网络做编码解码,能拟合非线性生成过程,这是它最核心的优势。但深度学习训练更慢,不可能“无假设”(仍假设无隐变量),也不保证全局最优——速度恰恰是 NOTEARS 的优势。
Q6. 为什么 h(A) 在 A 有环时严格大于 0?
- A.因为矩阵乘法让迹必然变大
- B.因为闭环路径产生了额外贡献← 正确答案
- C.因为对角元素全部变大了
- D.因为 n 次幂破坏了稀疏性
答案:B。h(A) 的迹统计“从某节点出发、走 n 步回到自身的闭合路径加权和”,基准是单位阵提供的 n 条自环。当 A 有环时,可以在环上绕行多圈形成额外闭合路径,这些路径在矩阵幂中被累加进迹,使 h 大于 0。矩阵乘法本身不必然增大迹,对角元素也不一定全变大。
Q7. DAG-GNN 总损失中 λh(A) 项的典型作用是什么?
- A.加强重建精度
- B.约束图的稀疏程度
- C.迫使结构满足无环← 正确答案
- D.增加模型参数量
答案:C。λ 是 DAG 惩罚的权重,h(A) 越大惩罚越重,梯度下降会把 A 推向 h=0 的无环区域,如同“环流报警器”持续施压。重建精度由重建损失负责;稀疏度通常由 L1 正则承担;参数量与网络结构有关,三者都与 λh(A) 没有直接关系。
Q8. 下列哪些属于因果发现的目标或约束?
- A.从观测数据推断结构← 正确答案
- B.保证图是有向无环← 正确答案
- C.消除所有的样本噪声
- D.找出变量之间的方向← 正确答案
答案:ABD。因果发现的输入是观测数据,输出是带方向的 DAG,因此推断结构、保证无环、判定方向都是核心目标。但“消除所有噪声”既不可能也不必要——观测噪声本身就是数据的一部分,SEM 中的噪声项反而是潜变量信息的来源。
Q9. DAG-GNN 中包含了哪些深度学习组件?
- A.图神经网络编码器← 正确答案
- B.变分自编码器框架← 正确答案
- C.长短时记忆网络层
- D.多层感知机解码器← 正确答案
答案:ABD。DAG-GNN 的编码器是 GNN 层,负责输出潜变量分布;整体框架就是变分自编码器(VAE);解码器用 MLP 从潜变量重建观测。LSTM 面向序列数据,在 DAG-GNN 的核心架构中并未使用(虽然理论上可以扩展到时序因果建模)。
Q10. 关于 h(A) 函数,下列说法正确的有哪些?
- A.A 为 DAG 时其值等于 0← 正确答案
- B.对任意有向图连续可微← 正确答案
- C.可以直接数出环的个数
- D.矩阵幂的迹统计闭合路径← 正确答案
答案:ABD。h(A)=0 当且仅当 A 对应的图无环,且表达式对 A 连续可微,这正是 NOTEARS 连续优化的精髓。但它的值是“闭合路径加权和”而非环的个数——在环上绕 k 圈会产生多条不同的闭合路径都会被计入,所以 C 偷换了概念,D 才是正确的直觉。