Advertisement

pytorch:交叉熵(cross entropy)

阅读量:

1、entropy

也被认为是另一种形式,并且还可以称为不确定性;此外还可以称为惊喜度(measure of surprise)

Entropy=-um PlogP

=

um Plog

如果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)=

-um peft logqeft

推导成

Heft =Heft +D_{KL}eft

其中,在后文中涉及的KL散度(Kullback-Leibler divergence)实际上是衡量两个概率分布之间差异程度的真实指标。当所考察的概率分布p与q之间相似度较小时,则其散度值较大;而当p与q完全相同时,则其值趋近于0。

所以有结论,p=q时,H(p,q)=H(p)即cross entropy=entropy

当采用0-1分布时,H(p)=0,刚好优化

D_{KL}eft

举例说明

而当我们得到的模型概率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)

还没有任何评论哟~