NLL_LOSS与CROSS_ENTROPY_LOSS详解

常用损失函数

nll

官方文档

torch.nn.functional.nll_loss(input, target, weight=None, size_average=None, 
ignore_index=- 100, reduce=None, reduction='mean')
  1. i n p u t , ( N , C ) ;   t a r g e t , ( N ) ;   w e i g h t , ( C ) input, (N, C); \ target,(N);\ weight,(C) input,(N,C); target,(N); weight,(C)
  2. N , C N,C N,C分别为批大小batch_size和类别数class_num
  3. reduction及函数含义:选取target对应下标的结果,在batch维,求和(reduction=‘sum’)或求平均(mean)或不操作(none)作为结果。
    size_average和reduce作用类似,应该不用管。
  4. 返回值形状为 ( 1 ) (1) (1) ( N ) ( n o n e 情况下 ) (N) (none情况下) (N)(none情况下)
  5. ignore_index为忽略指定下标的值,不参与计算以及梯度传递。

cross_entropy

torch.nn.functional.cross_entropy(input, target, weight=None, size_average=None,
 ignore_index=- 100, reduce=None, reduction='mean', label_smoothing=0.0)
  1. 参数和返回值与NLL_LOSS基本一致。
  2. 含义:nll取下标的结果先softmax后取对数,并加负号。 − l o g ( s o f t m a x ( n l l ( X ) ) ) -log(softmax(nll(X))) log(softmax(nll(X)))
    此处softmax即exp(下标结果)与∑exp(每个结果)比值。
    log即ln自然对数。
  3. 解释:softmax首先得到一个类似概率的结果,取值(0,1),然后取对数为一个负值结果,在加上符号得到一个正的损失值。
    当下标对应值结果大时,softmax结果更接近1,取log的负值越接近0,损失值也就越小(越接近0)。
    同理,下标对应值小时,softmax结果接近0,取log的结果为负无穷,损失值为正无穷。

一段代码

def loss_fn(out, tar):
    out = out.view(-1, out.shape[-1])
    tar = tar.view(-1)
    return F.cross_entropy(out, tar, ignore_index=2)  # pad

transformer中的一段经典代码

  1. 此处比较结果out与tar目标值,来计算损失。
  2. 变量形状:out为 ( N , L , C ) (N, L, C) (N,L,C),tar为 ( N , L ) (N, L) (N,L)。其中L为句子长度,需要针对每个词计算损失。
  3. 这里在使用前先将out和tar通过view转为了 ( N ∗ L , C ) (N*L,C) (NL,C) ( N ∗ L ) (N*L) (NL)形状,然后再来计算每个词的损失。
  4. 不转的话,按照函数定义,需要将out中的C转到第二维(中间)(N,C,L)。
  5. ignore_index为忽略下标为2的tar结果,此处为pad填充,即transformer中mask掉的值。
  6. 最终结果为每个词的损失的平均值。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bit_lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值