【问题标题】:What is the state of the art way of doing regression with probability in pytorch在pytorch中用概率进行回归的最先进方法是什么
【发布时间】:2018-05-06 22:54:38
【问题描述】:

我发现的所有回归示例都是您预测实数的示例,与分类不同,您在预测该数字时没有模型的置信度。我在强化学习中完成了另一种方式,输出是均值和标准差,然后您从该分布中采样。然后您就知道模型在预测每个值时的信心程度。现在我找不到如何在 pytorch 中使用监督学习来做到这一点。问题是我不明白如何从分布中执行样本以在训练时获取实际值或我应该使用哪种损失函数,不知道例如 MSE 或 L1Smooth 将如何工作。

是否有任何示例在 pytorch 中以强大且最先进的方式完成?

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    关键是您不需要从 NN 生成的分布中采样。您只需优化 NN 分布下目标值的似然性。

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

    从 PyTorch 0.4 开始,您可以使用 torch.distributions:将分布 distro 与您的 NN 的输出一起实例化,然后优化 -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)
    

    【讨论】:

    • 你能给出一个关于发行版实现的代码示例吗?
    猜你喜欢
    • 2012-03-02
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2022-01-21
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多