TensorFlow Probability:如何使用 log_prob 损失函数进行样本加权?

TensorFlow Probability: how to do sample weighting with log_prob loss function?

我正在使用 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 张量中的权重?

我在 this GitHub issue.

中找到了解决问题的方法

我的问题是由于我的模型输出了一个 tfp.Independent 分布,这意味着 log_prob 作为每个元素的单个 log_prob 的标量和返回张量。这可以防止对损失函数的各个元素进行加权。您可以通过访问 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