绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
科普篇:贝叶斯网络中的置信度传播
2019-08-19 09:50:31

在本文中,我将使用置信度传播算法(BP)和一些示例数据。开始本文之前我默认您是了解贝叶斯网络的(BN),这篇文章解释了如何计算BN中不同变量的置信度,这有助于推理。

置信传播

我在GitHub上创建了一个包含BP代码的存储库「链接」,我将用它来解释算法。

首先,想象我们有一个多树,这是一个没有循环的图形。例如,下图中描绘的图表。我们有4个变量“雨”、“洒水器”、“福尔摩斯”、“华生”与定向边缘“雨”到“福尔摩斯”,“雨”到“华生”和“洒水器”。贝叶斯网络描绘了福尔摩斯和华生成为邻居的故事。一天早上福尔摩斯走出家门,发现草地是湿的。有两种情况,一种是下雨,一种是忘了关掉喷水器。所以,他去看邻居华生,看看他的草地是不是也湿了,当他看到它确实是湿的时,他很确定他没有忘记关洒水器,只是下雨了。那么,是信息从华生流向了洒水器,这种信息流用的是贝叶斯网络中的BP算法建模。

在BP中,我们让变量相互交谈,以交换彼此的信念。有两种方式:从父到子的消息以及从子到父的消息。总的来说,我们只需要使用5个公式来计算BP。在我的解释中,我会对某些公式和变量使用不同的名称,因为我发现一些来源相当具有误导性。

1.可能性

可能性包含有关儿童观察的信息,例如:没有观察到的福尔摩斯的草地是湿的可能性是1和不是湿的可能性是1。如果观察到湿草地,则湿润的可能性变为1,非湿润的可能性变为0,明显,这些单位矢量未标准化。

似然函数是来自变量子元素的所有传入消息的乘积

似然函数基本上是变量子节点发送的所有传入消息的乘积。它返回包含变量的每个可能值的似然值的似然向量。在“下雨”的情况下,它的基数为2,表示“是”和“否”两个状态。

如果变量没有子节点,因为它是图形中的叶节点并且未被观察到,则其似然向量将是单位向量,所有可能值都是1,例如,因为我们在开始时没有观察到福尔摩斯的草地,我们将其似然向量分别设置为[1,1],分别为“不湿”和“湿”。

在Python(numpy)代码中,它看起来是这样的

def likelihood(self):

incoming_children_messages = np.array([

c.message_to_parent(self)for c in self.children

])

return incoming_children_messages.prod(axis = 0)

2.先验

先验是在开始时已知的某些事件的概率,例如下雨概率为20%。如果先验未知,则由以下公式计算。它有点复杂,但我会尝试一下。先验为您提供了相应变量的无条件概率。因此,我们还需要包括条件句。

先验概率函数是父值的所有可能组合乘以相应输入消息的乘积的总和

条件概率也在我们的例子中给出。在该式中,“P(X | W)”与之对应。此外,我们需要使用来自所有父节点的传入消息,即公式中的“φ”。索引显示了消息的方向 - 从父变量“K”到当前变量“X”。使用这两部分(条件概率和来自父的消息),因为它们都提供有关变量概率的信息。一方面,我们看到给定父值的概率,另一方面,我们看到了他们的信息。没有观察,这些信息与父母的先验相对应。因此,这里,我们计算“X”的边缘值并摆脱了条件变量。

对于每个父母的消息,在条件概率中都存在一个对应的部分。因此,我们可以使用条件概率表(在此片段中为self.m)为每条消息执行点积。m在这个片段中。

3.置信度

置信度是我们观察到某些事件后的后验概率。它基本上是可能性和先验的标准化乘积。

信念是可能性和先验的标准化乘积

我们利用我们事先所知的概率,并从孩子们那里获得新知识。这样,我们就产生了一个关于变量的新的信念。如果一个变量同时具有父和子,则该信念是包含来自下方和上方的信息的更新概率(后验)。因此,每个传入的消息都被考虑在内。 “α”是一个常数,因为似然和先验的乘积可以总和大于1。这是具有变量的所有可能状态之和的除法的一种简写形式。

在这个Python片段中,规范化部分变得更加清晰。

4.传信息给父节点

为了计算变量的可能性,我们需要考虑来自变量子节点的所有传入消息,这些消息由似然函数中的lambda表示。

这个公式很混乱,但在查看一些Python代码时更容易理解。一般来说,我们从P(X | U)边缘化K,而X是发送者(子),K是接收者(父),U是X的父母,包括K。如果我们想象X的条件概率表,对于每个条目,我们采用父母的相应激活,并将各自的输入消息φ乘以各自的传入消息ϕ而不是K本身。然后,我们将该值乘以X的似然性。后,我们将所有具有相同K值的值相加,并留下一个向量,即从X到K的消息。

因此,向父母发送的消息会考虑所有传入的消息,不管这些消息是由儿童还是父母发送的(接收消息的父母除外),并考虑给定某些父母的值的概率。因此,具有高概率的变量设置比低概率更容易转发传入消息。传入消息按该消息设置的条件概率进行评级。

我希望Python代码能够进一步澄清它。

或者以福尔摩斯为例:

5.给子节点的信息

计算由父发送给子的信息存在两种方式。要么将从其他子节点接收到的所有消息与当前节点的先验信息相乘,要么将当前节点的信念除以对应子节点给父节点的消息。

我们将这个公式称为Kappa,索引告诉我们消息的方向(从X到K)。

如果我们看一下这个信念的公式,我们就会发现这个公式是可能性和先验的乘积。然而,可能性是所有传入消息的乘积。因此,信息除以来自K的传入消息导致所有传入消息的产物,除了我们除以的消息和先前的消息。这样,我们可以解释计算Kappa的两种方式之间的相等性。给孩子的信息背后的直觉类似于给父母的信息。您将考虑所有传入的消息(因此请考虑您可以获得的所有信息)并将聚合发送到下一个节点。

alpha再次成为一个归一化常数。如果父节点只有一个子节点,则它无法从其他子节点收集消息,因为没有子节点。因此,它只会返回其先验值。

使用我在开始时提到的我的存储库,我们现在可以使用Holmes示例并计算不同情况下的信念。

为了使用该库,我们需要将它与NumPy库一起导入。

我们导入了存储库的Node类,它表示BN中的单个节点。在下一步中,我们实际创建表示单个概率变量的节点:“福尔摩斯的草地是湿的”,“雨”,“忘记关洒水器”和“华生的草地是湿的”。创建节点时,您必须提供一个名称。之后您需要设置一些属性,如基数和先验,或存在的可能性。

对于没有子节点,这是直接明了的。对于其他节点,它们确实有父节点而没有先行节点,我们需要定义一个条件概率表(CPT),它定义了给定来自父节点的所有可能输入的变量的概率。该CPT在代码中称为“m”。

正如您所看到的,“m”在矩阵的维中获取父项的值,在后一个中获取实际变量的值,例如: (代码注释中的“此处”)草被弄湿的概率(1)如果没有下雨(0)并且洒水器被遗忘(1)是0.9。草湿的可能性是1,1,这意味着两种状态具有相同的可能性。

接下来,我们必须连接节点以定义因果关系。 Node类有一个名为“add_parent”的方法,它可以将变量连接到父变量。

在接下来的步骤中,我们假装福尔摩斯的草地是湿的(因此,可能[0,1])。然后,我们想知道华生的草地是否也是湿的(或者它是否有可能被弄湿)。

我们看到华生的草地确实趋于变湿(0.21对0.79)。因此,BN预计华生的草地会变湿,因为在雨这个节点上有联系,通过雨节点来传播信仰。

结论

BN的工具集在以下推理案例中非常有用,如下所示。我对整个因果推理研究领域感到非常兴奋,并认为在深度学习和一般人工智能方面也会取得很多进展。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

人工智能的世界
创建时间:2020-06-15 14:31:10
人工智能那点事儿
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~