
我在试验“中描述的方法”深度强化学习的随机先验函数“作者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训练之后,不确定度的结果如下所示:

如果我们只看前辈,我们会看到未经训练的网络的变化:
我们还可以可视化单个模型预测,显示由于不同初始化和引导噪声而产生的变化:

现在,有趣的是,我们可以在我们说一个固定的正弦之前改变前一个:
SinPrior类(nn.模块):def forward(self,input):返回火炬.sin(3*输入)
然后,当我们训练相同的MLP模型,但这次使用正弦先验,我们可以看到它如何影响最终的预测和不确定性界限:
如果我们展示每个单独的模型,我们可以看到先前对每个单独模型的贡献的效果:

我希望你喜欢,这些是相当惊人的结果,为一个简单的方法,至少通过线性“健全检查”。我将探索一些预先训练好的网络来代替先前的网络,以了解对预测的不同影响,这是一个非常有趣的方法来添加一些简单的prior。亚洲金博宝
嗨,谢谢你做这篇文章。你能发布一个完整源代码的链接吗?我还在学习pytorch,努力让代码工作
是的,我同意乔的观点,如果你能发布整个源代码,那就太棒了。
要么在博客上,要么在Github上作为回购协议!金宝博游戏网址
谨致问候,
菲尔