1 二分类交叉熵损失函数
之前已经介绍过交叉熵损失函数【Pytorch基础】torch.nn.CrossEntropyLoss损失函数介绍,现在再来看一下,它的一个变体,二分类交叉熵损失函数。由于是多分类问题,在之前文章中举的例子中,模型预测的样本概率是一个向量。如果是二分类任务的话,因为只有正例和负例,且两者的概率和是1,所以不需要预测一个向量,只需要预测概率。
则损失函数定义如下:
L
o
s
s
=
−
(
y
⋅
log
(
y
^
)
+
(
1
−
y
)
⋅
log
(
1
−
y
^
)
)
Loss=-(y \cdot \log (\hat{y})+(1-y) \cdot \log (1-\hat{y}))
Loss=−(y⋅log(y^)+(1−y)⋅log(1−y^))
仍然以用到过的数据举例。在这里依然取个样本举例, 假设所取的样本的标签
x
1
=
[
0
]
x_{1}=[0]
x1=[0], 模型预测样本
x
1
x_{1}
x1的概率为
x
1
^
=
[
0.1
]
\hat{x_{1}}=[0.1]
x1^=[0.1],则样本的损失计算如下所示:
Loss ( x 1 ^ , x 1 ) = − 0 × log ( 0.1 ) − 1 × log ( 0.9 ) = log ( 0.9 ) \operatorname{Loss}(\hat{x_1}, x_1)=-0 \times \log (0.1)-1 \times \log (0.9)=\log (0.9) Loss(x1^,x1)=−0×log(0.1)−1×log(0.9)=log(0.9)
在模型中使用二分类交叉熵
import torch
import torch.nn as nn
model = nn.Linear(10, 1)
criterion = nn.BCEWithLogitsLoss()
x = torch.randn(16, 10)
y = torch.empty(16).random_(2) # (16, )
out = model(x) # (16, 1)
out = out.squeeze(dim=-1) # (16, )
loss = criterion(out, y)
2 BCELoss与BCEWithLogitsLoss的区别
PyTorch提供了两个类来计算二分类交叉熵(Binary Cross Entropy),分别是BCELoss() 和BCEWithLogitsLoss()。而他们的主要区别在于,在模型计算出样本的结果后,有没有使用Sigmoid函数。sigmoid函数-百度百科Sigmoid函数的作用是使模型输出的结果压缩到 [ 0 , 1 ] [0, 1] [0,1]之间,使得结果具有概率可解释性。详细的例子说明可以看参考文献【5】,给出的例子部分。这里再说一句,一般推荐使用BCEWithLogitsLoss函数作为交叉熵损失,结果更稳定(来着参考文献【5】的评论区)。
3 参考资料
[1]BCELoss()与BCEWithLogitsLoss()区别
[2]损失函数softmax_cross_entropy、binary_cross_entropy、sigmoid_cross_entropy之间的区别与联系
[3]逻辑回归的损失函数怎么理解?
[4]机器学习–LR逻辑回归与损失函数理解
[5]PyTorch学习笔记——二分类交叉熵损失函数