在 pytorch 中用概率进行回归的最先进方法是什么
What is the state of the art way of doing regression with probability in pytorch
我找到的所有回归示例都是您预测实数的示例,与分类不同,您没有模型在预测该数字时的信心。我在强化学习中用另一种方式完成了输出,而不是均值和标准差,然后你从那个分布中抽样。然后您就会知道该模型在预测每个值时有多自信。现在我找不到如何使用 pytorch 中的监督学习来做到这一点。问题是我不明白如何从分布中执行样本以在训练时获得实际值或我应该使用哪种损失函数,不确定例如 MSE 或 L1Smooth 将如何工作。
有没有在 pytorch 中以稳健且最先进的方式完成此操作的示例?
关键是你不需要从NN产生的分布中采样。你只需要优化目标值在NN分布下的似然。
关于 VAE (https://github.com/pytorch/examples/tree/master/vae) 的官方 PyTorch 示例中有一个示例,尽管是多维伯努利分布。
从 PyTorch 0.4 开始,您可以使用 torch.distributions:用神经网络的输出实例化分布 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)
我找到的所有回归示例都是您预测实数的示例,与分类不同,您没有模型在预测该数字时的信心。我在强化学习中用另一种方式完成了输出,而不是均值和标准差,然后你从那个分布中抽样。然后您就会知道该模型在预测每个值时有多自信。现在我找不到如何使用 pytorch 中的监督学习来做到这一点。问题是我不明白如何从分布中执行样本以在训练时获得实际值或我应该使用哪种损失函数,不确定例如 MSE 或 L1Smooth 将如何工作。
有没有在 pytorch 中以稳健且最先进的方式完成此操作的示例?
关键是你不需要从NN产生的分布中采样。你只需要优化目标值在NN分布下的似然。
关于 VAE (https://github.com/pytorch/examples/tree/master/vae) 的官方 PyTorch 示例中有一个示例,尽管是多维伯努利分布。
从 PyTorch 0.4 开始,您可以使用 torch.distributions:用神经网络的输出实例化分布 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)