PyTorch中的随机先验函数

训练的MLP有两个隐藏层和一个正弦先验。

我在试验“中描述的方法”深度强化学习的随机先验函数“作者Ian Osband等人。在2018年的NPS大会上,他们设计了一种非常简单实用的方法,使用bootstra亚洲金博宝p和随机化priors来解决不确定性问题,并决定共享PyTorch代码。

我真的很喜欢bootstrap方法,在我看来,它们通常是最容易实现的方法,并且提供了非常好的后验近似,并且与贝叶斯方法有很深的联系,而不必处理变分推理。他们实际上在论文中表明,在线性情况下,该方法提供了一个贝叶斯后验。亚洲金博宝

该方法的主要思想是用bootstrap来提供一个非参数数据扰动和随机先验,这仅仅是随机初始化的网络。

$$Q{\theta_k}(x)=f{\theta_k}(x)+p_k(x)$$

最后一个模型(Q{theta k}(x)将是集合的k模型,它将与未经训练的前一个函数(p{uk(x))相匹配。

我们去查密码。第一类是一个简单的MLP,有两个隐藏层和Glorot初始化:

MLP级(nn.模块):def初始化(self):super()。\uu初始化(self)。l1=nn.线性(1,20)自身.l2=nn.线性(20,20)自身l3=nn.线性(20,1)nn.init.xavier_制服_(自身重量)nn.init.xavier_制服_(自身重量2)nn.init.xavier_制服_(self.l3.weight)前进(self,输入:x=自身。l1(输入)x=nn.功能.selu(x) x=自身。l2(x)x=nn.功能.selu(x) x=自身l3(x)返回x

然后,我们定义一个类,该类将获取模型和previor,然后生成最终模型结果:

类ModelWithPrior(nn.模块):def\uu init\uu(自我,基本模式:nn.模块,以前的_模型:nn.模块,上一个刻度:float=1.0):super()。\u initself.base_模型=基本模型自我先验模型=先前的模型自我先验量表=前刻度向前(自,输入):有火炬。没有毕业():之前的输出=自我先验模型(输入)previor_out=先前_分离(型号)self.base_模型(输入)返回模型输出+(自我先验量表*之前)

基本上就是这样!如您所见,这是一个非常简单的方法,在第二部分中,我们刚刚创建了一个自定义forwa亚洲金博宝rd(),以避免计算/累积先前网络的梯度,并使用模型预测对其求和(缩放后)。

要训练它,您只需为每个集成模型使用不同的引导,如下代码所示:

def train_model(x_train,y_train,base_model,previor_model):model=modelwithprevior(base_model,previor_model,1.0)loss_fn=最小损失(优化器=火炬.擎天柱.亚当(模型参数(1),lr=0.05)对于范围(100)内的历元:列车模型(preds=型号(x_列)损失=损失(preds,y_列)优化器.zero_grad() 向后损失() 优化器.step(二)退货模型

并使用带替换(引导)的采样器,如下所示:

dataset=TensorDataset(…)bootstrap_sampler=RandomSampler(dataset,True,len(dataset))train_dataloader=dataloader(dataset,batch_size=len(dataset),sampler=bootstrap_sampler)

在本例中,我使用了与原始文件中相同的小数据集:

在对其进行简单的MLP训练之后,不确定度的结果如下所示:

训练模型采用MLP先验,共50个模型。

如果我们只看前辈,我们会看到未经训练的网络的变化:

我们还可以可视化单个模型预测,显示由于不同初始化和引导噪声而产生的变化:

以红色显示每个单独模型预测和真实数据的图。

现在,有趣的是,我们可以在我们说一个固定的正弦之前改变前一个:

SinPrior类(nn.模块):def forward(self,input):返回火炬.sin(3*输入)

然后,当我们训练相同的MLP模型,但这次使用正弦先验,我们可以看到它如何影响最终的预测和不确定性界限:

如果我们展示每个单独的模型,我们可以看到先前对每个单独模型的贡献的效果:

显示用正弦先验训练的集合的每个单独模型的图。

我希望你喜欢,这些是相当惊人的结果,为一个简单的方法,至少通过线性“健全检查”。我将探索一些预先训练好的网络来代替先前的网络,以了解对预测的不同影响,这是一个非常有趣的方法来添加一些简单的prior。亚洲金博宝

引用本文为:Christian S.Perone,“Pythorch中的随机先验函数”,in亚洲金博宝隐姓埋名地2019年3月24日,//www.cpetem.com/2019/03/random-prior-functions-in-pytorch/.

对“PyTorch中随机先验函数”的两点思考

  1. 嗨,谢谢你做这篇文章。你能发布一个完整源代码的链接吗?我还在学习pytorch,努力让代码工作

  2. 是的,我同意乔的观点,如果你能发布整个源代码,那就太棒了。

    要么在博客上,要么在Github上作为回购协议!金宝博游戏网址

    谨致问候,
    菲尔

留下回信

您的电子邮件地址将不会被发布。

这个网站使用Akismet来减少垃圾邮件。了解如何处理评论数据.