在pytorch中以概率进行回归的最先进方法是什么

时间:2018-05-06 04:22:41

标签: python pytorch

我发现的所有回归示例都是您预测实数的示例,与分类不同,您不会预测该数字时模型的置信度。我已经用强化学习做了另一种方式,输出是mean和std然后你从那个分布中取样。然后你知道模型对预测每个价值的信心。现在我无法在pytorch中使用监督学习来找到如何做到这一点。问题是我不明白如何从分布中获取样本,在训练时得到实际值或我应该使用什么样的损失函数,不知道如何使用例如MSE或L1Smooth。

有没有任何一个例子可以在火葬场以强大而先进的方式完成?

1 个答案:

答案 0 :(得分:1)

关键是您不需要从NN生成的分发中进行采样。您所需要的只是优化NN分布下目标值的可能性。

关于VAE(https://github.com/pytorch/examples/tree/master/vae)的官方PyTorch示例中有一个示例,但是对于多维伯努利分布。

自PyTorch 0.4以来,您可以使用torch.distributions:使用您的NN的输出实例化分发distro,然后优化-distro.log_prob(target)

编辑:根据评论中的要求,使用torch.distributions模块的完整示例。

首先,我们创建一个异方差数据集:

import numpy as np
import torch
X = np.random.uniform(size=300)
Y = X + 0.25*X*np.random.normal(size=X.shape[0])

我们构建了一个简单的模型,它完全能够匹配我们数据的生成过程:

class Model(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.mean_coeff = torch.nn.Parameter(torch.Tensor([0]))
        self.var_coeff = torch.nn.Parameter(torch.Tensor([1]))

    def forward(self, x):
        return torch.distributions.Normal(self.mean_coeff * x, self.var_coeff * x)

mdl = Model()
optim = torch.optim.SGD(mdl.parameters(), lr=1e-3)

模型的初始化使得它总是产生标准法线,这不适合我们的数据,所以我们训练(注意这是一个非常愚蠢的批量训练,但证明你可以为你的批量输出一组分布马上):

for _ in range(2000): # epochs
    dist = mdl(torch.from_numpy(X).float())
    obj = -dist.log_prob(torch.from_numpy(Y).float()).mean()
    optim.zero_grad()
    obj.backward()
    optim.step()

最终,学习的参数应与我们用于构造Y的值匹配。

print(mdl.mean_coeff, mdl.var_coeff)
# tensor(1.0150) tensor(0.2597)