PairwiseLogisticLoss
类keras_rs.losses.PairwiseLogisticLoss(temperature: float = 1.0, **kwargs: Any)
计算真实标签与预测分数之间的成对逻辑损失。此损失函数专为排序任务设计,其目标是正确地对每个列表中的项目进行排序。它通过比较每个列表中的项目对来计算损失,惩罚真实标签较高的项目预测分数却低于真实标签较低的项目的情况。
对于 y_pred
中的每个预测分数列表 s
和 y_true
中对应的真实标签列表 y
,损失计算如下
loss = sum_{i} sum_{j} I(y_i > y_j) * log(1 + exp(-(s_i - s_j)))
其中
y_i
和 y_j
分别是项目 i
和项目 j
的真实标签。s_i
和 s_j
分别是项目 i
和项目 j
的预测分数。I(y_i > y_j)
是一个指示函数,如果 y_i > y_j
则等于 1,否则等于 0。log(1 + exp(-(s_i - s_j)))
是逻辑损失,它惩罚当 y_i > y_j
时分数差 s_i - s_j
不够大的情况。此函数提供了理想阶跃函数的平滑近似,使其适用于基于梯度的优化。参数
"sum_over_batch_size"
。支持的选项包括 "sum"
、"sum_over_batch_size"
、"mean"
、"mean_with_sample_weight"
或 None
。"sum"
对损失求和,"sum_over_batch_size"
和 "mean"
对损失求和并除以样本大小,而 "mean_with_sample_weight"
对损失求和并除以样本权重的总和。"none"
和 None
不执行任何聚合。默认为 "sum_over_batch_size"
。None
,表示使用 keras.backend.floatx()
。除非设置为其他值(通过 keras.backend.set_floatx()
),否则 keras.backend.floatx()
为 "float32"
。如果提供了 keras.DTypePolicy
,则将使用 compute_dtype
。示例
使用 compile()
API
model.compile(
loss=keras_rs.losses.PairwiseLogisticLoss(),
...
)
作为独立函数,使用未批处理输入
>>> y_true = np.array([1.0, 0.0, 1.0, 3.0, 2.0])
>>> y_pred = np.array([1.0, 3.0, 2.0, 4.0, 0.8])
>>> pairwise_logistic_loss = keras_rs.losses.PairwiseLogisticLoss()
>>> pairwise_logistic_loss(y_true=y_true, y_pred=y_pred)
>>> 1.70708
使用默认的 'auto'/'sum_over_batch_size' 归约,使用已批处理输入
>>> y_true = np.array([[1.0, 0.0, 1.0, 3.0], [0.0, 1.0, 2.0, 3.0]])
>>> y_pred = np.array([[1.0, 3.0, 2.0, 4.0], [1.0, 1.8, 2.0, 3.0]])
>>> pairwise_logistic_loss = keras_rs.losses.PairwiseLogisticLoss()
>>> pairwise_logistic_loss(y_true=y_true, y_pred=y_pred)
0.73936
使用掩码输入(对不规则输入有用)
>>> y_true = {
... "labels": np.array([[1.0, 0.0, 1.0, 3.0], [0.0, 1.0, 2.0, 3.0]]),
... "mask": np.array(
... [[True, True, True, True], [True, True, False, False]]
... ),
... }
>>> y_pred = np.array([[1.0, 3.0, 2.0, 4.0], [1.0, 1.8, 2.0, 3.0]])
>>> pairwise_logistic_loss(y_true=y_true, y_pred=y_pred)
0.53751
使用 sample_weight
>>> y_true = np.array([[1.0, 0.0, 1.0, 3.0], [0.0, 1.0, 2.0, 3.0]])
>>> y_pred = np.array([[1.0, 3.0, 2.0, 4.0], [1.0, 1.8, 2.0, 3.0]])
>>> sample_weight = np.array(
... [[2.0, 3.0, 1.0, 1.0], [2.0, 1.0, 0.0, 0.0]]
... )
>>> pairwise_logistic_loss = keras_rs.losses.PairwiseLogisticLoss()
>>> pairwise_logistic_loss(
... y_true=y_true, y_pred=y_pred, sample_weight=sample_weight
... )
>>> 0.80337
使用 'none'
归约
>>> y_true = np.array([[1.0, 0.0, 1.0, 3.0], [0.0, 1.0, 2.0, 3.0]])
>>> y_pred = np.array([[1.0, 3.0, 2.0, 4.0], [1.0, 1.8, 2.0, 3.0]])
>>> pairwise_logistic_loss = keras_rs.losses.PairwiseLogisticLoss(
... reduction="none"
... )
>>> pairwise_logistic_loss(y_true=y_true, y_pred=y_pred)
[[2.126928, 0., 1.3132616, 0.48877698], [0., 0.20000005, 0.79999995, 0.]]
call
方法PairwiseLogisticLoss.call(y_true: Any, y_pred: Any)
计算成对损失。
参数
(list_size)
;对于已批处理输入,形状为 (batch_size, list_size)
。如果项目的标签为 -1,则在损失计算中将被忽略。如果是字典,则应包含两个键:"labels"
和 "mask"
。"mask"
可用于在损失计算中忽略元素,即,不会与这些项目形成对。请注意,最终掩码是传入的掩码与 labels >= 0
的逻辑 and
结果。(list_size)
;对于已批处理输入,形状为 (batch_size, list_size)
。应与 y_true
具有相同的形状。返回值
损失值。