我正在尝试根据 pytorch 实现具有任意不确定性估计回归的神经网络
Kendall 等人:“计算机视觉的贝叶斯深度学习需要哪些不确定性?” (关联)。
然而,虽然预测的回归值非常适合所需的真实值,但预测的方差看起来很奇怪,并且损失在训练期间变为负值。
该论文建议有两个输出均值和方差,而不是仅预测回归值。更准确地说,由于稳定性原因,建议预测均值和对数(方差)。因此,我的网络如下所示:
class ReferenceResNet(nn.Module):
def __init__(self):
super().__init__()
self.fcl1 = nn.Linear(1, 32)
self.fcl2 = nn.Linear(32, 64)
self.fcl3 = nn.Linear(64, 128)
self.fcl_mean = nn.Linear(128,1)
self.fcl_var = nn.Linear(128,1)
def forward(self, x):
x = torch.tanh(self.fcl1(x))
x = torch.tanh(self.fcl2(x))
x = torch.tanh(self.fcl3(x))
mean = self.fcl_mean(x)
log_var = self.fcl_var(x)
return mean, log_var
Run Code Online (Sandbox Code Playgroud)
根据该论文,给定这些输出,相应的损失函数由残差回归部分和正则化项组成:
其中 si 是网络预测的对数(方差)。
我相应地实现了这个损失函数:
def loss_function(pred_mean, pred_log_var, y):
return 1/len(pred_mean)*(0.5 * torch.exp(-pred_log_var)*torch.sqrt(torch.pow(y-pred_mean, 2))+0.5*pred_log_var).sum()
Run Code Online (Sandbox Code Playgroud)
我在自生成的玩具数据集上尝试了此代码(请参见带有结果的图像),但是,在训练期间损失变为负值,并且当我在训练后绘制数据集上的方差时,对我来说,它并没有真正意义,而相应的平均值值非常符合基本事实:
我已经发现负损失来自正则化项,因为对数对于 0 到 1 之间的值是负数,但是,我不认为正则化项的绝对值应该比回归部分增长得更大。有谁知道这是什么原因以及我如何防止这种情况发生?为什么我的方差看起来如此奇怪? 为了重现,我的完整代码如下所示:
import torch.nn …
Run Code Online (Sandbox Code Playgroud)