贝叶斯网络中四种近似推理方法 CS188 Note15 学习笔记

发布时间:2026/5/28 0:57:27

贝叶斯网络中四种近似推理方法 CS188 Note15 学习笔记 强烈推荐的更好的阅读体验问题引入我们在Note14中提及到了两种解决计算条件概率P ( Q 1 … Q k ∣ e 1 … e k ) P\big(Q_1 \ldots Q_k \mid e_1 \ldots e_k\big)P(Q1​…Qk​∣e1​…ek​)的方法,分别是Inference by Enumeration和Variable Elimination,这两种方法我们叫做精确推理(Exact_Inference)在面临网格结构复杂还有变量众多的情况下其计算量会变得巨大。所以说我们就引入了一种近似推理的方法–Sampling通过牺牲精度来换效率。这种方法我们叫做 (Approximate_Inference)Prior Sampling这个方法是在通过拓扑顺序来依次在CPT中随机抽样进而生成一个完整样本。再之后不断重复这个过程出现大量样本后某个事件出现的频率会收敛至它出现的真实频率.每个样本 (x₁, x₂, …, xₙ) 被抽中的概率正是网络的联合概率 P(x₁, x₂, …, xₙ)因为生成过程就是按照联合概率的分解(Chain rule)依次采样。它的缺点也很明显在面临计算条件概率的问题时会浪费大量的样本进而导致效率十分低下。如果样本很少时又不能覆盖所有的情况这里提醒一句在Bayes Net中一定一定不能把概率设为0.0即便这个事件发生的概率很小也应该赋予一个很小的概率值实例上面给定了五个样本我们观察一下求解P ( C ∣ w ) P(C \mid w)P(C∣w)的概率。给定w我们只需要划掉第三个样本剩下四个样本C的概率为3/4即得P ( C ∣ w ) P(C \mid w)P(C∣w)为3/4.这里我们想一个问题给定-w和-r的情况下C的概率为多少很明显五个样本没有这种情况无法回答这个问题。样本只是根据概率分布来随机抽取有时候能完美覆盖我们所需要的问题有时候又没有我们需要的样本。如果我们需要的情况足够罕见那么我们很有可能很长时间都找不到这个样本.这是Sampling很明显的缺点Python实现importrandomdefget_t():ifrandom.random()0.99:returnTruereturnFalsedefget_c(t):iftandrandom.random()0.95:returnTruereturnFalsedefget_sample():tget_t()cget_c(t)return[t,c]Rejection Sampling这个方法相比Prior Sampling就改进了一点就是在发现某个变量的取值和已知的evidence有冲突的话直接舍弃当前的样本步骤以查询 P(C | Tfalse) 为例按照拓扑顺序采样先采样 T。如果 T 的值不等于 false即证据要求 Tfalse则拒绝整个样本回到步骤 1 重新开始。如果 Tfalse继续采样 C。最终得到一个符合证据的样本 (Tfalse, C?)。重复多次后统计 C 的取值频率即为 P(C | Tfalse) 的近似。我们仍然需要抛弃我们的大量样本但至少我们避免了在冲突的样本上少花了点算力我个人在考虑这种算法是想到了一个问题在Rejection Sampling中当我发现与evidence不符合的样本的时候我做的行为是直接舍弃这个样本。难道舍弃这种行为不会出现和Likelihood Weighting算法出现的样本不符合概率联合分布的情况吗答案是不会我们观察一下条件概率P ( C ∣ w ) P(C \mid w)P(C∣w),当我们给定w时我们注意的是C出现的频率。Rejection Sampling所做的行为是舍弃掉-w出现的情况不影响给定w下C出现的频率。观察拓扑顺序对这个方便理解一点Likelihood Weighting我们在Rejection Sampling的思想很有参考价值当我们发现一些和evidence不符合的情况立马舍弃样本。但是当我们观测到证据变量的取值概率本身就很小那么就也会产生浪费大量样本的问题。为了解决这个问题我们在这里新增一个方法这个方法成功从根源上解决了产生不符合的样本的情况。当我们发现与evidence不符合的话我们选择保留而不是舍弃。但是如果保留了与evidence相违背的样本生成样本的过程中就不符合联合分布。为了避免样本产生偏离联合分布的情况我们为每个样本引入一个权重的概念权重的计算公式为证据变量还有其在父节点被observed的情况下的乘积这样以来我们对于不合理的样本分配小的权重给合理的样本赋予大权重之所以有样本权重是因为我们操纵的这些节点实际上只有很小的概率能落到我们想要的方向上面这种概率需要在某个方向体现出来所以说就是权重的来源我们对于非证据变量(evidence)投硬币来决定其值来观察其自然结果。对于证据变量我们直接固定其值并根据其父节点在observed的情况下的概率更新权重。Likelihood Weighting不同节点的内在联系我们需要意识到的是因为我们固定evidence是固定出现的evidence相关的条件概率并不会影响这个样本出现的概率。只有evidence之外的节点才会影响该样本的概率。而我们的权重是只有概率节点的条件概率的乘积这两个乘积没有任何交集但它们的乘积就是联合概率我们在这里回顾一下Bayes Net的联合概率计算公式联合概率就是所有节点的条件概率的乘积。假设一个网格A - B - C,假设evidence为C True联合分布为P ( A , B , C ) P ( A ) P ( B ∣ A ) P ( C ∣ B ) \begin{align*} P(A, B, C) P(A)\,P(B \mid A)\,P(C \mid B) \end{align*}P(A,B,C)P(A)P(B∣A)P(C∣B)​其中样本生成概率为P ( A ) P ( B ∣ A ) \begin{align*} P(A)\,P(B \mid A) \end{align*}P(A)P(B∣A)​其中权重为w ∏ evidence P ( e i ∣ p a r e n t s ( e i ) ) P ( C ∣ B ) \begin{align*} w \prod_{\text{evidence}} P\big(e_i \mid \mathrm{parents}(e_i)\big) P(C \mid B) \end{align*}w​evidence∏​P(ei​∣parents(ei​))P(C∣B)​上面二式乘积正为联合概率s a m p l e p r o b × w P ( A , B , C ) \begin{align*} sample\,prob×w P(A, B, C) \end{align*}sampleprob×wP(A,B,C)​伪代码实现Gibbs Sampling我们需要思考一个有关Likelihood Weighting的问题Fire代表火灾Alarm代表警报响他们的网格关系为F - AP(F)F0.01-F0.99FAP ( A ∣ F ) P(A \mid F)P(A∣F)FA0.99F-A0.01-FA0.01-F-A0.99假设我们想了解P ( F ∣ A ) P(F \mid A)P(F∣A),用Likelihood Weighting算法来进行的话我们强制固定A然后在F中投硬币。有99%的概率会出现-F A的样本我们浪费了大量算力来找一个罕见样本F A,这就是我们为什么需要Gibbs SamplingMarkov Blanket首先需要介绍的一个概念是马尔可夫毯一个变量的马尔可夫毯包括它的父节点、子节点、以及子节点的其他父节点。在给定马尔可夫毯的条件下该变量与网络中所有其他变量条件独立。因此重新采样时只需考虑它的马尔可夫毯。步骤Step 0Random initialization随机初始化)一开始完全乱填不看 CPTttrue,ctrue,sfalse,etrueStep 1Repeated local resampling反复局部重采样循环做下面的事情随机挑一个变量比如挑到 S把它“清空”当作 S计算它在当前其它变量取值下的条件分布P ( S ∣ T t , C c , E e ) P(S \mid T t, C c, E e)P(S∣Tt,Cc,Ee)按这个分布重新给 S 抽一个值然后继续挑另一个变量重复同样的过程。伪代码

相关新闻