教程

Edward提供了一个用于快速实验和研究的概率模型的测试平台。这里我们将展示如何将这个过程应用于不同的学习任务。

案例

贝叶斯线性回归(Bayesian linear regression)

监督学习的基本模式。

在监督学习中,任务是从标注数据中推导隐藏结构。

可交互的Jupyter Notebook

  1. from __future__ import absolute_import
  2. from __future__ import division
  3. from __future__ import print_function
  4. import edward as ed
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7. import tensorflow as tf
  8. from edward.models import Normal

生成数据

模拟4040个数据点的训练和测试集。他们包括对 $x_n∈R^{10}$ 的输入以及对$y_n∈R$ 的输出。它们与正态分布的噪声(noise)具有一定的线性关系。

  1. def build_toy_dataset(N, w):
  2. D = len(w)
  3. x = np.random.normal(0.0, 2.0, size=(N, D))
  4. y = np.dot(x, w) + np.random.normal(0.0, 0.01, size=N)
  5. return x, y
  6. ed.set_seed(42)
  7. N = 40 # number of data points
  8. D = 10 # number of features
  9. w_true = np.random.randn(D) * 0.5
  10. X_train, y_train = build_toy_dataset(N, w_true)
  11. X_test, y_test = build_toy_dataset(N, w_true)

模型

将模型反映为贝叶斯线性回归(Murphy,2012)。 它假设输入$x∈R^D$与输出$y_n∈R$之间有线性关系。

Supervised-Regression-Model

  1. X = tf.placeholder(tf.float32, [N, D])
  2. w = Normal(mu=tf.zeros(D), sigma=tf.ones(D))
  3. b = Normal(mu=tf.zeros(1), sigma=tf.ones(1))
  4. y = Normal(mu=ed.dot(X, w) + b, sigma=tf.ones(N))

在这里,我们定义一个占位符(placeholder)X.在inference的过程,我们根据数据传递这个占位符的值。

  1. qw = Normal(mu=tf.Variable(tf.random_normal([D])),
  2. sigma=tf.nn.softplus(tf.Variable(tf.random_normal([D]))))
  3. qb = Normal(mu=tf.Variable(tf.random_normal([1])),
  4. sigma=tf.nn.softplus(tf.Variable(tf.random_normal([1]))))

使用相对熵运行(Kullback–Leibler divergence)变分推理(这个方法在Edward中很常见),在算法中使用250次迭代和5个潜变量样本。

  1. inference = ed.KLqp({w: qw, b: qb}, data={X: X_train, y: y_train})
  2. inference.run(n_samples=5, n_iter=250)

评价与检验

评估回归的标准无非就是比较其结果对“testing”数据的预测精度。

我们可以首先形成后验预测分布:

  1. y_post = ed.copy(y, {w: qw, b: qb})

其实这个就等于:

  1. y_post = Normal(mu=ed.dot(X, qw) + qb, sigma=tf.ones(N))

因此,我们可以使用来自我们模型的后验预测来评估各种量。

  1. ed.evaluate('mean_squared_error', data={X: X_test, y_post: y_test})

妥妥的得到均方误差。

  1. ## Mean squared error on test data:
  2. ## 0.0300492
  3. ## Mean absolute error on test data:
  4. ## 0.123616

训练有素的模型以低误差进行预测(误差精度相对于输出的幅度)。

我们还可以将生成的数据与之前生成的数据(第一个特征维度)做比较,从而可视化拟合,我们来看看结果。

  1. def visualise(X_data, y_data, w, b, n_samples=10):
  2. w_samples = w.sample(n_samples)[0].eval()
  3. b_samples = b.sample(n_samples).eval()
  4. plt.scatter(X_data[:, 0], y_data)
  5. plt.ylim([-10, 10])
  6. inputs = np.linspace(-8, 8, num=400)
  7. for ns in range(n_samples):
  8. output = inputs * w_samples[ns] + b_samples[ns]
  9. plt.plot(inputs, output)
  10. visualise(X_train, y_train, w, b)

output_1

  1. visualise(X_train, y_train, qw, qb)

output_2

线性混合模型

固定和随机效应的线性建模。

利用线性混合效应模型,我们希望对具有不同类型的输入的数据点建立线性关系,分类为子组,并与实值输出相关联。

同时,我们提供Edward对应案例的 Jupyter Notebook 噢。

数据

在这里,我们采用来自这儿的超人气的lme4 R包(Bates,Mächler,Bolker,&Walker,2015)的InstEval数据集。它是教师评估评估的数据集,其中输入(协变量)包括学生部门等类别,我们感兴趣的响应变量是对教师评估值。

首先,我们先处理一下数据:

  1. import pandas as pd
  2. import numpy as np
  3. import edward as ed
  4. data = pd.read_csv('../../examples/data/insteval.csv')
  5. data['dcodes'] = data['d'].astype('category').cat.codes
  6. data['deptcodes'] = data['dept'].astype('category').cat.codes
  7. data['s'] = data['s'] - 1
  8. train = data.sample(frac=0.8)
  9. test = data.drop(train.index)

Acknowledgments

感谢由Mayank Agrawal撰写本教程的初始版本。

References

Bates, D., Mächler, M., Bolker, B., & Walker, S. (2015). Fitting Linear Mixed-Effects Models Using lme4. Journal of Statistical Software, 67(1), 1–48.

Gelman, A., & Hill, J. L. (2006). Data analysis using regression and multilevel/hierarchical models. Cambridge University Press.

高斯过程分类

学习分配监督分类功能

混合模型

通过聚类数据点来进行的无监督学习。

潜在空间模型(Latent space models)

分析神经数据中的地址模式。

混合密度网络

用于解决逆问题的神经密度估计器。

生成对抗网络

构建MNIST数字的深刻生成模型。

概率解码器

信息理论中的潜在代码模型。

推理网络

如何摊销training和testing模型的计算

贝叶斯神经网络

贝叶斯分析与神经网络。

概率PCA

降低潜在变量的维数。

更多

如果您有兴趣撰写教程,请查看贡献页面。 有关更多的信息,请参阅下面的材料。

  • Probabilistic models
  • Inference of probabilistic models
  • Variational inference
    • $\text{KL}(q|p)KL(q∥p)$minimization
    • $\text{KL}(p|q)KL(p∥q)$ minimization
    • Maximum a posteriori estimation
    • Laplace approximation
  • Model criticism

There are also companion webpages for several papers about Edward.

“Deep probabilistic programming” at ICLR 2017