gpt4 book ai didi

deep-learning - 从 BCEWithLogitLoss(二元交叉熵 + Sigmoid 激活)计算损失后使用 Softmax 激活函数

转载 作者:行者123 更新时间:2023-12-02 16:39:05 24 4
gpt4 key购买 nike

我正在学习使用 PyTorch 的二元分类教程,在这里,网络的最后一层是 torch.Linear(),只有一个神经元。 (有道理)这会给我们一个神经元。作为 pred=network(input_batch)

之后损失函数的选择是loss_fn=BCEWithLogitsLoss()(这比先使用softmax再计算损失在数值上更稳定)将应用Softmax函数到最后一层的输出给我们一个概率。所以在那之后,它会计算二元交叉熵来最小化损失。

loss=loss_fn(pred,true)

我担心的是,在这之后,作者使用了 torch.round(torch.sigmoid(pred))

为什么会这样?我的意思是我知道它将获得 [0,1] 范围内的预测概率,然后使用默认阈值 0.5 对值进行舍入。

在网络的最后一层之后使用一次 sigmoid 而不是在 2 个不同的地方使用 softmax 和 sigmoid 是不是更好?

这样不是更好吗

out = self.linear(batch_tensor)
return self.sigmoid(out)

然后计算BCE损失并使用argmax()检查准确性??

我很好奇这会是一个有效的策略吗?

最佳答案

您似乎将二元分类视为具有两个类的多类分类,但在使用二元交叉熵方法时这并不完全正确。在查看任何实现细节之前,让我们首先阐明二元分类的目标。

从技术上讲,有两个类,0 和 1,但您可以将它们视为彼此相反的两个类,而不是将它们视为两个单独的类。例如,您想要对 StackOverflow 答案是否有帮助进行分类。这两个类将“有帮助”“无帮助”。自然地,您会简单地问“答案有用吗?”,负面的方面被忽略了,如果不是这样,您可以推断它“没有帮助” 。 (请记住,这是一个二元案例,没有中间立场)。

因此,您的模型只需要预测一个类,但为了避免与实际的两个类混淆,可以表示为:模型预测正例发生的概率。在上一个示例的上下文中:StackOverflow 答案有帮助的概率是多少?

Sigmoid 为您提供 [0, 1] 范围内的值,这是概率。现在您需要通过定义阈值来确定模型何时有足够的信心使其为正。为了使其平衡,阈值为 0.5,因此只要概率大于 0.5 就是正的(第 1 类:“有帮助”),否则就是负的(第 0 类:“没有”有帮助”),这是通过舍入实现的(即 torch.round(torch.sigmoid(pred)))。

After that the choice of Loss function is loss_fn=BCEWithLogitsLoss() (which is numerically stable than using the softmax first and then calculating loss) which will apply Softmax function to the output of last layer to give us a probability.

Isn't it better to use the sigmoid once after the last layer within the network rather using a softmax and a sigmoid at 2 different places given it's a binary classification??

BCEWithLogitsLoss 应用 Sigmoid 而不是 Softmax,根本不涉及 Softmax。来自nn.BCEWithLogitsLoss documentation :

This loss combines a Sigmoid layer and the BCELoss in one single class. This version is more numerically stable than using a plain Sigmoid followed by a BCELoss as, by combining the operations into one layer, we take advantage of the log-sum-exp trick for numerical stability.

通过在模型中不应用 Sigmoid,您可以获得数值更稳定的二元交叉熵版本,但这意味着如果您想在训练之外进行实际预测,则必须手动应用 Sigmoid。

[...] and use the argmax() for checking accuracy??

同样,您正在考虑多类场景。您只有一个输出类,即输出的大小为 [batch_size, 1]。取其中的 argmax,将始终为您提供 0,因为这是唯一可用的类。

关于deep-learning - 从 BCEWithLogitLoss(二元交叉熵 + Sigmoid 激活)计算损失后使用 Softmax 激活函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62045186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com