概率图模型简介

介绍

定义

概率图模型(Graphical Model)是概率论和图论之间的桥梁,概率图模型的基本想法来自模块的概念,即一个复杂系统是由简单的部分所联合而成的。概率论部分告诉我们哪些部分是耦合在一起的,然后提供推断模型的方法,而图论部分给我们一个非常直观的认识,把拥有相互关系的变量看做数据结构,从而导出一般化的方法来解决这个问题。很多经典的多元概率系统,比如混合模型,因子分析,隐含马尔科夫模型,Kalman filter 和Ising model等,从概率图模型的角度来看,都可以看做普遍隐含形成过程的一种实例表现。这意味着,一旦在某个系统上有什么特别的方法发现,就很容易推广到一系列的模型中去。除此之外,概率图模型还非常自然地提供了设计新系统的方法。

在概率图模型中,点代表随机变量,点与点之间边的存在与否代表了点与点之间是存在条件依赖。点与边的组合描绘了联合概率分布的特征结构。假设有\(N\)个二元随机变量,在没有任何信息帮助的情况下,联合分布\(P(X_1,\ldots,X_N)\),需要\(O(2^N)\)个参数。而通过概率图描绘点与点之间的条件关系之后,表示联合分布,所需要的参数会减少很多,这对后面的模型的推断和学习是有帮助的。

概率图模型主要分为两种,无向图(也叫Markov random fields)和有向图(也叫Bayesian networks),前者多用于物理和图像领域,后者多用于AI和机器学习,具体的基本就不多介绍了。下面给出一个简单贝叶斯网络的例子。

QQ截图20140224133640

这里Cloudy指是否多云,Sprinkler指洒水器是否打开,Rain指是否有雨, WetGrass指草地是否湿了。

推断(Inference)

推断的主要目的是在知道观察变量的值的情况下估计隐藏变量的值。如果我们观察到生成模型的“叶子”,然后可以尝试推断隐藏的原因(diagnosis),反之如果观察到生成模型的“根”,就可以尝试预测它的节点(predicition)。

使用的方法就是贝叶斯公式

\[P(X|y)=\frac{P(y|X)P(X)}{P(y)}\]

其中\(X\)是隐藏变量,\(y\)是观察到的值。公式可以这么解释:

\[\text{posterior}=\frac{\text{conditional likelihood} \times \text{prior}}{\text{likelihood}}\]

以前面的图为例,当我们观察到草地是湿的(\(W=1\))时,有可能有2个原因:下雨(\(R=1\))或者开着洒水器(\(S=1\))。我们根据贝叶斯公式求得它们各自的概率

\[P(S=1|W=1)=\frac{P(S=1,W=1)}{P(W=1)}=\frac{\sum_{c,r}P(C=c,S=1,W=1,R=r)}{P(W=1)}=0.430\]

\[P(R=1|W=1)=\frac{P(R=1,W=1)}{P(W=1)}=\frac{\sum_{c,s}P(C=c,S=1,W=1,R=r)}{P(W=1)}=0.708\]

分母作为归一化常数,同时也是似然

\[P(W=1)=\sum_{c,s,r}P(C=c,S=r,R=r,W=1)=0.6471\]

可以看到草地湿因为下雨的概率要比因为洒水器的概率高。一般来说在实际情况中,利用后验概率算积分的时候不会像例子这么容易。比如分母\(Z\),有可能是指数级别的加和(可以参见pluskid大神的文章),而且,在连续型隐藏变量里,很有可能是求一个无解析解的积分。

因为推断的问题一般都比较复杂,我们自然希望能用一些方法来加速推断的过程。

参数消去

根据概率图的结构,我们可以将条件独立的节点的生成概率区分开来写,比如:

\[ \begin{split} &P(W=w) =\sum_c\sum_s\sum_r P(C=c,S=s,R=r,W=w) \\ &= \sum_c \sum_s \sum_r P(C=c)\times P(S=s|C=c)\times P(R=r|C=c)\times P(W=w|S=s,R=r) \\ \end{split} \]

参数消去算法的主要目的就是尽量可能的合并子项来减少计算量,我们将上面的式子化为:

\[ P(W=w)=\sum_c P(C=c)\times \sum_s P(S=s|C=c)\times \sum_r P(R=r|C=c)\times P(W=w|S=s,R=r) \]

可以看到第三项与前两个求和项无关。这样我们可以得到合并之后的图: QQ截图20140224133826

如果概率图比较复杂,存在重复统计的情况,我们可以使用动态规划算法来避免重复的计算。如果概率图是无环的(比如一棵树),可以用局部信息传播算法(Belief Propagation,HMM的Sum-Product算法的泛化版本)来做推断。如果概率图有环就比较麻烦,因为局部信息传播可能会被重复计算,从而导致算法不收敛。这个时候可以用Junction Tree方法把概率图转化成一棵树(可能会很复杂,见pluskid 的例子)。

近似推断

推断算法的时间复杂度是指数级别的(取决于概率图中的最大簇的大小),优化它是个NP-hard 问题,所以就导致了推断的近似方法产生。除了图复杂以外还有另外一个原因,即使图的复杂度很低,如果一些节点是连续随机变量,在很多情况下它们对应的积分是没有解析解的。

流行的近似推断方法主要有三种:

  • Sampling(Monte Carlo) methods。采样做法就是通过抽取大量的样本来逼近真实的分布。最简单的是importance sampling,根据出现的结果的比例采样。在高维空间中更有效的方法叫Markov Chain Monte Carlo,是利用马科夫链的性质来生成某个分布的样本,包括Metropolis-Hastings算法和Gibbs Samppling算法等。

  • Variational Infernece。变分推断采取的是另一种做法,通过限制近似分布的类型,得到一种局部最优,但具有确定解的近似后验分布。最简单的方法叫做mean-field approximation,就是把概率图里的点全部解耦,看做相互独立的,然后对每个点引进一个变分参数,通过循环地迭代参数来最小化近似分布和真实分布的KL距离。

  • Loopy Belief Propagation。之前我们讲到Belief Propagation 算法,是应用在无环的图上的,然后LBP就是不管图有没有环,都直接使用这个算法去求解。

学习(Learning)

Learning可以分很多情况,比如估计参数,或者估计模型的结构,或者两者都有。根据变量是否被观察到和结构是否已知可以对learning方法分类(见下图):

QQ截图20140224134911

还有一个区别在于,我们的目标在于寻找一个最有可能的模型(点估计),还是在所有可能的模型上做贝叶斯估计。在结构已知的时候,贝叶斯参数估计和推断是等价的,这时候隐藏的节点就代表了这些参数。如果结构未知,还要有对概率图结构的学习过程。

Known structure,full observability

这种最简单,因为结构已知,变量全部都观察到了,所以直接求极大似然值(MLE)就好了。令数据为\(D=\{D_1,\ldots,D_M\}\),那么似然为

\[ L=\frac{1}{M}\log \prod^M_{m=1}P(D_m|G)=\frac{1}{M}\sum^n_{i=1}\sum^M_{m=1}\log P(X_i|Pa(X_i),D_m) \]

这里\(Pa(X_i)\)\(X_i\)的父亲节点。我们依据概率图的结构分解整个似然式子,然后独立地最大化每个参数。以之前的图为例,我们有

\[ P_{ML}(W=w|S=s,R=r)=\frac{(W=w,S=s,R=r)}{(S=s,R=r)} \]

这里\((S=s,R=r)\)\((W=w,S=s,R=r)\)分别为下雨而且洒水器开着的次数和满足前两个条件的同时,草地湿了的次数。可以看到极大似然是根据观察到的数据得出最有可能的结果。如果我们有一些训练数据的话,也可以加上先验条件,做最大后验估计(MAP).

Known structure,partial observability

如果结构已知,但是有些节点是隐藏的话,我们可以通过EM算法来寻找一个局部最优的MLE。EM的算法的思想就是求那些隐藏节点的期望值,然后把期望值看做观察到的值。以\(W\)节点为例,我们用期望代替观察到的次数,得到

\[P(W=w|S=s,R=r)=\frac{E(W=w,S=s,R=r)}{E(S=s,R=r)}\]

这里\(E(e)\)就是在当前参数下,事件\(e\)发生次数的期望值。这个期望可以由单次发生事件\(e\)的期望多次加和得到。

\[E (e)=E \sum_m I(e|D_m)=\sum_m P(e|D_m)\]

这里\(I(e|D_m)\)是个指示函数,当事件\(e\)在第\(m\)个数据时发生为1,其余都为0。得到期望值后,我们可以重新最大化参数,然后重新计算期望,反复迭代达到一个局部的最优解。

Unknown structure,full observability

这种情况虽然我们可以观察到概率图中每个节点的数据,但是节点与节点之间的边关系未知。完全图能够给出最大的似然值,那是因为这种情况最复杂,含有最多的参数,很明显过拟合了。 为了解决过拟合的问题,我们可以加上对模型选择的先验条件,使用贝叶斯公式最大化后验

\[P(G|D)=\frac{P(D|G)P(G)}{P(D)}\]

求log我们得到

\[L=\log P(G|D)=\log P(D|G) + \log P(G)+ c\]

这里\(c=-\log P(D)\)是个与模型\(G\)独立的常数。如果先验偏向于简单的模型,那么\(P(G)\)就能对复杂模型起到惩罚作用。事实上就算先验不这么做,使用贝叶斯原理计算的边缘似然(marginal likelihood)

\[P(D|G)=\int P(D|G,\theta)P(\theta|G)d \theta\]

(\(\theta\)为模型的参数)能够自动地倾向解释数据的最简单模型,如果模型参数太多的话,它只能在一个很宽的数据范围内预测,而没办法给小范围数据一个很大的发生概率(也就是说复杂模型更可能“对”,但是不够“准”),而简单模型刚好反之。这个现象被叫做奥卡姆剃刀(Ockham’razor)。

QQ截图20140224134256

尽管我们可以通过上面那个\(L\)来衡量模型的好坏(被称作Bayesian Score),我们依然还是需要一个方法来寻找得分最高的概率图。穷举的复杂度是超指数级别的,所以我们一般用一些局部的搜索算法(比如多重启的爬山法)或者划分区域来搜索图空间。另外地,由于我们求的是模型生成数据的后验概率\(P(G|D)\),我们可以直接从这个后验概率分布中抽样一些图出来,这叫MCMC search。

Unknown structure,partial observability

最后也是最难的情况,就是图结构未知,而且存在隐藏变量。这导致了边缘似然非常难求,需要对隐藏变量\(Z\)积分才能得到。

\[P(D|G)=\int_Z P(D,Z|G,\theta)P(\theta|G)d \theta\]

一种办法是做拉普拉斯近似(Laplace Approximation),计算得到

\[\log P(D|G) \approx \log P(D|G,\hat{\theta_G})-\frac{d}{2}\log M\]

这里\(M\)是样本个数,\(\hat{\theta_G}\)是参数的最大似然估计(由EM算法得到),\(d\)是模型的维度(在全观察到的情况下,模型维度等于自由参数的个数,在存在隐藏变量的情况下,模型维度会少于参数个数)。这个式子被叫做Bayesian Information Criterion,和Minimum Description Length (MDL) 是等价的。

式子的第一项就是似然,而第二项减去一个代表模型复杂度的量,所以BIC score是对复杂模型有惩罚的。尽管BIC是可以分解的(decomposable),局部的搜索算法还是非常昂贵,因为我们每一步都要跑一次EM 算法来得到\(\theta\)。一种可选的办法是在EM的M 步直接做一个局部搜索,得到一个局部最优的BIC score,这个方法被称作Structural EM。

当然,结构学习不仅仅包括寻找已经存在节点的连通性,还包括在必要情况下增加隐藏节点等等更为复杂的东西。

参考文献:

  1. 《An introduction to graphical models》 Kevin P. Murphy
  2. http://freemind.pluskid.org/machine-learning/probabilistic-graphical-model/