交叉熵
用来 描述实际值与预测值的差别 ,差别越大
- 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)
- softmax 将数值转换成 概率, 和为1
- log (ln), softmax后的(0, 1)间的数,变负数
- [https://linjunhui.iok.la:4433/notebooks/NLP/作业一:语言模型参考答案/基础.ipynb](https://linjunhui.iok.la:4433/notebooks/NLP/作业一:语言模型参考答案/基础.ipynb)
<a name="D61o4"></a>
### NLLLoss
```python
import torch
from torch import nn
log=torch.tensor([[-0.7031, -2.0555, -0.9758],
[-0.3294, -2.9265, -1.4826]])
label = torch.tensor([0, 2])
loss = nn.NLLLoss()
loss(log, label)
- log 的维度 和 类别个数有关
- label 中个取值 不能超过 类别个数
- label 按照log 展开,再按位置相乘
- 再按label个数求平均,取负数