上节课介绍了Cross Entropy 与 Enropy的区别,本节介绍Cross Entropy到底在二分类问题中是如何运算的。
假设面对的是猫狗的二分类问题,此时的Cross Entropy的表示公式为:
为更好的理解,我们以5分类问题进行解释
实际值为小猫。
当模型预测效果较好时
这里注意到使用Cross Entropy实现了0.9→0.02的过程。但采用MSE法,只能下降0.3左右。因此在分类问题上,采用Cross Entropy具有更快的运算速度。
另外目前主流上也不将MSE用于分类问题上,原因在于:
(1) Sigmoid MSE的方法有时会造成梯度离散的现象,且会增加training的难度。
(2) 采用Cross Entropy进行分类的速度会更快。
(3) 但也要学会变通,对于前沿问题上,若采用Cross Entropy法收敛效果不佳,可以使用MSE尝试一下。因为MSE法更为简单,且新算法刚出现时,使用时通常会伴随各种问题,采用MSE法的效果常常会更好。
至此我们以基本上了解了一个神经网络所具备的全部结构,那么在这里以简图绘制
输入值先变线型模型再经logit和softmax,通过CrossEntorpy计算输出label。
以代码具体示例
代码语言:javascript复制import torch
import torch.nn.functional as F
x = torch.randn(1, 784)
w = torch.randn(10, 784)
logits = x@w.t()
# 将w与x相乘,变为x*w b模型
pred = F.softmax(logits, dim=1)
pred_log = torch.log(pred)
# 这里为了示例,设置了pred的log值作为对照
# 下面进行softmax
a = F.cross_entropy(logits, torch.tensor([3]))
# 这里要格外注意,cross_entropy函数默认包含了softmax功能,因此后面要传入的是logits,
# 此时若传入pred,再运行上段代码时会额外进行一次softmax
print('a:', a)
# 这里若想自己手动完成,则要改写代码为.bll_loss函数
b = F.nll_loss(pred_log, torch.tensor([3]))
print('b:', b)
分别输出为
代码语言:javascript复制a: tensor(70.4491)
b: tensor(70.4491)
两者的结果一致
总结为:若使用Cross Entropy,则会默认使用了softmax log nll_loss三个函数功能。