TensorFlow概率:如何用log_prob损失函数进行样本加权



我使用TensorFlow概率来训练一个模型,该模型的输出是用于概率回归的tfp.distributions.Independent对象。我的问题是,我不确定如何在负对数似然(NLL(损失函数中实现样本加权。

我有以下损失函数,我认为它没有使用sample_weight第三个参数:

class NLL(tf.keras.losses.Loss):
''' Custom keras loss/metric for negative log likelihood '''
def __call__(self, y_true, y_pred, sample_weight=None):
return -y_pred.log_prob(y_true)

使用标准的TensorFlow损失函数和包含(X, y, sample_weight)元组的数据集,在损失减少求和中使用sample_weight是在后台处理的。如何使y_pred.log_prob中的和使用sample_weight张量中的权重?

我在这个GitHub问题中找到了我的问题的解决方案。

我的问题是由于我的模型输出tfp.Independent分布,这意味着对于张量的每个元素,log_prob作为单个log_probs上的标量和返回。这样可以防止对损失函数的各个元素进行加权。您可以通过访问tfp.Independent对象的.distribution属性来获得log_prob值的底层张量-该底层分布对象将损失的每个元素视为独立的随机变量,而不是具有多个值的单个随机变量。通过编写继承自tf.keras.losses.Loss的损失函数,可以隐式地减少得到的加权张量,返回log_prob值的加权平均值,而不是总和,例如:

class NLL(tf.keras.losses.Loss):
''' Custom keras loss/metric for weighted negative log likelihood '''
def __call__(self, y_true, y_pred, sample_weight=None):
# This tensor is implicitly reduced by TensorFlow
#     by taking the mean over all weighted elements
return -y_pred.distribution.log_prob(y_true) * sample_weight

最新更新