概率编程语言(PPL)领域正经历着机器学习技术快速发展带来的奇迹般的复兴。在短短的几年里,PPL 已经从一个模糊的统计研究领域发展出十几个活跃的开源方案。最近,麻省理工学院(MIT)的研究人员推出了一种新的概率编程语言 Gen。这种新语言让研究人员在不需要处理方程式和手动编写高性能代码的情况下,编写应用人工智能技术的多个领域的模型和算法。

PPL 是机器学习 pipeline 的常规组件,但其实现仍然具有挑战性。虽然市场上的 PPL 显著增加,但大多数 PPL 仍局限于研究工作,不适用于实际的应用。在 2015 年谷歌开源 TensorFlow 之前,深度学习领域也经历了类似的挑战。使用 TensorFlow,开发人员能够使用一致的框架构建复杂但高效的深度学习模型。从某种意义来说,Gen 正在寻找概率规划的方法,正如 TensorFlow 为深度学习所做的那样。然而,为了做到这一点,Gen 需要在 PPL 的两个关键特征上进行精细平衡。

表达性与效率

现代 PPL 最大的挑战是在建模表达性和推理效率之间取得平衡。虽然许多 PPL 在语法上都很丰富,可以用来表示几乎任何模型,但它们往往支持有限的推理算法,这些算法的收敛速度非常慢。其他 PPL 有丰富的推理算法,但仍然局限于特定的领域,使其不适用于一般的应用。

通用 PPL 应能实现两个基本效率向量:

1)推理算法效率:一个通用的 PPL 应该允许开发人员在不牺牲底层组件性能的情况下创建定制的、高度复杂的模型。PPL 语法的表达性越强,优化过程就越具有挑战性。

2)实现效率:通用 PPL 要求系统运行超越算法本身的推理算法。实现效率由存储算法状态的数据结构、系统是否利用缓存和增量计算等因素决定。

Gen

Gen 通过利用一种新的体系结构来解决前面提到的一些挑战,该体系结构改进了一些传统的 PPL 技术。基于 Julia 编程语言,Gen 引入了一种体系结构,该体系结构将模型表示为图灵完整建模语言中的程序代码,而不是黑盒,它公开了通过公共接口进行推理的功能。这些黑盒称为生成函数,包括具有以下功能的接口:

1.构建模型的工具:Gen 提供多种可交互操作的建模语言,每种语言的灵活性/效率权衡都不一样。单个模型可以组合来自多个建模语言的代码。生成函数利用了非常适合模型和增量计算的数据结构。

2.裁剪推理的工具:Gen 为推理编程提供了一个高级库,仅通过生成函数与模型交互,它实现了推理算法模块的构建。

3.评估:Gen 提供了一个经验模型,用以评估其在已知推理问题中对备选方案的性能。

下图说明了 Gen 的体系结构。可以看到,框架支持差异推理算法,以及基于生成函数概念的抽象层。

使用 Gen

开始使用 Gen 是很简单的事情。可以使用 Julia 软件包管理器安装该语言工具。

pkg> add https://github.com/probcomp/Gen

在 Gen 中编写生成函数和编写带有几个扩展名的 julian 函数一样简单。

@gen function foo(prob::Float64)
 z1 = @trace(bernoulli(prob), :a)
 z2 = @trace(bernoulli(prob), :b)
 return z1 || z2
end

Gen 还包含一个可视化框架,可以用来绘制推理模型并评估其效率。

# Start a visualization server on port 8000 
server = VizServer(8000) 
# Initialize a visualization with some parameters 
viz = Viz(server, joinpath(@__DIR__, "vue/dist"), 
Dict("xs" => xs, "ys" => ys, "num" => length(xs), "xlim" => [minimum(xs), maximum(xs)], "ylim" => [minimum(ys), maximum(ys)])) # Open the visualization in a browser 
openInBrowser(viz)

类似工具推荐

Gen 并不是唯一一种试图解决可编程推理挑战的语言。近年来,PPL 有了许多强大的替代方案:

  • Edward 

Edward 是一种用 Python 编写的图灵完全概率编程语言(PPL)。Edward 最初是由 Google Brain 团队支持的,但现在有了很多的贡献者。Edward 的原始研究论文发表于 2017 年 3 月,自那时起,Stack 在机器学习社区内得到了广泛的采用。Edward 融合了三个领域:贝叶斯统计和机器学习、深度学习、概率编程。该库与 Keras 和 TensorFlow 等深入学习框架无缝集成。

  • Pyro 

Pyro 是 Uber 人工智能实验室发布的一种深层概率编程语言(PPL)。Pyro 建立在 PyTorch 之上,基于四个基本原则:

  1. 通用:Pyro 是一个通用的 PPL,它可以表示任何可计算的概率分布。怎样表示?从具有迭代和递归(任意 Python 代码)的通用语言开始,然后添加随机抽样、观察和推理。

  2. 可扩展:Pyro 可以扩展到大型数据集,手写代码的开销很小。如何做到?通过建立现代黑盒优化技术,利用小批量的数据进行近似推理。

  3. 最小:Pyro 灵活且可维护。如何做到?Pyro 是用一个强大的、可组合的抽象内核实现的。在可能的情况下,可以使用 PyTorch 和其他库。

  4. 灵活:Pyro 的目标是在你需要的时候实现自动化和控制。如何做到?Pyro 使用高级抽象来表示生成和推理模型,同时允许研究人员轻松自定义推理。

  • Infer.Net

微软最近开放了一个为.NET 开发者简化概率编程的框架。微软研究院从 2004 年开始致力于 Infer.net,但直到最近,随着深度学习的出现,该框架才真正流行起来。Infer.net 的强大优势,使得它成为开发人员冒险进入深度 PPL 领域的有力选择。

Gen 是 PPL 中最新但也是最有趣的一个添加项。统计与深度学习相结合是人工智能未来发展的关键要素。像 Gen 这样的尝试正努力试图使 PPL 通用化,就像 TensorFlow 对深度学习所做的那样。

gen语言的更多相关文章

  1. Apache Thrift 的魅力

    WhyApacheThrift 因为最近在项目中需要集成进来一个Python编写的机器学习算法,但是我的后端主要使用的是SpringCloud技术栈. 于是面临着异构语言之间的通信实现方式的抉择. 因 ...

  2. Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...

  3. Golang通过Thrift框架完美实现跨语言调用

    每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...

  4. Apache Thrift 跨语言服务开发框架

    Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 ...

  5. 直接修改.NET程序集 LLBL Gen 2.x-4.x 许可授权方法研究

    做数据库开发,如果要用ORM,LLBL Gen是一款优秀的框架和工具,目前最新版本是4.0.同时也推出了Lite免费版本,与Visual Studio的Express版本一样, 免费,但是它仅仅只支持 ...

  6. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  7. Apache Thrift - 可伸缩的跨语言服务开发框架

    To put it simply, Apache Thrift is a binary communication protocol 原文地址:http://www.ibm.com/developer ...

  8. C# 语言规范_版本5.0 (第10章 类)

    1. 类 类是一种数据结构,它可以包含数据成员(常量和字段).函数成员(方法.属性.事件.索引器.运算符.实例构造函数.静态构造函数和析构函数)以及嵌套类型.类类型支持继承,继承是一种机制,它使派生类 ...

  9. locale命令设置语言环境

    locale命令设置语言环境 在Linux中通过locale来设置程序运行的不同语言环境,locale由 ANSI C提供支持.locale的命名规则为_.,如zh_CN.GBK,zh代表中文, CN ...

随机推荐

  1. Window10安装linux

    准备材料:安装虚拟机工具 VMware-workstation-full-12.5.5-5234757.exe 虚拟机CentOS   CentOS-7-x86_64-DVD-1511.ios或者Ce ...

  2. dosbox+masm5.0编译汇编文件

    在去年写过如何bc3.1编译ucos,不过现在很少去用到,但是那是用dosbox也是懵懵懂懂的,参见https://blog.csdn.net/liming0931/article/details/8 ...

  3. DVWA命令注入扣动分析

    本周学习内容: 1.学习web应用安全权威指南: 2.观看安全学习视频: 实验内容: 进行DVWA命令注入漏洞 实验步骤: Low 1.打开DVWA,进入DVWA Security模块将 Level修 ...

  4. JS基础_自增和自减

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 【转】根据Quartz-Cron表达式获取最近几次执行时间

    public static List<String> getRecentTriggerTime(String cron) { List<String> list = new A ...

  6. lixuxmint系统定制与配置(3)-字体

    小书匠Linux 有些系统自带的字体实在太难看了,看起来不清晰,不明确,有一个好的字体,可以带来好心情,并提高工作与效率. 1.常用中文字体 文泉驿微黑,微软雅黑,思源黑体 2.字体安装 2.1检查已 ...

  7. leetcode 712

    这道题的思路:我是根据最长公共子序列的思路得来的. 最长公共子序列是: d[i][j]表示字符串s1前i个(0-i-1)字符,和字符串s2前j个(0-j-1)字符的最长公共子序列. 分情况讨论: 当s ...

  8. CodefChef September Challenge 2019 题解

    传送门 \(CHEFK1\) 首先连出一个环和所有的自环,剩下的每次按\(n\)个一连就可以了 //quming #include<bits/stdc++.h> #define R reg ...

  9. Luogu3774 [CTSC2017]最长上升子序列 【Young表,根号分治】

    题目链接:洛谷 推荐阅读:2019年集训队论文<浅谈杨氏矩阵在信息学竞赛中的应用> 首先我们来看一个东西,叫做Young表. 它是长一个阶梯状的东西(行长和列长都是递减的),并且每一行和每 ...

  10. 代码还原,IDA中使用的宏

    在IDA7.0中的定义文件拷贝的. 如果想使用,直接去IDA的plugins插件目录下.包含它的 **defs.h"" 如下: /* This file contains defi ...