交叉熵公式:
H ( p , q ) = − ∑ p l o g q H(p,q) = - \sum plogq H(p,q)=−∑plogq
为啥使用交叉熵,先看一组例子对比
如果对于多分类的真实值的概率为q = [1, 0, 0, 0, 0] 可以理解为,[是猫,非猫,非猫,非猫,非猫]
多分类的预测值的概率为(第一组)p = [0.4, 0.3, 0.05, 0.05, 0.2] 则计算交叉熵结果为:0.916
如果预测值的结果为另一组(第二组)即p=[0.98, 0.01, 0, 0, 0.01]则交叉熵的结果为:0.02
经过对比发现第一组的交叉熵的结果比第二组的大不少,如果作为损失,我们当然首选第二组,因为损失越小,越说明我们的预测结果和真实结果越接近在代码中使用:
x = torch.randn(1, 784)
w = torch.randn(10, 784)
x_w = x@w.T # 向量计算
print(x_w.shape) # torch.Size([1, 10])
pred = F.softmax(x_w, dim=1) # 按行计算softmax
print(pred.shape) # torch.Size([1, 10])
pred_log = torch.log(pred)
result = F.nll_loss(pred_log, torch.tensor([3]))
print(result) # tensor(7.0880) 因为随机所以每次结果会不一样但是result和cross_result的结果一样
# 下边这个cross_entropy等价于上边的三个操作的集合即
# cross_entropy == softmax+log+nll_loss
cross_result = F.cross_entropy(x_w, torch.tensor([3]))
print(cross_result) # tensor(7.0880) 因为随机所以每次结果会不一样但是result和cross_result的结果一样