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
张量中的权重?
中找到了解决问题的方法
我的问题是由于我的模型输出了一个 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
我正在使用 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
张量中的权重?
我的问题是由于我的模型输出了一个 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