我有一个预测直角坐标的模型,使用Resnet并输出两个值(x,y),并使用mse优化网络。现在的问题是,当我预测的时候,我想看到的是信心得分。如何设计一个与分类输出的概率值相似的置信度得分?我尝试使用多任务来输出一个值,使得这个值是基于预测的(x,y)和实际的(x,y)之间的减法,但不幸的是效果非常糟糕。我希望每次做预测时都能给给予分。如果预测是好的,得分将很高,如果预测是坏的,得分将很低。
kognpnkq1#
信心通常是一个明确的概念。对于像预测边界框这样的回归问题,模拟将是预测的方差或标准偏差。你的目标是,如果模型是可信的,它输出的var/std就很低,反之亦然。从架构上讲,只需为std添加一个或两个输出。这很简单那么,如何训练它呢?这归结为找到正确的损失函数。为了计算出标准差头部的正确损失,你必须考虑在预测标准差的上下文中处理最大似然估计(MLE)。期望最大化是一个众所周知的技术,我们可以借鉴一些想法。MSE是回归到均值的正确损失(基于MLE和高斯分布的相互作用,可以追溯到世纪Fisher和世纪拉格朗日,高斯和拉普拉斯的工作)。对于var/std,当模型确实错误时,如果预测的var较宽,则希望减少惩罚,如果var较窄,则希望增加惩罚。如果模型是正确的,那么如果var是宽的,你应该惩罚它更多,如果var是窄的,你应该惩罚它更少。MLE在这里非常直接地起作用:只需取由模型的预测均值和方差(或标准差)参数化的正态分布的概率密度函数的负对数。在你的自定义损失函数中,它会是这样的,你的目标是通过SGD或其他方式使它变小。
dist = torch.distributions.normal.Normal(predicted mean, predicted std) std_loss = dist.log_prob(actual)
请注意,分发包显然是矢量化的:
>>> import torch.distributions as D >>> D.normal.Normal(torch.tensor([0,2]), torch.tensor([1,4])) Normal(loc: torch.Size([2]), scale: torch.Size([2]))
1条答案
按热度按时间kognpnkq1#
信心通常是一个明确的概念。对于像预测边界框这样的回归问题,模拟将是预测的方差或标准偏差。
你的目标是,如果模型是可信的,它输出的var/std就很低,反之亦然。
从架构上讲,只需为std添加一个或两个输出。这很简单那么,如何训练它呢?这归结为找到正确的损失函数。
为了计算出标准差头部的正确损失,你必须考虑在预测标准差的上下文中处理最大似然估计(MLE)。期望最大化是一个众所周知的技术,我们可以借鉴一些想法。
MSE是回归到均值的正确损失(基于MLE和高斯分布的相互作用,可以追溯到世纪Fisher和世纪拉格朗日,高斯和拉普拉斯的工作)。对于var/std,当模型确实错误时,如果预测的var较宽,则希望减少惩罚,如果var较窄,则希望增加惩罚。如果模型是正确的,那么如果var是宽的,你应该惩罚它更多,如果var是窄的,你应该惩罚它更少。
MLE在这里非常直接地起作用:只需取由模型的预测均值和方差(或标准差)参数化的正态分布的概率密度函数的负对数。
在你的自定义损失函数中,它会是这样的,你的目标是通过SGD或其他方式使它变小。
请注意,分发包显然是矢量化的: