小编lau*_*ers的帖子

根据 Kendall 等人的说法,尝试实施任意不确定性估计时出现负损失

我正在尝试根据 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)

根据该论文,给定这些输出,相应的损失函数由残差回归部分和正则化项组成:

根据 Kendall 等人的损失函数。

其中 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)

python regression uncertainty deep-learning pytorch

5
推荐指数
1
解决办法
865
查看次数

标签 统计

deep-learning ×1

python ×1

pytorch ×1

regression ×1

uncertainty ×1