pytorch:交叉熵(cross entropy)
发布时间
阅读量:
阅读量
1、entropy
也被认为是另一种形式,并且还可以称为不确定性;此外还可以称为惊喜度(measure of surprise)

=

如果p(x)采用0-1分部,那么entropy=1log1=0
而对于entropy越大,即熵越大,越不稳定,惊喜度越高
例
import torch
a=torch.full([4],1/4.)
a*torch.log2(a)
# tensor([-0.5000, -0.5000, -0.5000, -0.5000])
-(a*torch.log2(a)).sum()
#输出 tensor(2.)
输出熵为2,不确定性较大惊喜度就比较高
import torch
a=torch.tensor([0.001,0.001,0.001,0.999])
-(a*torch.log2(a)).sum()
# 输出tensor(0.0313)
此时,输出熵为0.0313,比较小,不确定性小,惊喜度很低。
2、cross entropy
cross entropy有两个分部,H(p,q)=

推导成

其中,在后文中涉及的KL散度(Kullback-Leibler divergence)实际上是衡量两个概率分布之间差异程度的真实指标。当所考察的概率分布p与q之间相似度较小时,则其散度值较大;而当p与q完全相同时,则其值趋近于0。
所以有结论,p=q时,H(p,q)=H(p)即cross entropy=entropy
当采用0-1分布时,H(p)=0,刚好优化

举例说明

而当我们得到的模型概率q(x)变化时,得到以下结果。

3、为什么不用MSE?
原因:(1)在采用Sigmoid配合MSE损失函数时,可能会导致Sigmoid单元发生梯度消失现象。
(2)梯度信息小,收敛慢
(3)但是偶尔cross entropy不行的时候,可以考虑MSE
4、总结
一个神经网络的流程

python中cross entropy()=softmax()+log+null_loss()
代码过程
import torch
import torch.nn.functional as F
x=torch.randn(1,784)
w=torch.randn(10,784)
logits=x@w.t() # x和w矩阵相乘加上b得到logits
pred=F.softmax(logits,dim=1) # 经过softmax得到一个pred
pred_log=torch.log(pred) # 进行log操作,得到log(pred)
F.cross_entropy(logits,torch.tensor([3])) # 使用cross entropy 第一项必须是logits,因为cross entropy内有softmax
# python中cross entropy()=softmax()+log+null_loss()
#输出tensor(2.9087)
F.nll_loss(pred_log,torch.tensor([3]))
#输出tensor(2.9087)
全部评论 (0)
还没有任何评论哟~
