BCE
l
o
s
s
(
o
,
t
)
=
−
1
N
∑
i
(
t
[
i
]
⋅
l
o
g
(
o
[
i
]
)
+
(
1
−
t
[
i
]
)
⋅
l
o
g
(
1
−
o
[
i
]
)
)
loss(o,t)=-\frac{1}{N}\sum_i(t[i]\cdot log(o[i])+(1-t[i])\cdot log(1-o[i]))
loss(o,t)=−N1i∑(t[i]⋅log(o[i])+(1−t[i])⋅log(1−o[i]))
其中t为标签,只包含{0,1},o为预测值。
编程实现和 pytorch 内部函数的对比
import torch
import torch.nn.functional as F
o=torch.FloatTensor([[0.8,0.6],[0.3,0.9]])
t=torch.FloatTensor([[0,1],[0,1]])
loss=F.binary_cross_entropy(o,t)
print(loss)
输出:tensor(0.6456)
import numpy as np
loss = -0.25*(np.log(0.2)+np.log(0.6)+np.log(0.7)+np.log(0.9))
print(loss)
输出:0.6455747489491624
Cross-Entropy
其中,q(y)是真实分布,p(y)是预测的分布。
假设模型完美,则q(y)=p(y),此时会有 交叉熵 = 熵。
一般交叉熵会比在真实分布上计算出来的熵要大:
这个差值叫KL散度,衡量两个分布之间的不相似性(dissimilarity )。
两个分布越相似,KL散度值越小。