一个以用户为中心的可微概率推理python包
brancher的Python项目详细描述
brancher:一个以用户为中心的可微概率推理python包
brancher允许使用随机变分推理设计和训练可微贝叶斯模型。Brancher基于深度学习框架Pythorch。
建立概率模型
概率模型的定义是象征性的。随机变量可以创建如下:
a=NormalVariable(loc=0.,scale=1.,name='a')b=NormalVariable(loc=0.,scale=1.,name='b')
通过使用算术和数学函数可以将随机变量连在一起:
c=NormalVariable(loc=a**2+BF.sin(b),scale=BF.exp(b),name='a')
这样,就有可能建立任意的复杂概率模型。还可以使用pytorch的所有深度学习工具来定义具有深度神经网络的概率模型。
示例:自回归建模
概率模型
概率模型的定义是象征性的:
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"]fortinrange(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)
观察数据
一旦定义了概率模型,我们就可以决定观察到哪个变量:
[yt.observe(data[yt][:,0,:])forytiny]
自回归变分分布
变分分布可以具有任意结构:
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)]fortinrange(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)
推断
现在,我们指定了模型,我们可以使用随机梯度下降进行近似推理:inference.perform_inference(AR_model,number_iterations=500,number_samples=300,optimizer="SGD",lr=0.001)