有个比较有意思的想法是编码理论的反问题是 machine learning,这也是这部分学习的一个收获。这个其实很奇怪,编码理论其实是有 ground truth 的,然后通过编码产生“冗余”,这样才能通过含有噪声的信道后仍然能够被正确的解码(比较好的是相关的理论上界和最优编码已经非常接近了),这个问题的本质其实也是 inference。那为什么我说 machine learning 是它的反问题呢?我们通常会假定数据本身具有“结构”,尽管我们看到的数据是来自某个高维的空间,但是往往有某些内在的东西能够简化我们的模型、表示等等。这意味着我们假定数据是“冗余”的,我们寻求的往往是没有冗余的表示,在这个基础上我们的分类也好还是别的什么会有较好的效果,难度在于我们没有 ground truth。这两者的关系看起来就跟概率论与统计一样。这一方面也激发了我后面看完这部分,希望能扫一遍 David McKay 的那本书的欲望。
这部分本质上是一个比较大的 topic,message passing/belief propagation,每个人的讲法可能不大一样,当时大概先看的 Jordan 的写法觉得有点难懂,这次 Koller 同志的 video 倒是比较容易让人接受(先讲 general case 的 LBP 算法,点出一些核心的性质,然后在特定的图上说明对应的的确是精确解,获得该算法与 independency、消元法之间的关系,然后回到一般情况下介绍一些思路进行优化和推广),不过似乎她的书上并不是这个顺序讲述的。我们这里沿用她书上的思路。
前面讲了消元法(variable elimination,简写为 VE),我们这里将每一步分解:首先我们选择了某个 r.v.s 进行消除,这时我们做的是将相关的 factor 放在一起,我们将这个 factor 记为 (这部分是 product),这时我们通过 sum/integral 得到了一个新的 factor 记为 ,那么我们不断的消元过程中就会得到一系列的 ,而我们可以将其与一个 graph 关联起来,这就是所谓的 cluster graph。
cluster graph 的每个顶点是一个随机变量的子集(记为 ),这个graph 与一个 factorization 相关,我们称这个性质为 family preserving,即每个顶点对应的子集必须可以用若干个 factor 对应的 r.v.s 获得,且每两个顶点不共用 factor,且任意一个 factor 必须属于某个顶点。这里顶点之间的边我们称为 sep set(记为 ),对应的也是一个随机变量子集,且 。
事实上给定一个 factorization 可以有多个 cluster graph,而 VE 导致的 cluster graph 却有着重要的作用:我们在 和 之间有边,当且仅当 (即 消掉某个变量后的 message)用来计算了 。这样一来我们每个节点 最多存在一个(如果当成有向关系的话)父节点,这说明获得的图是一个 tree。我们将最后一个获得的 cluster 称为这棵树的根节点。这里我们说明了 VE 可以诱导出 cluster graph 的一个特例,即 cluster tree。
一般的 cluster graph 未必是 tree,但是后面的讨论,特别是所谓的 running intersection property(RIP)成立情况下,我们的算法可以推广,这部分将在后面的笔记详细讨论,这将导致所谓的 loopy belief propagation(LBP)以及 approximate inference。
RIP 一个 cluster graph 具有 RIP 当且仅当对任意 r.v.,,则 会出现在连接 与 的(唯一)路径上每一个顶点和 sep set 里。
定理 VE 所诱导的 cluster tree 满足 RIP。
由于现在已经是一棵树了,所以这条连接 与 的路经一定存在且唯一,我们只需要说明 出现在这条路径上了。我们可以借助另外一个 clutser,即 被 eliminate 掉的,不妨设为 ,这样我们可以证明 到 的路径上都含有 ,这是因为 在到达 之前不可能消失,之后不可能存在。所以这个结论其实非常显然。同时我们也可以断言 也必须存在于中间的 sep set 中(即对应的 里)。这也告诉我们其实 ,这告诉我们可以将 当做是 发送给 的 message。
clique tree 我们称一个 factorization 导致的 cluster tree 如果满足 RIP 为一个 clique tree,类似的名字还有 junction tree 和 join tree。
关于 RIP 的另一个重要的结论是与 independency 的关系:一个 cluster tree 满足 RIP 当且仅当 ,由于我们是在 MRF 里面讨论的(BN 可以通过 moralization 转换成对应的 MRF),这等价于要求 能够分离 与 。
至此为止我们对 clique tree 的理解还停留在 VE 所需要的结果上(VE 能做一个/组 variable 的 inference query),我们其实能够借助 clique tree 解决更多的问题,比如我们花两倍的计算代价就能计算任意一个/组 variable 的 inference query 了!这个工具就是前面抽象出来的 message,那个地方我们是按照 upstream 的方向(也就是 VE)计算了 发送给 的消息,即 ,事实上我们如果逆转按照 downstream 的方向计算相应的 message 之后我们就会有很多新的发现。这仍然将我们的算法局限在 VE 的基础上,我们下面抛开 VE。
我们将 upstream 的逻辑整理一下,一个具有多个 child 的节点只有收到了所有的 child 的 message 才可能继续它自己的 elimination;换言之对于(无向图)每一个 cluster 收到了其他相邻的 cluster 的 message 之后就可以向尚未收到信息的那个发出消息:
像叶子节点由于只有一条边,所以对上一级发出的消息就是 将不必要的变量 sum out。这就是所谓的 sum-product message passing。我们可以为每个 cluster 定义所谓的 belief(从有向情况下的 root 来看,它收到了所有的 message 后),
不难猜测 即为对应的 margin distribution。可以证明这个策略的确能够得到我们需要的效果,这只需要我们证明每个 message 是什么
这里 表示边一侧的所有相关的 r.v.s,而 是这侧 cluster 相关的 factor 的并集。
calibration 如果一个 cluster graph 的两个相邻的 cluster 获得的 belief 对 sep set 是一致的,我们称这个 belief 是 calibrated。
首先我们说明一下这个的必要性,这相当于保证不同的 cluster 在 shared r.v.s 的 margin 至少是 agree with each other 的,没有矛盾。下面我们会发现我们的算法给出的 belief 的确是 calibrated:这我们只需要证明 。
有了这些结果之后我们可以给出不使用 参数化原分布的另一种参数化形式,这个形式依赖于所有的 margin,即这里的 beliefs 和 ,我们可以简单的推导发现
这仍然是一组乘积。事实上,对于 calibrated clique tree 而言两者相等,当且仅当每个 belief 正比与 margin。这样做参数化的好处是在于对应的 message passing 要更为“随意”。初始情况下 就是对应的 ,而 ,从 向 发送消息不需要等候,而只需要计算 $sigma_{i o j} = sum_{C_i – S_{i, j}} eta_i$,然后更新 ,然后 即可,每条边两个方向走一遍即可(似乎有点不对 -,-b)。这个策略称为 belief update,sum-product-divide message passing scheme 或者 Lauritzen-Spiegelhalter 算法。
下面我们讨论如何利用 message passing/belief propagation 解决 inference query。如果 query 是有 evidence,我们需要将部分相关的 message 重新计算一下;如果 query 的变量在一个 clique 里面我们显然可以用对应的 belief 进行 elimination 得到需要的结果;如果 query 的变量在两个 clique 里面,我们可以选择一个子树包含所有 query 中的 r.v.s.,然后将这个子树里面的 belief 和 message 转换(首先随便选一个作为根节点,用对应的 与父节点传递的消息除一下)成为一个新的 factor graph,在这里面做消元法。
最后我们讨论如何构造 clique tree,显然前面 VE 的一些 trick 可以使用(一般 VE 的结果还可以剪枝,即将全部是子集的 path collapse 掉),另外一种思路是从 chordal graph(记得 induced width 决定了复杂度),在这种 graph 上的 maximal clique 问题是容易的,我们只需要按照前面的 maximal cardinality 做法就能找到了。
——————
And Abimelech said to Abraham, What saw you, that you have done this thing?