想象你是这座城市夜市的“因果侦探”。夜市里的摊位每天都有些“怪异”的销量共同涨落:麻辣烫生意火爆时,隔壁奶茶摊的销量也升高;卖冰粉的小车总在烤串摊收摊后才迎来高峰。你手里只有一张记录了每个摊位每日销量的表格——没有摊位老板告诉你他们之间是供货关系还是顾客喜好带动。这就是因果发现要解决的核心问题:从纯观测数据中推断变量之间“谁影响谁”的方向性结构。 传统侦探破案,会逐个摊位做“控制变量”实验:拦住顾客问“你今天本来想买什么”,成本极高、有时还做不到。GOLEM 的做法完全不同——它把这团乱麻的销量数据装进一台数学机器,机器里有一张“影响地图”,最初这张地图每个位置都写着“0“,表示摊贩之间互不相干。然后机器反复微调地图上的数字:哪些摊位之间应该存在影响、影响的方向怎么走、强度多大,直到这张地图能让所有摊位的销量波动得到最自洽的解释。最妙的是,GOLEM 允许不同摊位拥有不同的”运气波动幅度”——奶茶摊受天气影响大,干货摊则稳如泰山——这让它比一些老方法更贴近真实世界的复杂性。
掌握 GOLEM,是从事因果推断与可解释 AI 的必备技能。它让你能从纯观测数据中自动还原变量间的因果结构,为 AI 系统的透明决策提供可靠支撑。
可视化演示
展示GOLEM基于最大似然的连续优化因果结构学习,含似然目标函数优化轨迹、软无环性约束梯度求解与等方差/非等方差变体对比。
本节配有交互动效(进入视口后自动加载,约 3KB)。
似然目标函数优化 似然函数:最大化数据似然等价最小化负对数似然 加权邻接矩阵W通过梯度下降逐步逼近真值 收敛判定:似然变化小于阈值时停止迭代 L(W) = -log p(D|W) + λ·h(W) GOLEM将离散DAG搜索转化为连续优化问题
因果发现背景
夜市上你注意到麻辣烫和奶茶销量同步上升,一个初学侦探会立刻断言:“麻辣烫带动了奶茶!”但事实也可能是奶茶排队太久,顾客顺手买了麻辣烫;也可能是广场舞散场同时带动了两家。相关关系像一双握在一起的手,因果方向才说明谁先伸出手。数据中的相关性是对称的,而因果关系是不对称的——这正是因果发现要回答的“方向之谜”。
如果能把所有摊位都搬到实验室里逐一控制变量,问题会简单得多,但真实世界中我们只有被动观测到的数据,几乎没有干预实验的机会。因果发现的任务,正是从这些“没人做过实验”的观测数据中恢复变量之间的有向依赖结构。传统方法如 PC、FCI 走的是“条件独立性检验”路线——像一个侦探反复问:“排除了 Z 的影响后,A 和 B 还相关吗?”这种思路在小规模问题上有效,但每增加一个变量,检验次数就爆炸式增长,而且对检验的统计功效非常敏感,一个环节的判断失误会像多米诺骨牌一样扩散到整张图。
GOLEM 换了一条路:它不逐个检验,而是直接为“销量数据是如何生成的”建立一个数学模型,把“谁影响谁”浓缩成一张影响矩阵。这个模型就是结构方程模型(SEM):
所以第一步不是急着断言谁带动谁,而是先承认存在一张隐藏的“影响地图”,再用公式把地图的语言定下来。地图上的每个数字都代表一个可检验的因果假设,这为后面的自动优化铺好了路。
- 数据矩阵 X把 n 次观测、d 个摊位叠成一张 (n×d) 表,每行是一个时刻的采样,每列是一个摊位的销量序列。
- 影响矩阵 Wd×d 的方阵,元素 W_{k,j} 表示“第 k 个变量对第 j 个变量的影响强度”,它是我们要学习的地图。
- 矩阵乘法 XW把每个变量的值重写成“所有上游变量按影响强度加权求和”,相当于把夜市的相互带动关系写进公式。
- 噪声 ε除了已知影响之外,天气、随机客流等未观测因素造成的独立波动,它是模型里解释“运气成分”的出口。
GOLEM核心思想
老派侦探把摊位关系看成“有箭头/没箭头”的离散结论,一旦某步判断错就全盘皆输。GOLEM 这位新侦探选择画一张“软地图”:每条可能的关系上先写一个 0 到 1 之间的小数,表示“怀疑强度”。这样一来,地图不再是硬邦邦的箭头清单,而是一张可以被数学工具反复打磨的画布。
GOLEM 的全称是 Gradient-based Optimization of Linear Expectation-Maximization,直译为“基于梯度的线性期望最大化优化”。不必纠结名字里的期望最大化,只需理解它的哲学:把 SEM 中的影响矩阵 W 当作连续可调的参数,用梯度方法不断迭代更新。这里的关键在于“连续”——离散的“有箭头/没箭头”无法求导,而连续的小数可以。同时,地图必须满足一个铁律:不允许出现环。因为因果流是单向的,原料不能无中生有地转一圈回到自己手里,否则每家摊位都能“自己解释自己”,因果发现就退化成无意义的自相关。
为了让“无环”这个离散条件也能进入连续优化的世界,GOLEM 使用了一个巧妙的约束函数:
在这张软地图上,只要还有一丝环的痕迹,h(W) 就会大于 0——侦探可以精确地知道“地图还在打结”的程度,并且借助这个数值的梯度,一步步把结解开。这种“连续化”处理,是 GOLEM 区别于传统离散搜索方法的根本所在。
- Hadamard 平方 W∘W把 W 每个元素单独平方,生成一张“每条边的绝对贡献”表,确保负权重不会通过环相互抵消而隐藏环的存在。
- 矩阵指数 e^{A}把矩阵 A 看成“路径权重表”,矩阵指数会把所有长度路径的贡献累加起来;只要有环,路径就能无限延续,数值就发大。
- 迹 tr()取矩阵对角线之和,专门挑出“从某节点出发又回到该节点”的闭环路径长度。
- 减 d单位矩阵的迹恰好是 d,减掉后使得“完全无环”时 h(W)=0,这一项成为可求导的“DAG 指示器”。
目标函数构造
一张好地图要同时满足三个标准:能解释多数摊位的销量记录(拟合)、关系尽量精简(稀疏)、不能有环(DAG)。GOLEM 把这三点打包成一个总分,让侦探在“分数”的指引下不断修订地图。如果只追求拟合,地图会塞满各种噪声边;如果只追求无环,又可能丢失真实的因果箭头。三者的平衡,正是目标函数的艺术。
拟合部分最理想的度量是“数据被地图解释后的剩余随机波动”。早期工作 NOTEARS 假设每个变量的噪声方差相同,于是拟合项退化为最小二乘。但现实中摊位受随机因素影响的幅度各不相同:奶茶摊受天气影响大,干货摊则稳如泰山。GOLEM 的一大进步,是显式建模“非等方差”噪声——每个变量拥有独立的噪声方差 σ_i²,并通过经验残差的均方来估计。这就是 GOLEM 的非等方差似然目标:
总分越低,地图越接近夜市真相。GOLEM 所做的,就是在这三个标准之间找平衡点——像一位经验丰富的侦探,既不全信数据中的巧合,也不放过任何可能的线索。
- 残差 X_{,i} − X W_{:,i}:第 i 列销量中“被其他摊位影响”的部分被 XW 预测出来后,剩下的就是该摊位自己的运气波动。
- 均值平方 \frac{1}{n}\|\cdot\|_2^2对残差平方取平均,得到第 i 个摊位噪声方差的估计值,记作 σ_i²。
- log 求和对不同方差取对数后再求和,相当于在“模型解释力”与“噪声大小”之间做自然平衡,避免某个大方差变量主导整个目标。
- L1 稀疏惩罚 λ1Σ|W_ij|惩罚那些没有足够证据的边,把影响系数推向 0,保证地图精简、可读。
- DAG 惩罚 λ2 h(W)把环的惩罚并入目标——λ2 越大,侦探越不能容忍地图上有环,但过大也会牺牲拟合精度。
梯度优化求解
总分确定后,侦探从一张全零地图出发,一步一步微调每个格子上的数字,等待分数的下降。这就像沿着山坡往下走:每走一步都看一眼脚下的坡度,朝最陡的下坡方向迈一步,直到走到山谷底部。目标函数的每个部分都是 W 的可微(或可次微分)函数,因此整个问题可以被现代优化器优雅地解决。
实际应用中,GOLEM 常采用 L-BFGS 或 Adam 优化器,而不是最朴素的梯度下降。每次迭代都沿着“降低总分数”的方向移动一小步,同时用 h(W) 的梯度把“环”逐步拧松。参数更新的核心规则如下:
优化完成后,算法会对 W 做一步“阈值化”处理:把绝对值小于阈值的边视为噪声裁掉,得到干净的 0/1 图。整个流程就像侦探不断对照证据,删除弱怀疑、理顺循环链条。最后一张清晰的因果图,就是侦探提交给委托人的报告。
- W^{(t+1)} 与 W^{(t)}上一轮地图与下一轮地图的对比——地图的修改不是突变而是连续微调,每步只改变一点。
- 学习率 η每次微调的步长,太大容易在最优解附近震荡,太小则收敛极慢,像下山时步子迈太大容易摔倒。
- 拟合梯度 ∇_Wℓ数据拟合项对 W 的梯度,指明“往哪个方向修图能更好解释销量波动”。
- λ1 sign(W)L1 正则的次梯度,符号函数把弱正边和弱负边都推向 0——它的存在让稀疏性真正落地。
- λ2 ∇_W h(W)DAG 约束的梯度,对环贡献最大的边受到最强的反方向修正,逐渐把环拧松。
性能对比画像
夜市里,老侦探 NOTEARS 也很能干,但它有一个执念:假设所有摊位的随机波动一模一样。这显然不符合现实——奶茶摊的波动比干货摊大得多,冰粉摊甚至只在特定天气才开门。GOLEM 正是从这个执念上破局的后来者。两者师出同门,都使用 h(W) 作为无环约束,但在模型假设和优化形态上走向了不同的岔路。
NOTEARS 首次把 DAG 约束变成连续函数 h(W)=0,用等方差高斯似然(即最小二乘)作为拟合项,并把 h(W)=0 当作硬约束来满足。GOLEM 的改进体现在两方面:一是把等方差假设放宽为可学习的独立方差,让拟合项从“整体残差平方”升级为“非等方差似然”;二是把硬约束变成惩罚项(软约束),让优化曲面更平滑。实验表明,在非同方差噪声下 GOLEM 的恢复精度显著优于 NOTEARS;在中等规模高维稀疏场景下,GOLEM 的梯度计算也更稳定,收敛路线更平缓。两代方法的差异可以浓缩为一个对比:
如果说 NOTEARS 是把地图用力按在墙上不许动,GOLEM 则是把地图泡在一锅有弹性的胶水里——允许暂时的环,再用惩罚慢慢捋直,反而更快到达真正的终点。这种“软一点反而更快”的直觉,在优化世界里经常成立。
- \|X − XW\|_F²NOTEARS 的拟合项,假设各列噪声方差相等,用整体残差平方和衡量拟合质量。
- 硬约束 s.t. h(W)=0NOTEARS 必须在每一步都保证 W 对应无环图,需要额外的投影或增广拉格朗日迭代,计算成本更高。
- ⟹ 右侧目标GOLEM 把约束直接并入目标函数,优化器可以在“暂时有环”的状态下继续前进,不会被挡在可行域外。
- 非等方差似然 ℓ(W;X)每个变量有独立的噪声方差估计,能更精细地刻画“波动大的摊位”与“波动小的摊位”。
- λ1 与 λ2 分离GOLEM 把“稀疏”和“无环”拆成两个旋钮分别调节,调参更灵活;NOTEARS 只有一个稀疏系数 λ 且无环是硬性要求。
工程落地策略
拿到侦探报告之前,老板总是要问:“这结论可靠吗?换个数据还能复现吗?”工程落地就是回答这些问题的环节。再精巧的算法,进了生产环境都要面对脏数据、超参选择与结果可信度的考验。GOLEM 虽然好用,但要让它稳定地产出可用因果图,需要一套相对完整的操作流程。
数据预处理是第一道关卡:标准化或归一化可以消除量纲差异;去除离群点能防止个别异常被当成强因果边;缺失值需要谨慎插补,否则会引入虚假结构。超参调优是第二道关卡:λ1 控制稀疏度,λ2 控制无环强度。一般先用较小的 λ1、较大的 λ2 保证基本无环,再在无环条件附近微调 λ1;条件允许时用 Bootstrap 重采样多次运行,观察同一条边出现的频率,低频边大概率是噪声。计算资源方面,GOLEM 使用连续优化而不是离散搜索,通常比条件独立性检验方法快一个量级,适合几十到几百个变量的场景。最后是后处理阈值化,把弱边裁掉:
这就像侦探结案前把怀疑度不足三成的线索一键清除,只把有确凿证据的箭头写进报告。工程上还要记住:GOLEM 输出的图是“候选因果结构”,上线前务必与领域专家核对关键边,切勿直接驱动自动决策。
- W\*_ij优化完成后影响矩阵的最终值,代表算法对“变量 i 影响变量 j”这一指控给出的证据强度。
- 绝对值 |W\*_ij|正负只是方向,强度看绝对值——无论是“促进”还是“抑制”,只要强度够大就值得保留。
- 阈值 τ一个需要经验或交叉验证取值的超参数,太小保留噪声边,太大丢掉真实边,一般取 0.1–0.5。
- 指示函数 1{·}条件成立时输出 1,否则输出 0——把连续地图转成离散的 0/1 邻接矩阵。
前沿扩展方向
夜市侦探的装备在升级——线性地图只能描述“每多一勺辣油就多卖多少串”,但真实世界的关系常常拐弯:天气超过 35 度,冰粉摊的销量暴涨,而 20 度时几乎没人买。线性模型表达不了这种“条件式”的因果。GOLEM 的思想框架可以自然扩展到非线性 SEM,把每个变量的生成方程从线性组合替换成任意函数,比如神经网络或高斯过程。
除了非线性,真实数据还面临另外两个挑战:一是未观测的混杂因子(隐变量)会同时影响多个变量,单纯从观测数据中可能学到虚假因果;二是数据常常混合离散与连续变量,需要为不同类型的变量定制似然项和残差度量。研究者们正在通过增加隐藏节点、引入干预数据、设计混合似然等方式把 GOLEM 推广到更广阔的场景。非线性 SEM 的数学形式如下:
无论地图的线条是直线还是曲线,GOLEM 这套“用连续优化去拟合一张无环地图”的哲学都一以贯之——这正是它在深度因果发现中站稳脚跟的原因。未来的因果 AI 系统,将越来越多地依赖这类“能解释自身决策依据”的结构化模型。
- 父节点集合 pa(i)真正直接影响变量 i 的那些上游变量,由因果图决定,是 f_i 的输入。
- 生成函数 f_i(·)从父节点到该变量的映射,线性模型只是 f_i 为线性函数时的特例。
- 函数族 F_NN用神经网络等带参函数族承载 f_i,使 SEM 拥有表达非线性拐弯的能力,同时保持可求导。
- 独立噪声 ε_i保留与第 1 节一致的独立噪声假设,这是因果结构可识别性的重要前提。
AI 应用场景
基因调控网络发现
阶段:数据处理与因果建模
解决的问题:传统生物学验证基因间的调控关系依赖基因敲除实验,成本高、周期长、通量低。GOLEM 只需一批基因表达谱数据,即可推断转录因子与靶基因之间“谁调控谁”的因果方向,为后续湿实验缩小候选范围。
具体案例:某肿瘤研究团队对 500 个癌症细胞系的 2000 个基因表达样本运行 GOLEM,重建出 p53 通路附近的局部调控网络,锁定了 3 个此前未被关注的新候选靶基因。这些基因随后通过 siRNA 沉默实验验证了其中 2 个确实影响细胞增殖,大大加速了靶点发现流程。
金融风险传导分析
阶段:因果推理与风险归因
解决的问题:股票板块之间常常表现出联动上涨或下跌,但相关性无法说明谁是风险的源头。GOLEM 从收益率序列中恢复板块间的有向风险传导图,帮助风控团队识别“最先倒下的那块多米诺骨牌”。
具体案例:某量化风控团队对 30 个行业指数的日收益率数据应用 GOLEM,发现银行板块是流动性风险的上游节点,保险与地产板块则是下游放大器。基于这张因果图,他们将银行板块纳入压力测试的核心情景变量,风险预警提前了约 2 个小时。
工业设备故障根因定位
阶段:异常检测与根因分析
解决的问题:多传感器告警交叉触发时,运维人员难以判断哪个传感器先异常、哪个是被动连锁反应。GOLEM 从传感器时序数据中恢复故障传播方向,把“告警风暴”还原成一条清晰的故障因果链。
具体案例:某风电场将 120 个传感器采集的振动、温度、油压数据送入 GOLEM,重建出“齿轮箱温度异常 → 润滑油压下降 → 振动幅度放大”的故障传导链。运维团队据此将故障定位时间缩短了 60%,减少了非计划停机损失。
Python 演示
import numpy as np def mat_exp(A, terms=15): """矩阵指数 exp(A) 的幂级数近似""" n = A.shape[0] res = np.eye(n) term = np.eye(n) for k in range(1, terms + 1): term = term @ A / k res += term return res def dagness(W): """GOLEM 的DAG约束: h(W)=tr(exp(W*W))-d""" return np.trace(mat_exp(W * W)) - W.shape[0] def neg_ll(X, W): """非等方差线性高斯噪声的负对数似然(去常数)""" n = X.shape[0] resid = X - X @ W var = np.mean(resid ** 2, axis=0) return 0.5 * np.sum(np.log(var)) def total_loss(X, W, lam1, lam2): return neg_ll(X, W) + lam1 * np.sum(np.abs(W)) + lam2 * dagness(W) def num_grad(f, W, eps=1e-4): """数值梯度: 小扰动法近似偏导""" g = np.zeros_like(W) it = np.nditer(W, flags=['multi_index']) while not it.finished: i, j = it.multi_index wp = W.copy() wp[i, j] += eps wm = W.copy() wm[i, j] -= eps g[i, j] = (f(wp) - f(wm)) / (2 * eps) it.iternext() return g def gen_dag(d): """生成随机的下三角DAG作为隐藏真图""" W = np.zeros((d, d)) for j in range(1, d): for i in range(j): if np.random.rand() > 0.5: W[i, j] = round(np.random.uniform(0.5, 1.2), 2) return W def simulate(W, n=300): """按线性SEM生成观测数据: X = X W + noise""" d = W.shape[0] X = np.random.randn(n, d) for j in range(d): X[:, j] = X @ W[:, j] + np.random.randn(n) * 0.5 return X def threshold(W, tau=0.3): G = (np.abs(W) > tau).astype(int) np.fill_diagonal(G, 0) return G def shd(G, H): return int(np.sum(G != H)) def main(): np.random.seed(0) d = 4 W_true = gen_dag(d) X = simulate(W_true) W = np.zeros((d, d)) lam1, lam2, lr, steps = 0.02, 0.01, 2e-2, 50 for it in range(steps): W -= lr * num_grad(lambda M: total_loss(X, M, lam1, lam2), W) if it % 10 == 0: print("iter=%d loss=%.3f h(W)=%.4f" % (it, total_loss(X, W, lam1, lam2), dagness(W))) G_est = threshold(W) print("真实DAG:\n", (W_true != 0).astype(int)) print("估计DAG:\n", G_est) print("SHD =", shd(G_est, (W_true != 0).astype(int))) if __name__ == "__main__": main()
term = term @ A / k递推计算矩阵幂级数的每一项,避免重复做矩阵乘,效率更高。return np.trace(mat_exp(W * W)) - W.shape[0]实现 h(W),即“环探测器”,完全无环时等于 0。resid = X - X @ W按线性 SEM 计算残差:观测值减去“上游影响按权重叠加”的预测值。var = np.mean(resid ** 2, axis=0)对每一列残差平方求均值,得到每个变量独立的噪声方差估计。return 0.5 * np.sum(np.log(var))非等方差高斯似然的核心:对不同方差取对数再求和,兼顾各列的噪声差异。g[i, j] = (f(wp) - f(wm)) / (2 * eps)中心差分求数值梯度,简单直观,适合教学演示。W -= lr * num_grad(lambda M: total_loss(X, M, lam1, lam2), W)梯度下降更新一整代参数。np.fill_diagonal(G, 0)强制把自环边设为 0,变量不能自己影响自己。
常见误区
误区“我把变量间的相关系数都算出来,画一张热力图,绝对值大的格子就是因果关系,这不就是因果发现吗?”
正解相关性是对称的,corr(A,B)=corr(B,A),它只告诉你两个变量“手紧紧握在一起”,但无法判断是谁先伸出手。因果关系是不对称的:A 影响 B 与 B 影响 A 是两种完全不同的解释。GOLEM 输出有向图,靠的是 SEM 中“谁进入谁的生成方程”的不对称结构,以及 DAG 约束排除循环解释。这就像夜市上麻辣烫和奶茶销量同步,相关只能告诉“绑得紧不紧”,因果要判断谁是带动方。
为何常见:相关性计算简单、热力图直观,而因果结构需要额外假设和优化,初学者很容易用相关矩阵图代替因果图。
误区“GOLEM 跑完,输出的 DAG 一定反映了变量之间真实的因果机制,直接拿去报告就行。”
正解GOLEM 输出的是“与观测数据最一致且满足无环假设的候选图”。它依赖线性假设、无隐藏混淆假设,且只用到了观测相关性信息。多个不同的图可能解释同一组数据,这称为马尔可夫等价类。比如 X→Y 和 Y→X 在某些分布下不可区分。因此输出的图必须结合领域知识、实验验证和稳定性分析才能最终确认。
为何常见:算法输出的形式非常确定——一张干净整洁的有向图,让人本能地忽略背后的统计假设,误以为图示就是真图。
误区“DAG 约束是整个算法最核心的部分,把 λ2 设得很大,保证优化结果无环,效果一定更好。”
正解λ2 过大时,优化会优先满足无环而牺牲数据拟合,导致丢失真实的因果边;λ2 过小则残留环边,结果不满足 DAG。GOLEM 论文中常采用两阶段策略:先以较大的 λ2 快速进入无环区域,再在无环附近微调拟合项。这就像侦探先快速排除荒谬结论,再在可行范围内精雕细琢,而不是一味地把“无环”这条要求放到无限大。
为何常见:“无环”听起来是硬性安全要求,直觉上觉得惩罚越狠越保险,忽略了目标函数各项需要平衡的本质。
误区“优化结束后,|W_ij| 最大的那条边就是最重要的因果,按权重从大到小排序筛边即可。”
正解L1 正则会让权重整体偏向 0,因此权重值本身是有偏估计,不宜直接当作“真实因果强度”来排序。阈值化只是为了得到离散图而做的后处理。更可靠的做法是运行多次 Bootstrap,统计每条边出现的频率,并结合领域知识判断边的可靠性。
为何常见:正则化后的权重形态上很像“评分”,让人自然想排序取 Top-K,但它本质上是带偏估计,不是置信度。
面试题
Q1. GOLEM 中 DAG 约束函数 h(W)=0 表达的核心要求是?
- A.图中不能存在有向环← 正确答案
- B.图中所有节点必须连通
- C.图中每条边权重为正
- D.图中只能存在一条路径
答案:A。h(W)=tr(e^{W∘W})−d,当且仅当 W 对应的图没有有向环时 h(W)=0。连通性、权重正则与路径唯一性都不是它表达的内容。就像侦探的地图可以保留多条支路,但绝不能出现让原料回流到自己的闭环。
Q2. GOLEM 相对 NOTEARS 的关键改进在于?
- A.放弃全部数据拟合假设
- B.引入非等方差噪声假设← 正确答案
- C.改用贪心搜索求解结果
- D.完全不需要任何超参数
答案:B。GOLEM 把 NOTEARS 的等方差最小二乘升级为非等方差似然,让每个变量拥有独立的噪声方差估计,同时把硬约束改为软约束。它没有放弃拟合假设,也没有改用贪心搜索,超参数 λ1、λ2 依然需要调节。
Q3. 下列哪项是 GOLEM 的实际应用场景?
- A.从基因表达谱推断调控网络← 正确答案
- B.对图片做像素级语义分割
- C.为文本生成自动写摘要
- D.将语音信号实时转写成文字
答案:A。GOLEM 是因果发现算法,输入是观测数据表,输出是变量间的有向因果图。基因表达谱正是典型的观测数据,适合用来推断调控网络。图像分割、文本摘要与语音识别解决的是感知或生成任务,不属于因果发现范畴。
Q4. GOLEM 目标函数中 λ1 的主要作用是?
- A.控制学习率更新的快慢
- B.调节无环约束的强弱
- C.控制图中边数的稀疏度← 正确答案
- D.决定噪声方差的大小
答案:C。λ1 是 L1 稀疏正则项的系数,λ1 越大,更多弱边被压成 0,图越稀疏。学习率由优化器设置,无环约束强度由 λ2 控制,噪声方差则通过残差估计,不属于 λ1 的职责。
Q5. 下列对 h(W) 梯度的描述正确的是?
- A.它只惩罚所有负权重边
- B.它沿环贡献最大方向修正← 正确答案
- C.它把所有权重降至零刻度
- D.它让权重等比例整体放大
答案:B。∇_W h(W)=2W⊙(e^{W∘W})^⊤,环贡献越大(路径累积越多)的位置梯度越大,梯度下降时会优先修正这些边以消除环。它不会只惩罚负边,也不会把所有权重归零或整体放大。
Q6. GOLEM 完整目标函数包含下列哪些项?
- A.非等方差的数据似然项← 正确答案
- B.L1 稀疏正则惩罚项← 正确答案
- C.DAG 无环约束罚项← 正确答案
- D.交叉熵分类损失项
答案:ABC。GOLEM 目标函数由三项构成:非等方差高斯似然、L1 稀疏正则和 λ2h(W) 无环罚项。交叉熵用于分类问题,与 GOLEM 的连续回归式似然无关,属于干扰项。
Q7. 优化完成后对 W 做阈值化处理的目的是?
- A.将微弱边视为噪声并裁掉← 正确答案
- B.把权重全部转换为正值
- C.对权重做归一化到 0 到 1
- D.加速下一轮梯度更新计算
答案:A。阈值化把 |W_ij| 小于 τ 的边置为 0,大于 τ 的边保留为 1,目的是把连续权重转成干净的 0/1 图,消除噪声弱边。它不是转正、归一化,也不是为了加速优化,因为优化已经在阈值化之前完成。
Q8. GOLEM 采用非等方差似然相比等方差最小二乘的优势是?
- A.使目标函数变成凸优化
- B.允许各变量噪声幅度不同← 正确答案
- C.完全消除对数据分布假设
- D.让权重矩阵自动对称化
答案:B。非等方差似然为每个变量估计独立的噪声方差,适合真实世界中不同变量受随机因素影响程度不同的场景(如夜市里奶茶摊与干货摊的波动差异)。它不会让目标变成凸函数,也没有消除分布假设,更不会让权重矩阵对称。
Q9. 关于 GOLEM 的局限与扩展,下列说法正确的有?
- A.线性假设限制了对拐弯关系的刻画← 正确答案
- B.隐变量不会影响因果发现的结果
- C.非线性扩展可用神经网络刻画← 正确答案
- D.GOLEM 解决所有有环因果问题
答案:AC。线性 SEM 只能表达直线型关系,真实的拐弯关系需要非线性扩展,神经网络正是常用工具,因此 A、C 正确。未观测的隐变量会造成混淆,严重影响因果发现结果,B 错误;GOLEM 的目标是学习 DAG,而不是解决有环问题,D 错误。
Q10. 关于 GOLEM 的可识别性与应用前提,正确的说法是?
- A.需要观测数据的样本量足够大← 正确答案
- B.数据生成机制满足线性 SEM← 正确答案
- C.存在未观测的混杂因子也无妨
- D.要求所有噪声方差都完全相等
答案:AB。样本量不足时,方差的估计不可靠,因果图容易过拟合,因此 A 正确。GOLEM 的核心假设是数据由线性 SEM 生成,B 正确。未观测混杂因子会破坏独立性假设,导致识别错误,C 错误;GOLEM 的卖点恰恰是允许非等方差噪声,D 错误。