前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Github项目推荐 | 基于PyTorch以用户为中心的可微概率推理包Brancher

Github项目推荐 | 基于PyTorch以用户为中心的可微概率推理包Brancher

作者头像
AI研习社
修改2019-08-07 16:45:01
7020
修改2019-08-07 16:45:01
举报
文章被收录于专栏:AI研习社AI研习社

A user-centered Python package for differentiable probabilistic inference.

Brancher是一个以用户为中心的Python包,用于可区分的概率推理。

Site:https://brancher.org/

Github项目地址:

https://github.com/AI-DI/Brancher

Brancher允许使用随机变分推理来设计和训练可微分贝叶斯模型。 Brancher基于深度学习框架PyTorch。

Brancher的特点:

灵活:易于扩展的建模框架,GPU加速的PyTorch后端

集成:易于使用的现代工具箱,支持Pandas和Seaborn

直观:易于学习具有类似数学语法的符号界面

入门教程

通过以下教程在Google Colab中学习Brancher(更多内容即将推出!)

安装

安装PyTorch后,可以从PyPI安装Brancher:

代码语言:javascript
复制
pip install brancher

或者直接克隆github项目:https://github.com/AI-DI/Brancher

建立概率模型

概率模型是象征性定义的。 随机变量可以创建如下:

代码语言:javascript
复制
a = NormalVariable(loc = 0., scale = 1., name = 'a')b = NormalVariable(loc = 0., scale = 1., name = 'b')

可以使用算术和数学函数将随机变量链接在一起:

代码语言:javascript
复制
c = NormalVariable(loc = a**2 + BF.sin(b),                    scale = BF.exp(b),                    name = 'a')

通过这种方式,可以创建任意复杂的概率模型。 也可以使用PyTorch的所有深度学习工具来定义具有深度神经网络的概率模型。

示例:自回归建模

概率模型

概率模型是象征性地定义的:

代码语言:javascript
复制
代码语言:javascript
复制
T = 20driving_noise = 1.
measure_noise = 0.3x0 = NormalVariable(0., driving_noise, 'x0')
y0 = NormalVariable(x0, measure_noise, 'x0')
b = LogitNormalVariable(0.5, 1., 'b')

x = [x0]
y = [y0]
x_names = ["x0"]
y_names = ["y0"]for t in range(1,T):
    x_names.append("x{}".format(t))
    y_names.append("y{}".format(t))
    x.append(NormalVariable(b*x[t-1], driving_noise, x_names[t]))
    y.append(NormalVariable(x[t], measure_noise, y_names[t]))AR_model = ProbabilisticModel(x + y)

观察数据

一旦定义了概率模型,我们就可以决定观察哪个变量:

代码语言:javascript
复制
[yt.observe(data[yt][:, 0, :]) for yt in y]

自回归变分分布

变分分布可以是任意结构:

代码语言:javascript
复制
Qb = LogitNormalVariable(0.5, 0.5, "b", learnable=True)logit_b_post = DeterministicVariable(0., 'logit_b_post', learnable=True)Qx = [NormalVariable(0., 1., 'x0', learnable=True)]Qx_mean = [DeterministicVariable(0., 'x0_mean', learnable=True)]for t in range(1, T):    Qx_mean.append(DeterministicVariable(0., x_names[t] + "_mean", learnable=True))    Qx.append(NormalVariable(BF.sigmoid(logit_b_post)*Qx[t-1] + Qx_mean[t], 1., x_names[t], learnable=True))variational_posterior = ProbabilisticModel([Qb] + Qx)model.set_posterior_model(variational_posterior)

推理

现在模型被激活了,我们可以使用随机梯度下降来执行近似推断:

代码语言:javascript
复制
inference.perform_inference(AR_model,                             number_iterations=500,                            number_samples=300,                            optimizer="SGD",                            lr=0.001)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Brancher的特点:
  • 入门教程
  • 安装
  • 建立概率模型
  • 示例:自回归建模
    • 概率模型
      • 观察数据
        • 自回归变分分布
          • 推理
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档