加权真阳性与真阴性

weighting true positives vs true negatives

这个 loss function in tensorflow 在 keras/tensorflow 中用作损失函数来加权二元决策

它对误报与漏报进行加权:

目标 * -log(sigmoid(logits)) + (1 - 目标) * -log(1 - sigmoid(logits))

参数pos_weight用作正目标的乘数:

目标 * -log(sigmoid(logits)) * pos_weight + (1 - 目标) * -log(1 - sigmoid(logits))

如果其中 loss/reward 个权重不应该相等,是否有人有任何建议可以如何对真阳性和真阴性进行加权?

首先,请注意,对于交叉熵损失,每个示例都有一些(可能非常非常小)惩罚(即使正确 class 化)。比如正确的class是1,而我们的logit是10,那么penalty就是

-log(sigmoid(10)) = 4*1e-5

这种损失(非常轻微)推动网络为这种情况产生更高的 logit,使其 sigmoid 更接近 1。同样,对于负值 class,即使 logit 为 -10,损失将使它变得更加消极。

这通常没问题,因为此类术语的损失非常小。如果你希望你的网络真正实现零损失,你可以使用label_smoothing。这可能与您在 最小化损失 的 classic 设置中获得的网络一样接近 "rewarding"(您显然可以 "reward" 网络通过在损失中添加一些负数。但这不会改变梯度和训练行为)。

话虽如此,您可以针对各种情况对网络进行不同的惩罚 - tp、tn、fp、fn - 类似于 Weight samples if incorrect guessed in binary cross entropy 中描述的内容。 (看起来那里的实现实际上是不正确的。您想使用 weight_tensor 的相应元素来加权各个 log(sigmoid(...)) 项,而不是 cross_entropy 的最终输出)。

使用此方案,您可能希望对非常错误的答案进行惩罚,而不是对几乎正确的答案进行惩罚。但是,请注意,由于 log(sigmoid(...)).

的形状,这已经在一定程度上发生了