PyTorch 中的交叉熵函数 CrossEntropyLoss 的计算过程

CrossEntropyLoss() 函数联合调用了 nn.LogSoftmax() 和 nn.NLLLoss()。

假设网络得到的输出为 h h h,它的维度大小为 B × C B\times C B×C,其中 B B B 是 batch_size, C C C 是分类的总数目。与之对应的训练数据的标签 y y y 维度是 1 × B 1\times B 1×B y y y 中元素的取值范围是 [ 0 , C − 1 ] [0, C-1] [0,C1],即
0 ≤ y [ j ] ≤ C − 1 j = 0 , 1 , ⋯   , B − 1 0\le y[j]\le C-1 \qquad j = 0, 1, \cdots, B-1 0y[j]C1j=0,1,,B1

我们将CrossEntropyLoss() 函数的计算过程拆解为如下两个步骤:

  1. 对输出 h h h,执行LogSoftmax(dim=1),得到 s s s,维度仍然是 B × C B\times C B×C
  2. s s s 执行 − log ⁡ ( ) -\log() log()操作,得到负对数概率 p p p,维度仍然是 B × C B\times C B×C

则交叉熵的计算公式为:
(1) L = 1 B ∑ i = 0 B { − log ⁡ ( p [ i , y [ i ] ] ) } L = \frac{1}{B}\sum_{i=0}^B\left\{-\log(p[i,y[i]])\right\} \tag{1} L=B1i=0B{ log(p[i,y[i]])}(1)

式(1)其实是从式(2)化简得来的:
(2) L = 1 B ∑ i = 0 B { − ∑ j = 0 C − 1 y [ i , j ] log ⁡ ( p [ i , j ] ) } L = \frac{1}{B}\sum_{i=0}^B\left\{-\sum_{j=0}^{C-1}y[i, j]\log(p[i,j])\right\} \tag{2} L=B1i=0B{ j=0C1y[i,j]log(p[i,j])}

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值