不确定性估计深度学习(PyData里斯本/ 2019日)

只是分享一些幻灯片我在里斯本PyData提出了关于2019年7月有关谈话“在深学习不确定度评定“:

引用本文为:基督教S. Perone,“不确定性估计深度学习(PyData里斯本/ 2019年7月)”中亚洲金博宝未知领域,18/07/2019,//www.cpetem.com/2019/07/uncertainty-estimation-in-deep-learning-pydata-lisbon-july-2019/

在PyTorch随机现有功能

受过训练MLP 2隐藏层和正弦之前。

我尝试用这种方法在描述“深强化学习随机函数之前”由Ian Osband等。在NPS 2018,在那里它们被设计用于使用自举并随机先验的不确定性亚洲金博宝,并决定共享PyTorch代码一种非常简单和实用的方法。

我真的很喜欢引导方法,在我看来,他们通常是执行,并提供非常好的后逼近深连接,贝叶斯方法,而不必应付变推理最简单的方法。亚洲金博宝它们实际上显示,在所述线性情况下,该方法提供了一种贝叶斯后的纸张。

该方法的主要思想是具有引导到一起提供一种非参数数据扰动采用随机先验,这无非只是随机初始化网络。

$$ Q _ {\ theta_k}(X)= F _ {\ theta_k}(X)+ P_K(x)的$$

最终模型\(Q _ {\ theta_k}(X)\)将合奏的k个模型将与未经训练的现有\(P_K(X拟合函数\(F _ {\ theta_k}(X)\))\)。

我们去的代码。第一类是一个简单MLP 2隐藏层和Glorot初始化:

类MLP(nn.Module):DEF __init __(个体):超级().__ INIT __()self.l1 = nn.Linear(1,20)self.l2 = nn.Linear(20,20)self.l3 = NN。Linear(20, 1) nn.init.xavier_uniform_(self.l1.weight) nn.init.xavier_uniform_(self.l2.weight) nn.init.xavier_uniform_(self.l3.weight) def forward(self, inputs): x = self.l1(inputs) x = nn.functional.selu(x) x = self.l2(x) x = nn.functional.selu(x) x = self.l3(x) return x

再后来,我们定义一个类,将采取的模式,并产生最终的模型结果之前:

类ModelWithPrior(nn.Module):DEF __init __(个体,base_model:nn.Module,prior_model:nn.Module,prior_scale:浮子= 1.0):超级().__ INIT __()self.base_model = base_model self.prior_model = prior_model自。prior_scale = prior_scale def forward(self, inputs): with torch.no_grad(): prior_out = self.prior_model(inputs) prior_out = prior_out.detach() model_out = self.base_model(inputs) return model_out + (self.prior_scale * prior_out)

而且它基本上是!正如你所看到的,这是一个非常简单的方法,在第二亚洲金博宝部分,我们就创建了一个自定义的forward()方法,以避免计算/与模型预测积累梯度对于现有网络,并将其总结(缩放后)它。

要训​​练它,你只需要使用不同的白手起家每个集成模型,就像下面的代码:

DEF train_model(x_train,y_train,base_model,prior_model):模型= ModelWithPrior(base_model,prior_model,1.0)loss_fn = nn.MSELoss()优化= torch.optim.Adam(model.parameters(),LR = 0.05)为在历元范围(100):model.train()preds =模型(x_train)损耗= loss_fn(preds,y_train)optimizer.zero_grad()loss.backward()optimizer.step()的返回模型

以及使用与置换(自举)采样,如:

数据集= TensorDataset(...)bootstrap_sampler = RandomSampler(数据集,TRUE,LEN(数据集))train_dataloader =的DataLoader(数据集,=的batch_size LEN(数据集),采样= bootstrap_sampler)

在这种情况下,我用原来的文件中使用的相同的小数据集:

用一个简单的MLP训练它之后现有以及,对于不确定性的结果示于下面:

现有训练的模型与MLP,使用50种型号的合奏。

如果我们看一下刚刚的前科,我们将看到未经训练的网络的变化:

我们也可以想像,由于不同的初始化以及噪音引导个体模型预测出他们的差异:

绘制显示在红色每个单独的模型预测和真实数据。

现在,也挺有意思的是,我们可以改变之前,比方说,一个固定正弦:

类SinPrior(nn.Module):高清向前(个体经营,输入):返回torch.sin(3 *输入)

然后,当我们训练用正弦之前相同的MLP模型,但这个时候,我们可以看到它是如何影响最终的预测性和不确定性范围:

如果我们展示每一款车型中,我们可以看到每一款车型的前贡献效果:

绘制显示合奏具有正弦事先受过训练的每个单独的模式。

我希望你喜欢,这是一个简单的方法,至少通过线性“健全性检查”相当惊人的结果。我会代替之前的探讨一些预先训练网络上看到预测的不同影响,这是一个添加一些简单的先验概率非常有趣的方式。亚洲金博宝

引用本文为:基督教S. Perone,“在PyTorch随机现有的功能,”在亚洲金博宝未知领域,24/03/2019,//www.cpetem.com/2019/03/randomized-prior-functions-in-pytorch/