这个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))
如果他们的损失/奖励不应该具有相同的权重,那么有没有人有任何建议如何真正的积极因素可以对真实的负面因素进行加权?
答案 0 :(得分:2)
首先,请注意,在交叉熵损失的情况下,每个示例都会有一些(可能非常非常小的)惩罚(即使正确分类)。例如,如果正确的类是1并且我们的logit是10,那么惩罚将是
-log(sigmoid(10)) = 4*1e-5
这种损失(非常轻微)推动网络为这种情况产生更高的logit,使其sigmoid更接近1.同样,对于负类,即使logit为-10,损失将推动它更负面的。
这通常很好,因为这些条款的损失非常小。如果您希望网络实际实现零损失,可以使用label_smoothing
。这可能接近"奖励"您可以通过最小化损失的经典设置获得网络(显然,您可以通过在损失中添加一些负数来奖励"网络。这不会发生变化虽然梯度和训练行为。
话虽如此,你可以针对各种情况(tp,tn,fp,fn)对网络进行不同的惩罚 - 类似于Weight samples if incorrect guessed in binary cross entropy中描述的内容。 (看起来那里的实现实际上是不正确的。你想使用weight_tensor
的相应元素来加权单个log(sigmoid(...))
项,而不是cross_entropy
的最终输出。)
使用此方案,您可能希望惩罚非常错误的答案,而不是几乎正确的答案。但请注意,由于log(sigmoid(...))
的形状,这种情况已经发生了一定程度。