//2014年11月14日
//http://www.crescentmoon.info/?p=817
概率图模型(Graphical Model)是概率论和图论之间的桥梁,概率图模型的基本想法来自模块的概念,即一个复杂系统是由简单的部分所联合而成的。概率论部分告诉我们哪些部分是耦合在一起的,然后提供推断模型的方法,而图论部分给我们一个非常直观的认识,把拥有相互关系的变量看做数据结构,从而导出一般化的方法来解决这个问题。很多经典的多元概率系统,比如混合模型,因子分析,隐含马尔科夫模型,Kalman filter 和Ising model等,从概率图模型的角度来看,都可以看做普遍隐含形成过程的一种实例表现。这意味着,一旦在某个系统上有什么特别的方法发现,就很容易推广到一系列的模型中去。除此之外,概率图模型还非常自然地提供了设计新系统的方法。
在概率图模型中,点代表随机变量,点与点之间边的存在与否代表了点与点之间是存在条件依赖。点与边的组合描绘了联合概率分布的特征结构。假设有N个二元随机变量,在没有任何信息帮助的情况下,联合分布P(X1,…,XN),需要O(2N)个参数。而通过概率图描绘点与点之间的条件关系之后,表示联合分布,所需要的参数会减少很多,这对后面的模型的推断和学习是有帮助的。
概率图模型主要分为两种,无向图(也叫Markov random fields)和有向图(也叫Bayesian networks),前者多用于物理和图像领域,后者多用于AI和机器学习,具体的基本就不多介绍了。下面给出一个简单贝叶斯网络的例子。
这里Cloudy指是否多云,Sprinkler指洒水器是否打开,Rain指是否有雨,
WetGrass指草地是否湿了。
推断(Inference)
推断的主要目的是在知道观察变量的值的情况下估计隐藏变量的值。如果我们观察到生成模型的"叶子",然后可以尝试推断隐藏的原因(diagnosis),反之如果观察到生成模型的“根”,就可以尝试预测它的节点(predicition)。
使用的方法就是贝叶斯公式
P(X|y)=P(y|X)P(X)P(y)
其中
X
是隐藏变量,
y
是观察到的值。公式可以这么解释:
posterior=conditional likelihood×priorlikelihood
以前面的图为例,当我们观察到草地是湿的(W=1)时,有可能有2个原因:下雨(R=1)或者开着洒水器(S=1)。我们根据贝叶斯公式求得它们各自的概率
P(S=1|W=1)=P(S=1,W=1)P(W=1)=∑c,rP(C=c,S=1,W=1,R=r)P(W=1)=0.430
P(R=1|W=1)=P(R=1,W=1)P(W=1)=∑c,sP(C=c,S=1,W=1,R=r)P(W=1)=0.708
分母作为归一化常数,同时也是似然
P(W=1)=∑c,s,rP(C=c,S=r,R=r,W=1)=0.6471
可以看到草地湿因为下雨的概率要比因为洒水器的概率高。一般来说在实际情况中,利用后验概率算积分的时候不会像例子这么容易。比如分母
Z
,有可能是指数级别的加和(可以参见 pluskid大神的文章
),而且,在连续型隐藏变量里,很有可能是求一个无解析解的积分。
因为推断的问题一般都比较复杂,我们自然希望能用一些方法来加速推断的过程。
参数消去
根据概率图的结构,我们可以将条件独立的节点的生成概率区分开来写,比如:
P(W=w)=∑c∑s∑rP(C=c,S=s,R=r,W=w)=∑c∑s∑rP(C=c)×P(S=s|C=c)×P(R=r|C=c)×P(W=w|S=s,R=r)
参数消去算法的主要目的就是尽量可能的合并子项来减少计算量,我们将上面的式子化为:
P(W=w)=∑cP(C=c)×∑sP(S=s|C=c)×∑rP(R=r|C=c)×P(W=w|S=s,R=r)
可以看到第三项与前两个求和项无关。这样我们可以得到合并之后的图:
如果概率图比较复杂,存在重复统计的情况,我们可以使用动态规划算法来避免重复的计算。如果概率图是无环的(比如一棵树),可以用局部信息传播算法(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方法分类(见下图):
还有一个区别在于,我们的目标在于寻找一个最有可能的模型(点估计),还是在所有可能的模型上做贝叶斯估计。在结构已知的时候,贝叶斯参数估计和推断是等价的,这时候隐藏的节点就代表了这些参数。如果结构未知,还要有对概率图结构的学习过程。
Known structure,full observability
这种最简单,因为结构已知,变量全部都观察到了,所以直接求极大似然值(MLE)就好了。令数据为D={D1,…,DM},那么似然为
L=1Mlog∏m=1MP(Dm|G)=1M∑i=1n∑m=1MlogP(Xi|Pa(Xi),Dm)
这里
Pa(Xi)
是
Xi
的父亲节点。我们依据概率图的结构分解整个似然式子,然后独立地最大化每个参数。以之前的图为例,我们有
PML(W=w|S=s,R=r)=#(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)=E#(W=w,S=s,R=r)E#(S=s,R=r)
这里
E#(e)
就是在当前参数下,事件
e
发生次数的期望值。这个期望可以由单次发生事件
e
的期望多次加和得到。
E#(e)=E∑mI(e|Dm)=∑mP(e|Dm)
这里
I(e|Dm)
是个指示函数,当事件
e
在第
m
个数据时发生为1,其余都为0。得到期望值后,我们可以重新最大化参数,然后重新计算期望,反复迭代达到一个局部的最优解。
Unknown structure,full observability
这种情况虽然我们可以观察到概率图中每个节点的数据,但是节点与节点之间的边关系未知。完全图能够给出最大的似然值,那是因为这种情况最复杂,含有最多的参数,很明显过拟合了。
为了解决过拟合的问题,我们可以加上对模型选择的先验条件,使用贝叶斯公式最大化后验
P(G|D)=P(D|G)P(G)P(D)
求log我们得到
L=logP(G|D)=logP(D|G)+logP(G)+c
这里
c=−logP(D)
是个与模型
G
独立的常数。如果先验偏向于简单的模型,那么
P(G)
就能对复杂模型起到惩罚作用。事实上就算先验不这么做,使用贝叶斯原理计算的边缘似然(marginal likelihood)
P(D|G)=∫P(D|G,θ)P(θ|G)dθ
(
θ
为模型的参数)能够自动地倾向解释数据的最简单模型,如果模型参数太多的话,它只能在一个很宽的数据范围内预测,而没办法给小范围数据一个很大的发生概率(也就是说复杂模型更可能“对”,但是不够“准”),而简单模型刚好反之。这个现象被叫做奥卡姆剃刀(Ockham'razor)。
尽管我们可以通过上面那个
L
来衡量模型的好坏(被称作Bayesian Score),我们依然还是需要一个方法来寻找得分最高的概率图。穷举的复杂度是超指数级别的,所以我们一般用一些局部的搜索算法(比如多重启的爬山法)或者划分区域来搜索图空间。另外地,由于我们求的是模型生成数据的后验概率
P(G|D)
,我们可以直接从这个后验概率分布中抽样一些图出来,这叫MCMC search。
Unknown structure,partial observability
最后也是最难的情况,就是图结构未知,而且存在隐藏变量。这导致了边缘似然非常难求,需要对隐藏变量Z积分才能得到。
P(D|G)=∫ZP(D,Z|G,θ)P(θ|G)dθ
一种办法是做拉普拉斯近似(Laplace Approximation),计算得到
logP(D|G)≈logP(D|G,θG^)−d2logM
这里
M
是样本个数,
θG^
是参数的最大似然估计(由EM算法得到),
d
是模型的维度(在全观察到的情况下,模型维度等于自由参数的个数,在存在隐藏变量的情况下,模型维度会少于参数个数)。这个式子被叫做Bayesian Information Criterion,和Minimum Description Length (MDL) 是等价的。
式子的第一项就是似然,而第二项减去一个代表模型复杂度的量,所以BIC score是对复杂模型有惩罚的。尽管BIC是可以分解的(decomposable),局部的搜索算法还是非常昂贵,因为我们每一步都要跑一次EM 算法来得到θ。一种可选的办法是在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/