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

use*_*545 0 python pytorch

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

是否有任何示例可以在 pytorch 中以稳健且最先进的方式完成此操作?

ded*_*bed 6

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

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

从 PyTorch 0.4 开始,您可以使用 torch.distributions: 使用distroNN 的输出实例化分布 ,然后优化 -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])
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

最终,学习到的参数应该与我们用来构建 Y 的值相匹配。

print(mdl.mean_coeff, mdl.var_coeff)
# tensor(1.0150) tensor(0.2597)
Run Code Online (Sandbox Code Playgroud)