我们已经看到,置信传播使我们能够在图 3.10 的模型中计算变量 Jskill 的精确边缘后验分布。虽然 Jskill 的先验分布是一个由两个参数描述的高斯,但后验分布不是高斯,而是一个需要四个参数的更复杂分布。为阻止参数数量在每局游戏后不断增加,我们需要一种方法用具有固定数量参数的分布来近似这个真实的后验,为此我们选择高斯。这样后验分布就会与先验具有相同的函数形式,模仿共轭先验的行为。如果我们能做到这一点,就能把所得的近似后验分布当作下一局游戏的先验分布。这样,每个玩家的技能将始终由一个仅受两个参数支配的高斯分布表示。
第一个问题是如何用一个高斯来近似一个非高斯分布。一个简单的解法是求出该非高斯分布的均值和方差,然后选一个具有相同均值和方差的高斯作为我们的近似。事实证明这是一个合理的近似,它可以通过优化两个概率分布不相似性的某种度量来形式化地推导出来 [Bishop, 2006; Minka, 2005]。
我们也许会因此想干脆直接用一个高斯来近似 Jskill 的精确后验分布。虽然这对图 3.10 的因子图会令人满意地奏效,但当我们转向更复杂的因子图(例如本章后面将遇到的那些)时,它又会失效。具有简单函数形式的消息在穿过因子后往往会变得更复杂。当我们把模型扩展到更大、更精巧的图时,很快就会遇到消息无法被精确计算的情形。这类问题可以通过在每个因子节点处局部地做近似来避免,从而使所有消息都具有所需的分布类型。这确保了只要每个因子都能使用适当的分布类型向所有相邻的变量节点发送近似消息,因子就可以被组合成任意的图。
下面这一小节会深入这类近似推断算法的数学细节。如果你想跳过这些细节,尽可直接看下一节。
推断深入探讨
在这个可选小节中,我们引入期望传播这一近似推断技术,我们将在本书中广泛使用它。如果你想专注于建模,尽可跳过本小节。
回到图 3.12(为方便起见在图 3.21 中重现),我们看到消息 (6) 是我们遇到的第一个非高斯消息。
图 3.21:在应用置信传播计算 Jskill 更新分布时出现的消息。(重现自图 3.12。)
因此我们的目标是用一个高斯来近似消息 (6),从而确保所有后续消息也都是高斯分布。
尽管这似乎是一个可取的目标,但也似乎存在一个重大障碍——如图 3.17 所示,消息 (6) 的精确形式看起来一点也不像高斯!事实上,它的均值和方差甚至都没有良好定义(两者都是无穷)。找到一个合理高斯近似的关键在于注意到:消息 (6) 的近似版本随后会作为消息 (7) 和 (8) 的修改形式在图中传递,然后会被向下的消息 (9) 相乘,以确定 Jskill 的(近似)后验分布。因此我们的目标将是:让消息 (6)(关于 Jperf)的高斯近似在那些被图中其他部分传来的信息认为更可能的区域上最为精确。然而,正如我们刚刚讨论的,我们需要把近似保持在图中生成该消息的局部区域内。消息 (6) 被发送到节点 Jperf,因此我们可以选择我们的近似,使 Jperf 边缘分布的精度最大化。这通过把消息 (6) 乘以图中同一条边上向下的消息得到,后者可如图 3.22 所示计算。注意,求 Fskill 的后验边缘时也需要这些相同的消息,因此计算它们并不引入额外开销。
图 3.22:计算将用于为消息 (6) 找高斯近似的“上下文”消息。
让我们更详细地考虑因子图中靠近 Jperf 节点的部分,如图 3.23 所示。
(a)
(b)
图 3.23:Jperf 节点周围因子图的细节,展示所涉及的消息:(a) 运行置信传播时;(b) 对来自 GreaterThan 因子的向上消息做局部高斯近似时。
这里 $e$ 表示此前在图 3.20 中所见的精确消息 (6),$c$ 表示向下的“上下文”消息,$g$ 表示我们所需的对消息 $e$ 的高斯近似。这些消息都只是变量 Jperf 的函数。我们已经看到,我们不能简单地用高斯来近似消息 $e$,因为消息 $e$ 具有无穷的均值和方差。相反,我们对 Jperf 的边缘分布做高斯近似。精确的边缘由入向消息之积 $ce$ 给出。因此我们把近似消息 $g$ 定义为:使消息 $c$ 与 $g$ 之积给出的 Jperf 边缘分布是对真实边缘的最佳高斯近似,从而
$$cg = \text{Proj}\left( ce \right). \tag{3.14}$$这里 Proj() 表示“投影”,代表用一个具有相同均值和方差的高斯替换一个非高斯分布的过程。这可以看作把精确消息投影到高斯分布族中“最近”的消息上。两边同除以 $c$,我们于是得到
$$g = \frac{\text{Proj}\left( ce \right)}{c}. \tag{3.15}$$如何做到这一点的数学细节在 Herbrich 等人 [2007] 中讨论。
因此我们如下为精确消息 (6) 找到一个高斯近似。首先我们像之前一样计算精确的输出消息 (6)。它在图 3.24 中以蓝色显示。
图 3.24:蓝色为精确的输出消息 (6),红色为入向的上下文消息 $c$,绿色为这两条消息之积。
然后我们把它乘以入向的上下文消息 $c$(在图 3.24 中以红色显示)。这给出一个分布(在图 3.24 中以绿色显示),它是非高斯的,但是局部化的,因此具有有限的均值和方差,从而可以用一个高斯来近似。这条曲线在图 3.25 中重复出现,图 3.25 还展示了具有相同均值和方差的高斯分布。
图 3.25:绿色为从图 3.24 复制来的、真实置信传播消息与入向上下文消息之积。橙色为对此积的高斯近似,即 Gaussian(140.4, 28.5²)。
最后,我们把这个高斯分布除以入向的高斯上下文消息 $c$,以生成我们的近似输出消息。因为两个高斯之比本身也是一个高斯 [Bishop, 2006],所得的输出消息也将是高斯的,这正是我们最初的目标。对于我们这个具体例子,这条消息是一个均值为 160.8、标准差为 40.2 的高斯。近似消息的计算过程总结于图 3.26。
图 3.26:计算消息 (6) 高斯近似所涉及的步骤。蓝色曲线为精确消息 (6),红色曲线为入向上下文消息 $c$,橙色曲线为真实消息与上下文消息之积的高斯近似,即 Gaussian(140.4, 28.5²)。最后,紫色曲线为橙色曲线除以红色上下文消息的结果,给出 Gaussian(160.8, 40.2²)。这个高斯随后被用作消息 (6)。
我们看到,总体上我们先乘以入向上下文消息,然后做高斯近似,最后再把上下文消息除掉。因此入向消息所提供的证据仅用于确定高斯近似应当在哪个区域上精确,而不会被直接并入近似消息本身。如果我们恰好有一个共轭分布,那么投影运算就没有必要,上下文消息也不会产生任何影响。
既然我们已经为输出消息 (6) 找到了合适的高斯近似,我们就可以继续沿图传递消息,给出相应的近似消息 (7),如图 3.27 所示。
图 3.27:计算 Jskill 更新分布时的消息 (5)、(6) 和 (7)。注意以橙色高亮的消息 (6) 和 (7) 不同于图 3.18 中的精确消息,它们均为 Gaussian(160.8, 40.2²)。
对新的(近似)版本消息 (8) 的计算同样涉及一个高斯与一个高斯的卷积,结果如图 3.28 所示。
图 3.28:计算 Jskill 更新分布时的消息 (8) 和 (9)。注意除了消息 (6) 和 (7),消息 (8)(橙色,Gaussian(160.8, 40.5²))也不同于图 3.19 中的精确消息。
向下的消息 (9) 保持不变,因此我们最终可以把 Jskill 后验分布的高斯近似计算为两个高斯之积,给出最终结果:一个均值为 140.1、标准差为 28.5 的高斯。
这种在消息传递过程中局部近似消息的方法被称为期望传播(expectation propagation,简称 EP),由 Minka [2001] 提出。近似是在因子节点处局部做出的,而且其方式独立于图其余部分的结构。因此,只要每个因子都一致地用所需的分布类型(此处为高斯)发送和接收消息,该技术就可以应用于任意结构的图。期望传播算法总结于算法 3.1,其中与循环置信传播的差异以红色高亮。
算法 3.1:期望传播
输入:因子图、要计算边缘的目标变量列表、消息传递调度、初始消息值(可选)、每条边的近似分布选择。
输出:目标变量的边缘分布。
- 把所有消息初始化为均匀(或初始值,若已提供)。
- 对消息传递调度中的每一条边:发送下面适当的消息——
- 变量节点消息:在其他边上收到的所有消息之积;
- 因子节点消息:计算置信传播消息(见算法 2.1)。乘以上下文消息(在这条边上朝该因子传来的消息)。用矩匹配把它投影到这条边所需的分布类型。把上下文消息除掉。
- 观测节点消息:在观测值处的一个点质量;
- 直到所有消息收敛。
- 在每个目标变量节点处,把所有入向消息之积计算为边缘分布。
……