【问题标题】:PyTorch LogSoftmax vs Softmax for CrossEntropyLoss针对 CrossEntropyLoss 的 PyTorch LogSoftmax 与 Softmax
【发布时间】:2021-03-19 09:27:10
【问题描述】:

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

pytorch documentation 表示 CrossEntropyLoss 将 nn.LogSoftmax()nn.NLLLoss() 组合在一个类中。

看着NLLLoss,我还是一头雾水……是不是有2个日志在用?我认为负面日志是事件的信息内容。 (如entropy

多看几眼后,我认为NLLLoss 假设您实际上是在传递对数概率,而不仅仅是概率。它是否正确?如果是这样,那就有点奇怪了……

【问题讨论】:

    标签: pytorch cross-entropy


    【解决方案1】:

    是的,NLLLoss 将日志概率 (log(softmax(x))) 作为输入。为什么?。因为如果你添加一个nn.LogSoftmax(或F.log_softmax)作为模型输出的最后一层,你可以很容易地使用torch.exp(output)得到概率,并且为了得到交叉熵损失,你可以直接使用@987654326 @。当然,你说的 log-softmax 更稳定。

    而且,只有一个日志(在nn.LogSoftmax 中)。 nn.NLLLoss没有登录。

    nn.CrossEntropyLoss()nn.LogSoftmax() (log(softmax(x))) 和nn.NLLLoss() 组合在一个类中。因此,传递给nn.CrossEntropyLoss 的网络输出需要是网络的原始输出(称为logits),而不是softmax 函数的输出。

    【讨论】:

    • 鉴于网络在训练期间将原始输出提供给交叉熵损失,我是否需要在推理期间添加 LogSoftMax 层?
    • 不一定,如果你想得到概率,那么只有你想使用 Softmax,只要你的模型给出 logits。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2021-03-08
    • 2021-03-16
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多