PyTorch LogSoftmax 与 Softmax 的交叉熵损失
PyTorch LogSoftmax vs Softmax for CrossEntropyLoss
我知道 PyTorch 的 LogSoftmax 函数基本上只是一种计算 Log(Softmax(x))
的数值更稳定的方法。 Softmax 可让您将线性层的输出转换为分类概率分布。
pytorch documentation 表示 CrossEntropyLoss 将 nn.LogSoftmax()
和 nn.NLLLoss()
合并为一个 class。
看着NLLLoss
,我还是一头雾水……是不是有2条日志被使用了?我认为负日志是一个事件的信息内容。 (如 entropy)
仔细观察后,我认为 NLLLoss
假设您实际上传递的是对数概率,而不仅仅是概率。这个对吗?如果是这样的话有点奇怪...
是的,NLLLoss
将对数概率 (log(softmax(x))
) 作为输入。为什么?。因为如果你添加一个nn.LogSoftmax
(或F.log_softmax
)作为模型输出的最后一层,你可以使用torch.exp(output)
轻松获得概率,并且为了获得交叉熵损失,你可以直接使用nn.NLLLoss
。当然你说的log-softmax更稳定
而且,只有一个日志(在 nn.LogSoftmax
中)。没有登录 nn.NLLLoss
.
nn.CrossEntropyLoss()
将 nn.LogSoftmax()
(log(softmax(x))
) 和 nn.NLLLoss()
合并为一个 class。因此,传入 nn.CrossEntropyLoss
的网络输出需要是网络的原始输出(称为 logits),而不是 softmax 函数的输出。
我知道 PyTorch 的 LogSoftmax 函数基本上只是一种计算 Log(Softmax(x))
的数值更稳定的方法。 Softmax 可让您将线性层的输出转换为分类概率分布。
pytorch documentation 表示 CrossEntropyLoss 将 nn.LogSoftmax()
和 nn.NLLLoss()
合并为一个 class。
看着NLLLoss
,我还是一头雾水……是不是有2条日志被使用了?我认为负日志是一个事件的信息内容。 (如 entropy)
仔细观察后,我认为 NLLLoss
假设您实际上传递的是对数概率,而不仅仅是概率。这个对吗?如果是这样的话有点奇怪...
是的,NLLLoss
将对数概率 (log(softmax(x))
) 作为输入。为什么?。因为如果你添加一个nn.LogSoftmax
(或F.log_softmax
)作为模型输出的最后一层,你可以使用torch.exp(output)
轻松获得概率,并且为了获得交叉熵损失,你可以直接使用nn.NLLLoss
。当然你说的log-softmax更稳定
而且,只有一个日志(在 nn.LogSoftmax
中)。没有登录 nn.NLLLoss
.
nn.CrossEntropyLoss()
将 nn.LogSoftmax()
(log(softmax(x))
) 和 nn.NLLLoss()
合并为一个 class。因此,传入 nn.CrossEntropyLoss
的网络输出需要是网络的原始输出(称为 logits),而不是 softmax 函数的输出。