近日,在提交编程语言设计与实现大会(PLDI)的一篇论文中,MIT 研究人员介绍了一种全新的概率编程系统 Gen。从计算机视觉到机器人和统计,用户可以通过 Gen 为应用 AI 技术的多个领域编写模型和算法,且无需处理方程式或手动编写高性能代码。此外,Gen 还允许研究人员编写用于预测任务的复杂模型和推理算法,这在之前是不可能做到的。
例如,3-D 人体姿态是一项困难的计算机视觉推理任务,在自动系统、人机交互和增强现实(AR)中均有应用。在论文中,研究人员展示了简短的 Gen 程序如何推理 3-D 人体姿态。
看起来十分简单,但在后台,该程序包括执行图形渲染、深度学习和概率模拟类型的组件。与一些研究人员所开发的早期系统相比,这些不同技术的结合可以提高这项任务的准确性和速度。
论文图 6:人体姿态推理任务的建模、推理代码以及评估结果。模型使用静态 DSL 编写,调用图形引擎从姿态参数中渲染深度图像。自定义提议结合静态 DSL 和 TensorFlow DSL,通过深度神经网络来传递观察到的深度图像,并提出姿态参数。
研究人员表示,由于其简单性,从新手到专家,Gen 可以被任何人轻松使用。「这项工作的一个动机是让计算机科学或数学专业知识较少的人更容易做自动化人工智能,」论文第一作者、电气工程和计算机科学系博士生 Marco Cusumano-Towner 说。「我们还希望它能提高生产力,这意味着专家可以更轻松地快速迭代 AI 系统,做出原型。」
研究人员还展示了 Gen 通过使用其他 Gen 程序简化数据分析的能力,该程序可自动生成通常由专家用于分析、解释和预测数据中基础模式的复杂统计模型。这种能力建立在研究人员先前工作的基础上,也就是让用户可以编写几行代码来发现对金融趋势、航空旅行、投票模式以及疾病传播的洞见。但不同的是,早期系统需要大量的手动编码才能进行准确的预测。
「Gen 是第一个足以涵盖计算机视觉和数据科学中不同案例的灵活、自动化、高效的系统,且性能非常好。」MIT 脑与认知科学系(Department of Brain and Cognitive Sciences)的研究员 Vikash K. Mansinghka 说,他负责运行概率计算项目。
集自动化、灵活性和速度优势于一身
2015 年,谷歌开源 TensorFlow 以来,它已经成为了最为流行的深度学习框架。然而,即使 TensorFlow 足够自动化和高效,但它只侧重于深度学习模型,对范围更广的人工智能而言,这些模型既昂贵又有限。
如今,业内已经有大量的 AI 技术,例如统计和概率模型、模拟引擎等。一些概率编程系统虽然足够灵活,可以覆盖到多种 AI 技术,但运行不够高效。
研究人员寻求的是集其所长于一身:自动、灵活、快速。Mansinghka 说,「如果我们能做到这一点,或许就能向 TensorFlow 对深度学习那样,有助于民主化更广泛的模型和推理算法。」
在概率性 AI 中,推理算法会对数据执行操作,并基于新数据连续地调整概率,从而最终做出预测。
借鉴了早期概率编程系统 Church 中的概念,研究人员将几种自定义建模语言结合到 Julia 中,每种建模语言都对不同类型的 AI 建模方法进行优化,使其更加通用。利用优化、变分推理、某些概率方法以及深度学习等各种方法,Gen 还为推理任务提供了高级基础结构。
外部机构就 Gen 与 MIT 展开合作
外部用户已经在寻找利用 Gen 进行 AI 研究的方法。例如,英特尔与 MIT 合作,将 Gen 用于机器人和 AR 系统,尤其内部基于深度感知摄像头的 3D 姿态估计。MIT 林肯实验室(Lincoln Laboratory)也在合作开发 Gen 在人道主义救援和灾害应对空中机器人中的应用。
在 MIT 追求人工智能的环境下,Gen 开始被用于野心勃勃的 AI 项目中。例如,Gen 对 MIT-IBM 沃森人工智能实验室以及美国国防部先进研究项目局(Department of Defense』s Defense Advanced Research Projects Agency)正在进行的「机器常识」项目极为重要,该项目旨在建模 18 个月大婴儿水平的人类常识知识库。Mansinghka 是该项目的主要研究者之一。
Mansinghka 表示:「借助于 Gen,研究人员首次得以很容易地集成大量不同的 AI 技术。」
优步首席科学家和 AI 副总裁、剑桥大学教授 Zoubin Ghahramani 表示:「自深度学习出现以来,概率编程是最有潜力的前沿人工智能领域之一。Gen 代表了这一领域的重大进展,并将有助于概率推理 AI 系统的可扩展和实际实现。」
谷歌研究主管 Peter Norvig 也非常赞赏这项工作,他说:「Gen 允许用户使用概率编程解决问题,因此对各种问题有更具原则性的方法,且不受限于概率编程系统设计上的一些缺陷。通用编程语言之所以能成功,是因为它们能令程序员更容易完成任务,Gen 对于概率编程的意义同样在此。」
举个栗子
研究人员编写了一个简短的 Gen 程序来做贝叶斯线性回归:给定(x, y)平面上的一组数据点,他们想找出一条能很好拟合这些数据点的线。
典型的 Gen 程序通常包含三个主要组件。
首先,定义一个生成模型:利用额外语句扩展的 Julia 函数,即从概念上模拟一个假数据集。下面的模型对 slope 和 intercept 参数进行采样,然后 x 轴上的参数可以作为输入,且对相应 y 轴进行采样。他们将所做的随机选择命名为 @trace,这样就可以在推理程序中引用这些选择。
using Gen
@gen function my_model(xs::Vector{Float64})
slope = @trace(normal(0, 2), :slope)
intercept = @trace(normal(0, 10), :intercept)
for (i, x) in enumerate(xs)
@trace(normal(slope * x + intercept, 1), "y-$i")
end
end
其次,研究人员编写了一个推理程序,用于操纵模型的 Execution Traces。推理程序是常规的 Julia 代码,并利用 Gen 的标准推理库。
下面的推理程序会输入数据集,并迭代地运行 MCMC 算法,以拟合 slope 和 intercept 参数:
function my_inference_program(xs::Vector{Float64}, ys::Vector{Float64}, num_iters::Int)
# Create a set of constraints fixing the
# y coordinates to the observed y values
constraints = choicemap()
for (i, y) in enumerate(ys)
constraints["y-$i"] = y
end
# Run the model, constrained by `constraints`,
# to get an initial execution trace
(trace, _) = generate(my_model, (xs,), constraints)
# Iteratively update the slope then the intercept,
# using Gen's metropolis_hastings operator.
for iter=1:num_iters
(trace, _) = metropolis_hastings(trace, select(:slope))
(trace, _) = metropolis_hastings(trace, select(:intercept))
end
# From the final trace, read out the slope and
# the intercept.
choices = get_choices(trace)
return (choices[:slope], choices[:intercept])
end
最后,研究人员在一些数据上运行推理,得到下面的结果:
xs = [1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]
ys = [8.23, 5.87, 3.99, 2.59, 0.23, -0.66, -3.53, -6.91, -7.24, -9.90]
(slope, intercept) = my_inference_program(xs, ys, 1000)
println("slope: $slope, intercept: $intercept")
论文:Gen: A General-Purpose Probabilistic Programming System with Programmable Inference
摘要:概率建模和推理对于很多领域都是极为重要的。概率编程语言得到更广泛采用的关键挑战在于设计灵活且性能良好的系统。本文介绍的新概率编程系统 Gen 具有可用于建模以及终端用户自定义和推理优化的全新语言结构。Gen 使得能够解决多领域问题的概率程序编写变得切实可行。Gen 程序能够结合 Julia 编写的生成模型、TensorFlow 中的神经网络以及基于 Monte Carlo 可扩展库的推理算法和数值优化方法。
本文还介绍了一些能够结合 Gen 灵活性和性能的方法:
生成函数接口,一种封装概率和/或可微计算的抽象
具有自定义编译器的特定领域语言,对不同的灵活性/性能进行权衡
能够编码条件独立性和重复计算常见模式的连结符,支持缓存加速
标准推理库,支持在 Gen 中编写作为程序的自定义建议分布
本文研究表明,在处理非线性状态空间建模、现实世界时序数据结构学习、鲁棒回归以及基于深度图像的 3D 人体姿态估计等问题上,Gen 的性能优于当前最佳的概率编程系统,有时超出多个数量级。
参考链接:
http://news.mit.edu/2019/ai-programming-gen-0626
https://probcomp.github.io/Gen/
https://github.com/probcomp/Gen
https://dspace.mit.edu/bitstream/handle/1721.1/119255/MIT-CSAIL-TR-2018-020.pdf