交叉熵

损失函数 - 图1
用来 描述实际值与预测值的差别 ,差别越大 损失函数 - 图2

  • 0.5 ln(0.5) = -0.346 ```python import torch import torch.nn as nn x_input=torch.randn(3,3)#随机生成输入 print(‘x_input:\n’,x_input) y_target=torch.tensor([1,2,0])#设置输出具体值 print(‘y_target\n’,y_target)

计算输入softmax,此时可以看到每一行加到一起结果都是1

softmax_func=nn.Softmax(dim=1) soft_output=softmax_func(x_input) print(‘soft_output:\n’,soft_output)

在softmax的基础上取log

log_output=torch.log(soft_output) print(‘log_output:\n’,log_output)

对比softmax与log的结合与nn.LogSoftmaxloss(负对数似然损失)的输出结果,发现两者是一致的。

logsoftmax_func=nn.LogSoftmax(dim=1) logsoftmax_output=logsoftmax_func(x_input) print(‘logsoftmax_output:\n’,logsoftmax_output)

pytorch中关于NLLLoss的默认参数配置为:reducetion=True、size_average=True

nllloss_func=nn.NLLLoss() nlloss_output=nllloss_func(logsoftmax_output,y_target) print(‘nlloss_output:\n’,nlloss_output)

直接使用pytorch中的loss_func=nn.CrossEntropyLoss()看与经过NLLLoss的计算是不是一样

crossentropyloss=nn.CrossEntropyLoss() crossentropyloss_output=crossentropyloss(x_input,y_target) print(‘crossentropyloss_output:\n’,crossentropyloss_output)

  1. - softmax 将数值转换成 概率, 和为1
  2. - log ln), softmax后的(0, 1)间的数,变负数
  3. - [https://linjunhui.iok.la:4433/notebooks/NLP/作业一:语言模型参考答案/基础.ipynb](https://linjunhui.iok.la:4433/notebooks/NLP/作业一:语言模型参考答案/基础.ipynb)
  4. <a name="D61o4"></a>
  5. ### NLLLoss
  6. ```python
  7. import torch
  8. from torch import nn
  9. log=torch.tensor([[-0.7031, -2.0555, -0.9758],
  10. [-0.3294, -2.9265, -1.4826]])
  11. label = torch.tensor([0, 2])
  12. loss = nn.NLLLoss()
  13. loss(log, label)
  • log 的维度 和 类别个数有关
  • label 中个取值 不能超过 类别个数
  • label 按照log 展开,再按位置相乘
  • 再按label个数求平均,取负数