Edward2 项目介绍
Edward2 是一个简单的概率编程语言,旨在为深度学习生态系统提供核心工具,使用户可以通过概率程序编写模型,并灵活地操控模型的计算以进行训练和推断。以下是对该项目的详细介绍。
项目结构
Edward2 的代码库主要分为三个部分:
- edward2/:库代码
- examples/:示例
- experimental/:活跃的研究项目
安装指南
为了获得最新的功能,我们建议安装最新的开发版本。可以通过以下命令来安装:
pip install "edward2 @ git+https://github.com/google/edward2.git"
也可以安装最新的稳定版本:
pip install edward2
Edward2 支持三个后端:默认使用 TensorFlow,还支持 JAX 和 NumPy。安装 Edward2 后不会自动安装这些后端,需要通过类似下面的命令安装相关依赖:
pip install edward2[tensorflow]
有时候 Edward2 需要使用 TensorFlow 的最新变更,这时可以使用夜间构建版:
pip install edward2[tf-nightly]
概率程序中的模型
随机变量
在 Edward2 中,使用 RandomVariables
来指定概率模型的结构。一个随机变量 rv
具有一个概率分布 rv.distribution
,用于管理随机变量的方法,例如 log_prob
和 sample
。
可以像创建 TensorFlow 分布一样创建随机变量:
import edward2 as ed
normal_rv = ed.Normal(loc=0., scale=1.)
概率模型
在 Edward2 中,概率模型通过 Python 函数表示,这些函数通常执行生成过程并返回样本。以贝叶斯逻辑回归为例,该模型生成给定特征的二元结果,带有系数和截距的先验:
def logistic_regression(features):
coeffs = ed.Normal(loc=tf.zeros(features.shape[1]), scale=1., name="coeffs")
intercept = ed.Normal(loc=0., scale=1., name="intercept")
outcomes = ed.Bernoulli(
logits=tf.tensordot(features, coeffs, [[1], [0]]) + intercept,
name="outcomes")
return outcomes
操控模型计算
追踪
利用追踪功能,可以操控模型的计算,以支持灵活的训练和测试。例如,可以用来做预测:
def set_prior_to_posterior_mean(f, *args, **kwargs):
if kwargs.get("name") == "coeffs":
return posterior_coeffs.distribution.mean()
elif kwargs.get("name") == "intercept":
return posterior_intercept.distribution.mean()
return f(*args, **kwargs)
with ed.trace(set_prior_to_posterior_mean):
predictions = logistic_regression(features)
程序转换
程序转换可以从一个模型的表示形式映射到另一个,方便不同的使用场景。例如,使用程序转换来获得模型的对数联合概率函数:
log_joint = ed.make_log_joint_fn(logistic_regression)
使用 JAX 或 NumPy 后端
Edward2 也可以简单地切换到 JAX 或 NumPy 后端,如下所示:
import edward2.numpy as ed # NumPy 后端
import edward2.jax as ed # 或者 JAX 后端
在 NumPy 后端,Edward2 包装 SciPy 分布,例如线性回归:
def linear_regression(features, prior_precision):
beta = ed.norm.rvs(loc=0., scale=1. / np.sqrt(prior_precision), size=features.shape[1])
y = ed.norm.rvs(loc=np.dot(features, beta), scale=1., size=1)
return y
引用
关于 Edward2 的更多信息,可以参考文章 “Simple, Distributed, and Accelerated Probabilistic Programming”,发表于 2018 年的神经信息处理系统大会。对于层模块的引用,请参考 “Bayesian Layers: A Module for Neural Network Uncertainty”,发表于 2019 年的神经信息处理系统大会。