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 函数的输出。