2018 年 4 月 11 日 — 由 Josh Dillon(软件工程师)、Mike Shwe(产品经理)和 Dustin Tran(研究科学家)发布 - 代表 TensorFlow 概率团队
在 2018 年 TensorFlow 开发者峰会上,我们 宣布 TensorFlow 概率:一个面向机器学习研究人员和实践者的概率编程工具箱,它可以快速可靠地构建利用最先进的... 的复杂模型。
TensorFlow 概率概述。概率编程工具箱为用户提供好处,从数据科学家和统计学家到所有 TensorFlow 用户。 |
tf.linalg
的一部分。tf.contrib.distributions
,tf.distributions
):一个包含大量概率分布和相关统计信息的集合,具有批处理和广播语义。tf.contrib.distributions.bijectors
):随机变量的可逆且可组合的变换。双射提供了一类丰富的变换分布,从经典示例(如 对数正态分布)到复杂的深度学习模型,如 掩蔽自回归流。tfp.edward2
):一种概率编程语言,用于将灵活的概率模型指定为程序。tfp.layers
):神经网络层,对它们所代表的函数具有不确定性,扩展了 TensorFlow 层。tfp.trainable_distributions
):由单个张量参数化的概率分布,这使得构建输出概率分布的神经网络变得容易。tfp.mcmc
):用于通过采样近似积分的算法。包括 哈密顿蒙特卡罗、随机游走 Metropolis-Hastings 以及构建自定义转换核的能力。tfp.vi
):用于通过优化近似积分的算法。tfp.optimizer
):随机优化方法,扩展了 TensorFlow 优化器。包括 随机梯度朗之万动力学。tfp.monte_carlo
):用于计算蒙特卡罗期望值的工具。tfp.edward2
),它扩展了 Edward。下面的程序根据其生成过程来具体化模型。import tensorflow as tf
from tensorflow_probability import edward2 as ed
def model(features):
# Set up fixed effects and other parameters.
intercept = tf.get_variable("intercept", [])
service_effects = tf.get_variable("service_effects", [])
student_stddev_unconstrained = tf.get_variable(
"student_stddev_pre", [])
instructor_stddev_unconstrained = tf.get_variable(
"instructor_stddev_pre", [])
# Set up random effects.
student_effects = ed.MultivariateNormalDiag(
loc=tf.zeros(num_students),
scale_identity_multiplier=tf.exp(
student_stddev_unconstrained),
name="student_effects")
instructor_effects = ed.MultivariateNormalDiag(
loc=tf.zeros(num_instructors),
scale_identity_multiplier=tf.exp(
instructor_stddev_unconstrained),
name="instructor_effects")
# Set up likelihood given fixed and random effects.
ratings = ed.Normal(
loc=(service_effects * features["service"] +
tf.gather(student_effects, features["students"]) +
tf.gather(instructor_effects, features["instructors"]) +
intercept),
scale=1.,
name="ratings")
return ratings
该模型将“服务”、“学生”和“教师”的特征字典作为输入;它们是向量,其中每个元素描述一个单独的课程。该模型对这些输入进行回归,假设潜在的随机变量,并返回课程评估评分的分布。在这个输出上运行 TensorFlow 会话将返回评分的生成。import tensorflow_probability as tfp
tfd = tfp.distributions
tfb = tfp.distributions.bijectors
# Example: Log-Normal Distribution
log_normal = tfd.TransformedDistribution(
distribution=tfd.Normal(loc=0., scale=1.),
bijector=tfb.Exp())
# Example: Kumaraswamy Distribution
Kumaraswamy = tfd.TransformedDistribution(
distribution=tfd.Uniform(low=0., high=1.),
bijector=tfb.Kumaraswamy(
concentration1=2.,
concentration0=2.))
# Example: Masked Autoregressive Flow
# https://arxiv.org/abs/1705.07057
shift_and_log_scale_fn = tfb.masked_autoregressive_default_template(
hidden_layers=[512, 512],
event_shape=[28*28])
maf = tfd.TransformedDistribution(
distribution=tfd.Normal(loc=0., scale=1.),
bijector=tfb.MaskedAutoregressiveFlow(
shift_and_log_scale_fn=shift_and_log_scale_fn))
“高斯 copula” 创建了一些自定义双射,然后展示了如何轻松构建几个不同的 copula。有关分布的更多背景信息,请参阅 “理解 TensorFlow 分布形状”。 它描述了如何管理用于采样、批处理训练和建模事件的形状。import tensorflow as tf
import tensorflow_probability as tfp
# Assumes user supplies `likelihood`, `prior`, `surrogate_posterior`
# functions and that each returns a
# tf.distribution.Distribution-like object.
elbo_loss = tfp.vi.monte_carlo_csiszar_f_divergence(
f=tfp.vi.kl_reverse, # Equivalent to "Evidence Lower BOund"
p_log_prob=lambda z: likelihood(z).log_prob(x) + prior().log_prob(z),
q=surrogate_posterior(x),
num_draws=1)
train = tf.train.AdamOptimizer(
learning_rate=0.01).minimize(elbo_loss)
tfp.layers
) 中使用最近发布的 Flipout 估计器。import tensorflow as tf
import tensorflow_probability as tfp
model = tf.keras.Sequential([
tf.keras.layers.Reshape([32, 32, 3]),
tfp.layers.Convolution2DFlipout(
64, kernel_size=5, padding='SAME', activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(pool_size=[2, 2],
strides=[2, 2],
padding='SAME'),
tf.keras.layers.Reshape([16 * 16 * 64]),
tfp.layers.DenseFlipout(10)
])
logits = model(features)
neg_log_likelihood = tf.nn.softmax_cross_entropy_with_logits(
labels=labels, logits=logits)
kl = sum(model.get_losses_for(inputs=None))
loss = neg_log_likelihood + kl
train_op = tf.train.AdamOptimizer().minimize(loss)
模型对象在输入张量上组合神经网络层,并且它针对概率卷积层和概率密集连接层执行随机正向传递。该函数返回一个输出张量,其形状由批次大小和 10 个值给出。此张量的每一行表示每个数据点属于 10 个类之一的 logits(无约束概率值)。tfp.layers
也可以与使用 tf.keras.Model 类的 急切执行 一起使用。class MNISTModel(tf.keras.Model):
def __init__(self):
super(MNISTModel, self).__init__()
self.dense1 = tfp.layers.DenseFlipout(units=10)
self.dense2 = tfp.layers.DenseFlipout(units=10)
def call(self, input):
"""Run the model."""
result = self.dense1(input)
result = self.dense2(result)
# reuse variables from dense2 layer
result = self.dense2(result)
return result
model = MNISTModel()
pip install --user --upgrade tfp-nightly
有关所有代码和详细信息,请查看 github.com/tensorflow/probability。无论您是用户还是贡献者,我们都期待通过 GitHub 与您合作!
2018 年 4 月 11 日 — 由 Josh Dillon(软件工程师)、Mike Shwe(产品经理)和 Dustin Tran(研究科学家)代表 TensorFlow Probability 团队发布
在 2018 年 TensorFlow 开发者峰会上,我们 宣布 了 TensorFlow Probability:一个面向机器学习研究人员和从业者的概率编程工具箱,可以帮助他们快速可靠地构建利用最先进技术的复杂模型...