PyTorch中交叉熵的计算-CrossEntropyLoss介绍

  • A+
所属分类:深度学习
摘要这一篇文章介绍关于PyTorch中CrossEntropy. 也就是交叉熵的计算. 因为CrossEntropy不单单是计算交叉熵, 而是还会包含Softmax在里面, 所以这里一步一步详细看一下里面的计算过程.

简介

在这里我们想结合实际的例子, 来计算一下CrossEntropyLoss是如何计算的. 同时也可以再强化一下交叉熵的计算.

关于交叉熵的一些推导性的内容, 可以参考链接:

关于详细的notebook, 可以在GitHub进行查看PyTorch交叉熵介绍(CrossEntropy介绍)

 

CrossEntropyLoss的理解

因为CrossEntropyLoss是由LogSoftmax和NLLLoss这两个类结合而来的, 所以我们先来介绍一下这两个类的用法. 最后再看一下CrossEntropyLoss的一个整体的计算流程.

LogSoftmax的介绍

关于LogSoftmax所作的操作, 即先进行Softmax, 再对Softmax的结果求对数.

PyTorch中交叉熵的计算-CrossEntropyLoss介绍

我们下面看一个具体的例子, 我们的输入是(1,1,1,1), 那么LogSoftmax就是进行如下的操作.

PyTorch中交叉熵的计算-CrossEntropyLoss介绍

拆开来, 就是分为两步, 首先计算Softmax, 最后对结果求Log.

PyTorch中交叉熵的计算-CrossEntropyLoss介绍

我们看一下使用PyTorch的计算结果, 可以看到和上面我们自己计算是一样的.

  1. ll = nn.LogSoftmax()
  2. input = torch.tensor([1.0,1.0,1.0,1.0])
  3. output = ll(input)
  4. print(output)
  5. >> tensor([-1.3863, -1.3863, -1.3863, -1.3863])

 

NLLLoss的介绍

在说明文档中, NLLLoss计算方式如下, 就是使用predict与label进行相乘.

PyTorch中交叉熵的计算-CrossEntropyLoss介绍

我们还是看一个下面的例子.

  1. loss = nn.NLLLoss()
  2. input = torch.tensor([[0.2, 0.3, 0.5]])
  3. target = torch.tensor([2]).long()
  4. output = loss(input, target)
  5. print(output)
  6. >> tensor(-0.5000)

上面的例子中, target为2, 也就是表示one-hot表示为(0,0,1), 于是NLLLoss的计算如下所示.

PyTorch中交叉熵的计算-CrossEntropyLoss介绍

 

 

CrossEntropyLoss的介绍

介绍完上面两个部分, 我们就可以介绍在PyTorch中的交叉熵了. 但是我们首先看一下交叉熵是如何进行计算的.

交叉熵计算

首先我们先不管Pytorch中是如何实现交叉熵的, 我们先自己来看一下交叉熵是如何计算的. 交叉熵的计算公式如下所示:

PyTorch中交叉熵的计算-CrossEntropyLoss介绍

其中:

PyTorch中交叉熵的计算-CrossEntropyLoss介绍

那么, 当现在的输出的概率是(1/4, 1/4, 1/4, 1/4)的时候, target是(0, 0, 0, 1)的时候, 此时的交叉熵计算结果就是1.3863.

PyTorch中交叉熵的计算-CrossEntropyLoss介绍

 

关于PyTorch中的CrossEntropyLoss

下面我们看一下PyTorch中CrossEntropy是如何计算的. 前面说了, CrossEntropy是LogSoftmax和NLLLoss的结合. (下面我直接截个图, 里面公式比较多, 一个一个讲比较麻烦, 原始的可以查看GitHub链接PyTorch交叉熵介绍(CrossEntropy介绍))

PyTorch中交叉熵的计算-CrossEntropyLoss介绍

这个结果是和上面交叉熵的定义是一样的. 我们可以想象成在LogSoftmax中, 我们不仅将原来的output转换为了概率值, 还求了log, 最后只需要和target相乘即可.

 

CrossEntropyLoss实验验证

接下来我们实际操作一下, 来验证一下上面的结论. 我们只需要将CrossEntropyLoss的input设置为(1,1,1,1), 这样经过softmax之后的概率就(1/4,1/4,1/4,1/4), 所以这里计算得到的交叉熵应该是1.3863.

  1. loss = nn.CrossEntropyLoss()
  2. input = torch.tensor([[1, 1, 1.0, 1]])
  3. target = torch.tensor([2]).long()
  4. output = loss(input, target)
  5. print(output)
  6. >> tensor(1.3863)

同时, 我们还知道

  • 当预测的概率为(1,0,0), 实际值(target)是(1,0,0)的时候, 交叉熵是接近0的.
  • 当预测的概率为(0,0,1), 实际值(target)是(1,0,0)的时候, 交叉熵是接近正无穷的.
  1. # 预测和实际很接近
  2. loss = nn.CrossEntropyLoss()
  3. input = torch.tensor([[0, 0, 100.0]])
  4. target = torch.tensor([2]).long()
  5. output = loss(input, target)
  6. print(output)
  7. >> tensor(0.)

当预测结果和实际相差较远的时候.

  1. # 预测和实际差很远
  2. loss = nn.CrossEntropyLoss()
  3. input = torch.tensor([[100.0, 0, 0]])
  4. target = torch.tensor([2]).long()
  5. output = loss(input, target)
  6. print(output)
  7. >> tensor(100.)

 

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: