文章目录
Loss Functions
(1) torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=- 100, reduce=None, reduction=‘mean’, label_smoothing=0.0)
交叉熵(CE)损失函数,该损失函数针对的使用对象是预测得到的softmax结果和目标标签值。比如,一个四分类任务,它的batchsize为2,那么经过网络的预测并softmax后就能得到如下的概率预测tensor
torch.tensor([[0.1, 0.05, 0.7, 0.15], [0.2, 0.3, 0.4, 0.1]])
如果这个batchsize中样本对应的真实标签是
torch.tensor([2, 0]),
那么就把概率预测tensor和真实标签放入该损失函数中计算损失。示例如下
loss = torch.nn.CrossEntropyLoss() #设置交叉熵损失函数
pre_probability = torch.tensor([[0.1, 0.05, 0.7, 0.15], [0.2, 0.3, 0.4, 0.1]]) # 假设网络输出了这样的softmax结果,batchsize为2,四分类任务
true_label = torch.tensor([2, 0]) #真实的第一个样本的标签值为2,第二个样本的标签值为0
Loss = loss(pre_probability, true_label) # 利用交叉熵损失函数计算他们的交叉熵
print(Loss)
# tensor(1.2081)
上面的
1.2081
1.2081
1.2081是这样计算得到的
首先,对第一个样本计算交叉熵损失
l
o
s
s
1
=
(
−
0.7
)
+
l
n
(
e
0.1
+
e
0.05
+
e
0.7
+
e
0.15
)
=
0.974
loss_1=(-0.7)+ln(e^{0.1}+e^{0.05}+e^{0.7}+e^{0.15})=0.974
loss1=(−0.7)+ln(e0.1+e0.05+e0.7+e0.15)=0.974
然后,再对第二个样本计算交叉熵损失
l
o
s
s
2
=
(
−
0.2
)
+
l
n
(
e
0.2
+
e
0.3
+
e
0.4
+
e
0.1
)
=
1.443
loss_2=(-0.2)+ln(e^{0.2}+e^{0.3}+e^{0.4}+e^{0.1})=1.443
loss2=(−0.2)+ln(e0.2+e0.3+e0.4+e0.1)=1.443
最后,对二者求平均,即
l
o
s
s
=
(
l
o
s
s
1
+
l
o
s
s
2
)
/
2
=
1.209
loss=(loss_1+loss_2)/2=1.209
loss=(loss1+loss2)/2=1.209
其实,这个计算交叉熵损失的方法和我们通常见到的不那么一样。对于每一个样本的交叉熵损失,我们可以分成两部分来看。第一部分是减去正确标签值对应的概率预测值,如果正确标签值的概率预测值越接近于
1
1
1,那么减去的就更多,损失就越小;第二部分我的理解是模糊性的一个度量,如果预测概率值在多个标签上都取差不多大,那么第二部分是比较大的,这个时候的预测是非常模糊的,因此其损失也就偏大。
(2) torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction=‘mean’)
二值交叉熵(Binary CrossEntropy)损失函数,该损失函数针对的使用对象是预测的概率结果和真实的“概率标签”。比如一幅图像在经过网络预测后得到是人的概率预测结果是
0.7
0.7
0.7,而这幅图像其实就是人,对应的所谓的“概率标签”是
1
1
1。
每个样本的交叉熵损失函数计算公式如下:
l
o
s
s
=
−
[
y
n
×
l
o
g
x
n
+
(
1
−
y
n
)
l
o
g
(
1
−
x
n
)
]
loss=-[y_n \times logx_n+(1-y_n)log(1-x_n)]
loss=−[yn×logxn+(1−yn)log(1−xn)]
这里的
y
n
y_n
yn是样本的概率标签,
x
n
x_n
xn是样本经过网络得到的预测概率。
举个例子,比如一批四个样本经过网络得到的预测结果为
output = torch.tensor([0.1, 0.7, 0.5, 0.2])
每一个分量都代表一个由样本经过网络得到的预测概率值。它们对应的概率标签为
target = torch.tensor([1, 1, 0, 0], dtype=torch.float32)
那么我们计算这批样本的二值交叉熵(BCE)就是:
L
o
s
s
=
−
[
(
l
n
0.1
+
l
n
0.7
+
l
n
(
1
−
0.5
)
+
l
n
(
1
−
0.2
)
]
/
4
=
0.894
Loss=-[(ln0.1+ln0.7+ln(1-0.5)+ln(1-0.2)]/4=0.894
Loss=−[(ln0.1+ln0.7+ln(1−0.5)+ln(1−0.2)]/4=0.894
但是有的时候会出现
l
n
0
ln0
ln0这样的情况,这时计算的结果为负无穷,在Pytorch中也是这么定义的。Pytorch的处理手段是如果结果小于等于-100,那么就直接截断。
使用示例如下
output = torch.tensor([0.1, 0.7, 0.5, 0.2])
target = torch.tensor([1, 1, 0, 0], dtype=torch.float32)
criterion = nn.BCELoss()
loss = criterion(output, target)
print(loss)
# tensor(0.8939)