(三)PyTorch学习笔记——softmax和log_softmax的区别、CrossEntropyLoss() 与 NLLLoss() 的区别、log似然代价函数

1、softmax

函数 Softmax(x) 也是一个 non-linearity, 但它的特殊之处在于它通常是网络中一次操作. 这是因为它接受了一个实数向量并返回一个概率分布.其定义如下. 定义 x 是一个实数的向量(正数或负数都无所谓, 没有限制). 然后, 第i个 Softmax(x) 的组成是

exp ( x i ) j exp ( x j )

输出是一个概率分布: 每个元素都是非负的, 并且所有元素的总和都是1.

2、log_softmax

在softmax的结果上再做多一次log运算

While mathematically equivalent to log(softmax(x)), doing these two
    operations separately is slower, and numerically unstable. This function
    uses an alternative formulation to compute the output and gradient correctly.
虽然在数学上等价于log(softmax(x)),但做这两个

单独操作速度较慢,数值上也不稳定。这个函数

使用另一种公式来正确计算输出和梯度。

测试:


import torch
import torch.autograd as autograd
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import numpy as np

data=autograd.Variable(torch.FloatTensor([1.0,2.0,3.0]))
log_softmax=F.log_softmax(data,dim=0)
print(log_softmax)

softmax=F.softmax(data,dim=0)
print(softmax)

np_softmax=softmax.data.numpy()
log_np_softmax=np.log(np_softmax)
print(log_np_softmax)

3、nn.CrossEntropyLoss() 与 NLLLoss()

NLLLoss 的 输入 是一个对数概率向量和一个目标标签. 它不会为我们计算对数概率. 适合网络的最后一层是log_softmax. 损失函数 nn.CrossEntropyLoss() 与 NLLLoss() 相同, 唯一的不同是它为我们去做 softmax.

4、log似然代价函数

C = k y k l o g a k

其中, a k 表示第k个神经元的输出值; y k 表示第k个神经元对应的真实值,取值为0或1。实际上,做分类时候,只有一个 y k 为1,其他均为0,最终结果是 C = y k l o g a k a k 对应着正确的那一个分类,log默认是e为底, a k [ 0 , 1 ] ,当 a k 最大时候,C=0),损失为0.

猜你喜欢

转载自blog.csdn.net/hao5335156/article/details/80607732