二元交叉熵惩罚 one-hot 向量的所有分量

Posted

技术标签:

【中文标题】二元交叉熵惩罚 one-hot 向量的所有分量【英文标题】:Binary Crossentropy to penalize all components of one-hot vector 【发布时间】:2017-10-23 14:44:20 【问题描述】:

我知道二元交叉熵与分类交叉熵在两个类的情况下是相同的。

此外,我很清楚 softmax 是什么。 因此,我看到分类交叉熵只会惩罚应该为 1 的一个分量(概率)。

但是为什么我不能或不应该在 one-hot 向量上使用二元交叉熵?

Normal Case for 1-Label-Multiclass-Mutual-exclusivity-classification:
################
pred            = [0.1 0.3 0.2 0.4]
label (one hot) = [0   1   0   0]
costfunction: categorical crossentropy 
                            = sum(label * -log(pred)) //just consider the 1-label
                            = 0.523
Why not that?
################
pred            = [0.1 0.3 0.2 0.4]
label (one hot) = [0   1   0   0]
costfunction: binary crossentropy
                            = sum(- label * log(pred) - (1 - label) * log(1 - pred))
                            = 1*-log(0.3)-log(1-0.1)-log(1-0.2)-log(1-0.4)
                            = 0.887

我看到,在二进制交叉熵中,zero 是一个目标类,对应于以下 one-hot 编码:

target class zero 0 -> [1 0]
target class one  1 -> [0 1]

总结:为什么我们只计算/总结预测类的负对数似然。为什么我们不惩罚其他应该为零/不应该的类?

如果使用二元交叉熵来处理单热向量。预期为零标签的概率也会受到惩罚。

【问题讨论】:

【参考方案1】:

有关类似问题,请参阅 my answer。简而言之,binary 交叉熵公式对于 one-hot 向量没有意义。可以对两个或更多类应用 softmax 交叉熵,也可以使用label 中的(独立)概率向量,具体取决于任务。

但是为什么,我不能或不应该在 one-hot 向量上使用二元交叉熵?

你计算的是4个独立特征的二元交叉熵:

pred   = [0.1 0.3 0.2 0.4]
label  = [0   1   0   0]

模型推断预测第一个特征以 10% 的概率开启,第二个特征以 30% 的概率开启,以此类推。目标标签是这样解释的:所有功能都关闭,除了第二个。请注意,[1, 1, 1, 1] 也是一个完全有效的标签,即它不是单热向量,pred=[0.5, 0.8, 0.7, 0.1] 是一个有效的预测,即总和不必等于 1。

换句话说,您的计算是有效的,但针对的是一个完全不同的问题:多标签非排他性二进制分类。

另请参阅difference between softmax and sigmoid cross-entropy loss functions in tensorflow。

【讨论】:

以上是关于二元交叉熵惩罚 one-hot 向量的所有分量的主要内容,如果未能解决你的问题,请参考以下文章

keras中的二元交叉熵和带有logits的二元交叉熵有啥区别?

自定义 keras 损失函数二元交叉熵给出不正确的结果

使用 PyTorch 的交叉熵损失函数是不是需要 One-Hot Encoding?

为啥tf模型训练时的二元交叉熵损失与sklearn计算的不同?

Sigmoid 与二元交叉熵损失

Keras 和 TensorFlow 中所有这些交叉熵损失之间有啥区别?