一直以来看到二元交叉熵损失函数(Binary Cross Entropy Loss,BCELoss)
还以为是很复杂的东西,原来其实是交叉熵损失函数(CrossEntropyLoss)的特殊情况,也就是二元交叉熵损失函数其实就是交叉熵损失函数。
推导如下:
对于多分类问题,交叉熵损失函数的一般形式如下:
CrossEntropyLoss ( input , target ) = − ∑ i = 1 C target i ⋅ log ( softmax ( input ) i ) \text{CrossEntropyLoss}(\text{\textbf{input}}, \text{target}) = -\sum_{i=1}^{C} \text{target}_i \cdot \log(\text{softmax}(\text{\textbf{input}})_i) CrossEntropyLoss(input,target)=−∑i=1Ctargeti⋅log(softmax(input)i)
其中:
- input 是模型的输出,是一个包含了未归一化的分数(logits)的向量。
- target 是真实的标签,是一个表示类别的 one-hot 编码向量。
- C 是类别的数量。
- softmax(⋅) 是 softmax 函数,将输入的分数转换成概率分布。softmax(input )~i~表示取softmax运算后结果向量的第i个分量(标量,值)
对于二元分类问题,我们可以将多分类问题中的公式特殊化。假设只有两个类别(C = 2),我们可以将多分类交叉熵损失函数中的求和项简化为只有两项,如下:
CrossEntropyLoss ( input , target ) = − ( target 1 ⋅ log ( softmax ( input ) 1 ) + target 2 ⋅ log ( softmax ( input ) 2 ) ) \text{CrossEntropyLoss}(\text{\textbf{input}}, \text{target}) = -(\text{target}_1 \cdot \log(\text{softmax}(\text{\textbf{input}})_1) + \text{target}_2 \cdot \log(\text{softmax}(\text{\textbf{input}})_2)) CrossEntropyLoss(input,target)=−(target1⋅log(softmax(input)1)+target2⋅log(softmax(input)2))
在二元分类中,因为只有两个类别target~1~和target~2~,且概率和为1,因此,我们可以将上述公式中的 softmax(input )~2~替换为 1 - softmax(input )~1~,softmax(input )~2~替换为1 - softmax(input )~1~。得到如下形式:
BCELoss ( input , target ) = − ( target 1 ⋅ log ( softmax ( input ) 1 ) + ( 1 − target 1 ) ⋅ log ( 1 − softmax ( input ) 1 ) ) \text{BCELoss}(\text{\textbf{input}}, \text{target}) = -(\text{target}_1 \cdot \log(\text{softmax}(\text{\textbf{input}})_1) + (1 - \text{target}_1) \cdot \log(1 - \text{softmax}(\text{\textbf{input}})_1)) BCELoss(input,target)=−(target1⋅log(softmax(input)1)+(1−target1)⋅log(1−softmax(input)1))
在二元分类中,比如在推荐系统里,算出来的结果往往是 user 对 item 的评分预测,是个值,不是上面 input
向量,所以直接对这个评分预测套个Sigmoid,将最终的评分预测的范围整到表示概率的 (0, 1) 的范围里去,我感觉这样操作起来更方便。所以,我们可以将上式中的 softmax(input ) ~1~换成Sigmoid(y^^^~uv~) ,得到如下二元交叉熵损失函数的形式:
BCELoss ( input , target ) = − ( target ⋅ log ( sigmoid ( y ^ u v ) + ( 1 − target ) ⋅ log ( 1 − sigmoid ( y ^ u v ) ) ) \text{BCELoss}(\text{\textbf{input}}, \text{target}) = -(\text{target} \cdot \log(\text{sigmoid}(\hat{y}{uv}) + (1 - \text{target}) \cdot \log(1 - \text{sigmoid}(\hat{y}{uv}))) BCELoss(input,target)=−(target⋅log(sigmoid(y^uv)+(1−target)⋅log(1−sigmoid(y^uv)))
这个形式的损失函数是从多分类问题中的交叉熵损失函数推导得到的,并在二元分类问题中特殊化。