概率编程 Probabilistic Programming(with WebPPL)

写在前面,
起初是被概率编程四个字所吸引才切入这个主题,查阅相关资料发现仅仅是蹭热度是不够的,烧脑根本停不下来。
庆幸的是大部分的资源(外国站点)是可以直接访问的,我是不是应该谢谢方滨兴呢。

梗概

概率编程(Probabilistic Programming)是一种系统创建方法,它所创建的系统能够帮助我们在面对不确定性时做出决策[1]。

通俗理解,是通过编程手段完成“猜”这个动作。现实中有两种猜,一种是猜红球白球的游戏,让别人猜我某只手里藏着的是红球还是白球(假设概率是50%)。还有一种情况是我问媳妇明天是晴天还是多云,她需要在没有天气预报的情况下通过向窗外眺望再给我答案。

对于概率编程系统所包含的概率推理,是将我们对某种情况的认识和概率法则结合起来,确定无法观测的决策关键因素。也就是说,天气预报这类活动在一定范围内并不是概率编程需要解决的问题,因为人类已经可以通过精密传感器探测及卫星云图就能推断出数小时至数百小时内的准确气象信息。

也许我更愿意通过概率编程帮我解决“明天可不可以买Apple公司的股票”。

概率推演系统

关键定义

一般知识——不考虑特定情况细节时,对领域相关情况的概括了解。
概率模型——用定量的概率术语编码的领域一般知识。
证据——关于特定情况的具体信息。
查询——您希望知道的情况属性。
推理——概率模型根据证据回答查询的过程。

#系统构成
概率编程系统图

在概率推理中,创建一个模型,以定量的概率术语捕捉领域的所有相关一般知识。
然后,对于某个特定情况,我们将该模型应用于所拥有的具体信息,得出结论。这些具体信息称为证据。
模型、我们所提供的信息和查询答案之间的关系由数学上的概率法则定义。根据证据,运用模型回答查询的过程称作概率推理或者简单地称作推理。

推理方式

概率推理系统有3种方式推理
1. 预测未来的事件。
2. 推断事件的根源。
3. 从过去的事件中学习,更好地预测未来的事件。

概率编程系统

以上提到的概率推演通过编程来实现,就是一套概率编程系统。

关键定义

表示语言——用于编码关于模型领域知识的语言。
表达能力——表示语言编码模型中不同类型知识的能力。
图灵完备——能够表示可在数字计算机完成的任何计算的语言。
概率编程语言——使用图灵完备编程语言表示知识的概率表示语言。

概率编程系统图

通俗释义

在上图中,还是套用了概率推理的系统,实际上用一句话概括就是:
通过输入不同的变量值(证据)来发起查询,系统的推理算法(程序算法)使用概率模型的输出(一些随机值)得到概率结果。

其中概率模型,是一段根据不同输入进行随机输出的程序。从一系列随机选择形成的任何特定执行路径都有特定的结果。每个随机选择都有发生的概率。如果将这些概率相乘,就可以得到执行路径的概率。这样,程序定义了每个执行路径的概率。想象一下,如果将该程序运行许多次,生成任何给定执行路径的次数比例等于其概率。输出的概率就是产生该输出的程序运行次数比例。

概率编程系统的实现——WebPPL

概率编程系统已经有个很多实现。实现列表
我选择了WebPPL
全称就是“网页概率编程语言” 。 文档资源

安装

npm install -g webppl

创建文件

var greeting = function () {
    return flip(.5) ? "Hello" : "Howdy"
}

var audience = function () {
    return flip(.5) ? "World" : "Universe"
}

var phrase = greeting() + ", " + audience() + "!"

phrase

flip: 这是伯努利分布(两点分布)的一种实现,是webppl自带的函数。

关于伯努利分布
– 伯努利试验是只有两种可能结果的单次随机试验,即对于一个随机变量X而言
– 如果试验E是一个伯努利试验,将E独立重复地进行n次,则称这一串重复的独立试验为n重伯努利试验。
– 进行一次伯努利试验,成功(X=1)概率为p(0<=p<=1),失败(X=0)概率为1-p,则称随机变量X服从伯努利分布。伯努利分布是离散型概率分布。

运行

webppl test.wppl

结果

执行5次,结果如下:

Hello, World!
Howdy, Universe!
Hello, World!
Howdy, World!
Howdy, Universe!

以上是Webppl的简单用法。

下一篇将以Demo为例,分析概率编程的方法。

参考

WebPPL官网
数学分布参考

发表评论

电子邮件地址不会被公开。 必填项已用*标注