PyTorch LogSoftmax 与 Softmax 的 CrossEntropyLoss

Jac*_*own 5 cross-entropy pytorch

我知道 PyTorch 的 LogSoftmax 函数基本上只是一种在数值上更稳定的计算Log(Softmax(x)). Softmax 可让您将线性层的输出转换为分类概率分布。

pytorch文件说,CrossEntropyLoss联合收割机nn.LogSoftmax()nn.NLLLoss()在一个单独的类。

看着NLLLoss,我还是很困惑......是否有2个日志正在使用?我认为负日志是事件的信息内容。(如

多看几眼后,我认为NLLLoss假设您实际上是在传递对数概率,而不仅仅是概率。这样对吗?如果是这样,这有点奇怪......

kHa*_*hit 8

是的,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()在一个单一的类。因此,传入的网络输出nn.CrossEntropyLoss需要是网络的原始输出(称为 logits),而不是 softmax 函数的输出。

  • NLLoss() 没有日志是 PyTorch 的一个怪癖。负对数似然的定义中有一个对数:https://notesbylex.com/negative-log-likelihood.html。OP 感到困惑是正确的。 (3认同)
  • 鉴于网络在训练期间向交叉熵损失提供原始输出,我是否需要在推理期间添加 LogSoftMax 层? (2认同)