我试图把注意力集中在概率编程的概念上,但是我读的越多,我就越感到困惑。
我目前的理解是,概率编程类似于贝叶斯网络,只是被翻译成用于创建自动推理模型的编程语言?
我在机器学习方面有一定的背景,我记得一些机器学习模型也可以输出概率,然后我遇到了概率机器学习一词...
两者之间有区别吗?还是类似的东西?
感谢任何可以帮助澄清的人。
答案 0 :(得分:2)
我猜这两个词之间有些含糊,但我对它们的看法如下:
概率编程将概率模型表示为生成数据的计算机程序(即模拟器)。
概率模型+编程=概率编程
没有任何关于组成概率模型的信息(它很可能是某种神经网络)。因此,我将此术语视为:
概率机器学习 是ML的另一种形式,它处理预测的概率方面,例如该模型不会将输入/输出值视为某些和/或点值,而是将它们(或其中的一些)视为random variables。这种方法的突出示例是Gaussian Process。
答案 1 :(得分:0)
我目前的理解是,概率编程类似于贝叶斯网络,只是被翻译成用于创建自动推理模型的编程语言?
是正确的。概率程序可以看作等效于贝叶斯网络,但是用更丰富的语言表示。 概率编程作为一个领域提出了这样的表示形式,以及利用这些表示形式的算法,因为有时更丰富的表示会使问题变得更容易。
例如考虑一个概率模型,该模型模拟了一种更可能折磨男人的疾病:
N = 1000000;
for i = 1:N {
male[i] ~ Bernoulli(0.5);
disease[i] ~ if male[i] then Bernoulli(0.8) else Bernoulli(0.3)
}
此概率程序等效于以下贝叶斯网络以及相应的条件概率表:
对于诸如此类的高度重复的网络,作者经常使用标牌符号使它们的描述更加简洁:
但是,标牌符号是用于人类可读出版物的设备,而不是与编程语言相同的形式语言。此外,对于更复杂的模型,标牌符号可能会变得更难以理解和维护。最后,编程语言还带来了其他好处,例如原始操作使表达条件概率更容易。
那么,这仅仅是一个方便的表示形式吗?不,因为更抽象的表示形式包含了更多可用于改善推理的高级信息。
假定我们要计算N
个患病个体中人数的概率分布。一种简单而通用的贝叶斯网络算法必须考虑对2^N
变量进行大量disease
分配的组合才能计算出答案。
然而,概率程序表示法明确表明,disease[i]
和male[i]
的条件概率对于所有i
都是相同的。推理算法可以利用该算法来计算disease[i]
的边际概率,该边际概率对于所有i
都是相同的,它使用以下事实:患病人数将是二项分布B(N, P(disease[i]))
,并且在N
中的恒定时间内提供所需的答案。它还可以提供此结论的解释,使用户更容易理解和理解。
一个人可能会说这种比较是不公平的,因为有知识的用户不会提出针对O(N)大小的贝叶斯网络的明确定义的查询,而是通过利用其简单的结构提前简化了问题。但是,用户可能没有足够的知识来进行这种简化,尤其是对于更复杂的情况,或者可能没有时间这样做,或者可能犯了错误,或者可能事先不知道模型是什么,所以她无法像这样手动简化它。概率编程可以自动 进行这种简化。
公平地说,大多数当前的概率编程工具(例如JAGS和Stan)不会执行此更为复杂的数学推理(通常称为提升概率推理),只需在贝叶斯网络上进行等效于概率程序的马尔可夫链蒙特卡洛(MCMC)采样即可(但通常无需事先构建整个网络,这也是另一个可能的收益)。在任何情况下,这种便利性都不能证明其用途合理。