我使用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_prob
s上的标量和返回。这样可以防止对损失函数的各个元素进行加权。您可以通过访问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