概率图推断之变量消除算法
接下来,我们将注意力转向图模型中的推断问题。
给定概率模型(如贝叶斯网络或马尔可夫随机场),我们真正关注的是如何使用它来解决问题,例如判断给定的邮件是不是垃圾邮件。更确切地说,我们关注两类问题:
- 边际推断:在我们将所有其他变量相加后,模型中给定变量的概率是多少(例如垃圾邮件vs非垃圾邮件)
$$
p(y=1) = \sum_{x1} \sum{x2} \cdots \sum{x_n} p(y=1, x_1, x_2, \dotsc, x_n)
$$
- 最大后验(MAP)推断:模型中变量最可能的取值是什么(可能以证据为条件)
$$
\max_{x_1, \dotsc, x_n} p(y=1, x_1, \dotsc, x_n)
$$
事实证明,推理是一项颇具挑战的任务。对于很多我们感兴趣的概率,要准确回答这些问题都是NP难题。至关重要的是,推理是否容易处理取决于描述概率的图的结构。尽管有些问题很难解决,我们仍然可以通过近似推理方法获得有用的答案。
本章介绍了第一个精确推理算法——变量消除法。我们将在后面的章节中讨论近似推断算法。为了方便讨论,这里我们约定$x_i$是离散变量,每个变量取$k$个可能值。
说明性示例
我们先从边际推断问题入手。为了简单起见,假设我们有一个链式贝叶斯网络,即
$$
p(x_1, \dotsc, x_n) = p(x1) \prod{i=2}^n p(xi \mid x{i-1})
$$
我们想要计算边缘概率$p(x_n)$,最朴素的办法是将$x1, \dotsc, x{n-1}$上每个取值,共$k^{n-1}$个概率相加
$$
p(xn) = \sum{x1} \cdots \sum{x_{n-1}} p(x_1, \dotsc, x_n)
$$
然而,利用概率分布的因子分解可以更好地完成这项工作。我们可以通过将某些特定变量“推到”后面来重写该求和公式
$$
\begin{align}
p(xn)
& = \sum{x1} \cdots \sum{x_{n-1}} p(x1) \prod{i=2}^n p(xi \mid x{i-1}) \
& = \sum{x{n-1}} p(xn \mid x{n-1}) \sum{x{n-2}} p(x{n-1} \mid x{n-2}) \cdots \sum_{x_1} p(x_2 \mid x_1) p(x_1)
\end{align}
$$
我们先对内部项求和,从$x1$开始到$x{n-1}$结束。具体来说,我们首先通过对$x_1$求和计算出一个中间因子$\tau(x2) = \sum{x_1} p(x_2 \mid x_1) p(x_1)$。这一步需要$O(k^2)$的时间,因为我们必须对$x_2$的每个取值求和$x_1$。因子$\tau(x_2)$的结果是一个有$k$个值得表(不一定是概率),对$x_2$的每个取值对应一个条目。我们可以用因子$\tau$重写边缘概率公式为:
$$
p(xn) = \sum{x_{n-1}} p(xn \mid x{n-1}) \sum{x{n-2}} p(x{n-1} \mid x{n-2}) \cdots \sum_{x_2} p(x_3 \mid x_2) \tau(x_2)
$$
这里我们可以发现,上面公式跟初始公式形式相同,只是我们少对一个变量进行求和。因此我们可以计算因子$\tau(x3) = \sum{x_2} p(x_3 \mid x_2) \tau(x_2)$,同样方法带入上面公式将边缘概率重写...如此循环直到公式中仅剩下$x_n$。因为每一步耗时都是$O(k^2)$,我们共进行了$O(n)$次,因此总共耗时$O(nk^2)$,这远好于一开始的$O(k^n)$。
上面的过程,每一步我们都会消去一个变量,“变量消除”算法因此得名。
消除变量
通过上面这个特殊的例子,相信大家对变量消除有了直观上的认识,下面我们一般形式来介绍变量消除算法。
因子
假设我们给定一个图模型作为因素的乘积
$$
p(x_1, \dotsc, xn) = \prod{c \in C} \phi_c(x_c)
$$
回想一下,我们可以将因子视为多维表,为一组变量$x_c$的每个取值赋值。在贝叶斯网络中,这些因子对应于条件概率分布。在马尔可夫随机场中,因子编码了非正态分布;为了计算边缘概率,我们首先计算分配函数(也使用变量消去法),然后使用非正态分布计算边缘概率,最后将结果除以分配常数以构造有效的边缘概率。
因子运算
变量消除算法重复执行两个因子操作:乘积和边缘化。在上面的链式示例中,我们一直在隐式执行这些操作。
因子乘积运算简单地定义了两个因子$\phi_1, \phi_2$的乘积$\phi_3 := \phi_1 \times \phi_2$为
$$
\phi_3(x_c) = \phi_1(x_c^{(1)}) \times \phi_2(x_c^{(2)})
$$
$\phi_3$的范围定义为$\phi_1, \phi_2$范围内变量的并集,同时$x_c^{(i)}$表示对$\phi_i$范围内的变量的赋值,该范围由$x_c$对该范围的限制限定。例如我们定义:$\phi_3(a,b,c) := \phi_1(a,b) \times \phi_2(b,c)$
其次,边缘化操作“局部”消除了一个因子中的一组变量。如果我们有两组变量$X, Y$构成的因子$\phi(X, Y)$,对$Y$边缘化产生一个新因子
$$
\tau(x) = \sum_y \phi(x, y)
$$
其中求和是对Y变量集合的每一个取值进行求和。
我们使用$\tau$来表示边缘化因子。这里重点要理解,该因子不一定与概率分布相对应,即使$\phi$是条件概率分布。
这里,我们将变量$B$从因子$\phi(A, B,C)$中边缘化。
排序
最后,变量消除算法需要根据哪些变量将被“消除”来对变量进行排序。在我们的链式示例中,我们采用DAG所蕴含的顺序。需要注意的是:
- 不同的排序可能会显著影响变量消除算法的运行时间。
- 找到最佳排序是NP问题
稍后我们将讨论这些复杂问题。
变量消除算法
我们正式定义变量消除(VE)算法。本质上,我们按照$O$给出的顺序循环变量,并按顺序消除它们。
更正式地说,对于每个变量$X_i$(根据$O$排序)
- 将包含$X_i$的因子$\Phi_i$相乘;
- 将$X_i$边缘化以获得新因子$\tau$;
- 用$\tau$替换因子$\Phi_i$;
举例
我们还是用上面的链式示例看一下算法步骤是如何对应的。在这个例子中,我们选择的顺序是$x_1, x2, \dots, x{n-1}$。从$x_1$开始,我们收集所有与$x_1$相关的因子,分别是$p(x_1)$和$p(x_2 \mid x_1)$。我们用它们构建新的因子$\tau(x2) = \sum{x_1} p(x_2 \mid x_1) p(x_1)$。这可以看作是变量消除算法的1、2步的结果:首先我们构建一个大因子$\sigma(x_2, x_1) = p(x_2 \mid x_1) p(x_1)$,然后从因子中消去$x_1$得到$\tau$。接着我们对$x_2$重复相同的步骤,不同的是此时因子变为$p(x_3 \mid x_2), \tau(x_2)$。
对于稍微复杂一些的例子,回想一下我们前面介绍的学生成绩的图模型。
学生考试成绩的贝叶斯网络模型
模型指示的概率可以描述为:
$$
p(l, g, i, d, s) = p(l \mid g) p(s \mid i) p(i) p(g \mid i, d) p(d)
$$
假设我们要计算$p(l)$并消除图中拓扑排序的变量。首先我们消除$d$,为此我们构建新的因子$\tau_1(g,i) = \sum_d p(g \mid i, d) p(d)$。然后我们消除$i$,并构建新的因子$\tau_2(g,s) = \sum_i \tau_1(g,i) p(i) p(s \mid i)$。接着我们消除$s$,构建新的因子$\tau_3(g) = \sum_s \tau_2(g,s)$,以此类推。注意,这些操作相当于将因子的概率分布以如下形式求和:
$$
p(l) = \sum_g p(l \mid g) \sum_s \sum_i p(s\mid i) p(i) \sum_d p(g \mid i, d) p(d)
$$
这个例子每步需要最多$k^3$次操作,因为每个因子最多涉及2个变量,且每步加总出一个变量。
证据
一个密切相关且同等重要的问题是用如下形式计算条件概率:
$$
P(Y \mid E = e) = \frac{P(Y, E=e)}{P(E=e)}
$$
其中$P(X, Y, E)$是查询变量$Y$,观察到证据$E$和为观测变量$X$下的概率分布。
我们可以通过对$P(Y, E=e)$执行一次变量消除,然后对$P(E=e)$执行一次变量消除,来计算这个概率。
要计算$P(Y, E=e)$,我们可以简单地取所有因子$\phi(X', Y', E')$,其范围中任意变量$E' \subseteq E$也包含在$E$中,然后将其值设为$e$,接着,我们对$X$执行标准变量消除,以获得仅对$Y$的因子。
变量消除的时间复杂度
理解变量消除的运行时间很大程度上取决于图的结构,这一点非常重要。
上面的例子中,假如我们先消去$g$,那么我们需要将因子$p(g \mid i, d), \phi(l \mid g)$转换为一个具有3个变量的大因子$\tau(d, i, l)$,这将需要$O(k^4)$:即每个条件变量计算$k$次,对$g$的每个取值计算$k$次。如果我们有因子$S \rarr G$,那么我们还需要消去$p(g \mid s)$,用$O(k^5)$次计算产生一个巨无霸因子$\tau(d, i, l, s)$。然后,从这个因子中消除任何变量所需的工作几乎与从原始分布开始消除一样多,因为所有变量都已耦合。
显然,有些消除顺序比其他顺序更有效。实际上,变量消除的运行时间为$O(n k^{M+1})$,其中$M$是消除过程中产生因子$\tau$的最大大小,$n$是变量数量。
选择变量消除顺序
遗憾的是,选择最优变量消除顺序是个NP问题。然而,在实践中,我们可以采用以下启发式方法:
- 最少邻居:选择依赖变量最少的变量。
- 最小权重:选择变量以最小化其因变量基数的乘积。
- 最小填充:选择顶点以最小化添加到图中的因子的大小。
这些方法通常会在许多环境中产生相当好的性能。