概率编程与概率机器学习之间有什么区别?

What is the difference between probabilistic programming vs. probabilistic machine learning?

我正在努力思考概率编程的概念,但我读得越多,我就越感到困惑。

我目前的理解是,概率编程类似于贝叶斯网络,只是翻译成用于创建自动推理模型的编程语言?

我有一些机器学习背景,我记得一些机器学习模型也输出概率,然后我遇到了概率机器学习这个术语...

两者有区别吗?或者它们有相似之处吗?

感谢任何可以帮助澄清的人。

我想这两个术语之间有些含糊不清,但我对它们的看法如下:

概率编程它将概率模型表达为生成数据的计算机程序(即模拟器)。

概率模型+编程=概率编程

关于什么构成概率模型(它很可能是某种神经网络)并没有说。因此,我将此词视为:

  1. 更通用
  2. 在应用环境中更频繁地使用(与编程相关)

概率机器学习 是 ML 的另一种形式,它处理预测的 概率 方面,例如该模型不会将输入/输出值视为某些 and/or 点值,而是将它们(或其中一些)视为 random variables. Prominent example of such an approach is Gaussian Process.

My understanding at this point in time is that probabilistic programming is similar to Bayesian networks, just translated into programming language for creation of automated inference models?

没错。概率程序可以看作等同于贝叶斯网络,但是用更丰富的语言来表达。 概率编程作为一个领域提出了这样的表示,以及利用这些表示的算法,因为有时更丰富的表示会使问题更容易

例如,考虑一个概率程序,该程序模拟一种更可能折磨男性的疾病:

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 中及时 constant 提供所需的答案。它还能够提供此结论的解释,使用户更容易理解和洞察。

有人可能会争辩说这种比较是不公平的,因为知识渊博的用户不会按照为显式 O(N) 大小的贝叶斯网络定义的方式提出查询,而是通过利用其简单结构提前简化问题。然而,用户可能没有足够的知识来进行这种简化,特别是对于更复杂的情况,或者可能没有时间去做,或者可能会犯错误,或者可能事先不知道模型是什么,所以她不能像那样手动简化它。概率编程提供了这样一种可能性,即自动

公平地说,大多数当前的概率编程工具(例如 JAGS 和 Stan)不会执行这种更复杂的数学推理(通常称为 提升概率推理) 而不是简单地在等同于概率程序的贝叶斯网络上执行马尔可夫链 Monte Carlo (MCMC) 采样(但通常无需提前构建整个网络,这也是另一个可能的收获) .无论如何,这种便利已经足以证明它们的使用是合理的。