Deep learning 为什么sigmoid的多类分类失败?

Deep learning 为什么sigmoid的多类分类失败?,deep-learning,pytorch,loss-function,multiclass-classification,activation-function,Deep Learning,Pytorch,Loss Function,Multiclass Classification,Activation Function,使用Sigmoid训练的MNIST失败,而Softmax工作正常 我试图研究不同的激活如何影响最终结果,所以我用PyTorch实现了一个简单的MNIST网络 我使用NLLLoss(负对数似然),因为它在与softmax一起使用时实现了交叉熵损失 当我将softmax作为最后一层的激活时,它工作得非常好。 但当我用乙状结肠替代时,我注意到东西会散架 这是我的网络代码 def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x

使用Sigmoid训练的MNIST失败,而Softmax工作正常

我试图研究不同的激活如何影响最终结果,所以我用PyTorch实现了一个简单的MNIST网络

我使用NLLLoss(负对数似然),因为它在与softmax一起使用时实现了交叉熵损失

当我将softmax作为最后一层的激活时,它工作得非常好。 但当我用乙状结肠替代时,我注意到东西会散架

这是我的网络代码

def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 80)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.XXXX(x)
其中XXXX是激活功能

Sigmoid和Softmax输出值均在(0,1)之间。 是的Softmax保证总和为1,但我不确定这是否能解释为什么Sigmoid训练失败。
这里有什么细节我没听清楚吗?

Sigmoid+交叉熵可用于多标签分类(假设图片中有一只狗和一只猫,您希望模型返回“狗和猫”)。当类不是互斥的,或者示例包含多个您想要识别的对象时,它就起作用了

在您的情况下,MNIST具有互斥类,并且在每个图像中只有一个数字,因此最好使用logsoftmax+负对数似然,它假设这些类互斥,并且只有一个正确的标签与图像关联


因此,您不能期望从sigmoid中获得这种行为。

sigmoid+交叉熵可用于多标签分类(假设图片中有一只狗和一只猫,您希望模型返回“狗和猫”)。当类不是互斥的,或者示例包含多个您想要识别的对象时,它就起作用了

在您的情况下,MNIST具有互斥类,并且在每个图像中只有一个数字,因此最好使用logsoftmax+负对数似然,它假设这些类互斥,并且只有一个正确的标签与图像关联


所以,你不能指望sigmoid会有这样的行为。

sigmoid因渐变消失而臭名昭著,这可能会影响你的最终结果。请注意,如果只有两个类,softmax实际上会减少为sigmoid。但是,我不明白您是如何实际使用sigmoid进行多类分类的。sigmoid因渐变消失而臭名昭著,这可能会影响您的最终结果。请注意,如果只有两个类,softmax实际上会减少为sigmoid。然而,我不明白你是如何使用sigmoid进行多类别分类的。你说的相互(排斥)是什么意思?MNIST中的图像不能同时是2和5,它是2或5 sigmoid+“二进制”交叉熵用于多标签分类,而不是sigmoid+交叉熵。正确的?你的第一行可能是misleading@BrandonLee交叉熵对mulitclass是有效的,在你的例子中它恰好是二进制的。@JibinMathew但是将sigmoid与CE一起使用不是很危险,因为CE(不是二进制的)具有互斥假设,而sigmoid没有?在整个培训过程中,我经历了一次崩溃,我认为这是由于假设的差异造成的。你说的相互(排斥)是什么意思?MNIST中的图像不能同时是2和5,它是2或5。sigmoid+“二进制”交叉熵用于多标签分类,而不是sigmoid+交叉熵。正确的?你的第一行可能是misleading@BrandonLee交叉熵对mulitclass是有效的,在你的例子中它恰好是二进制的。@JibinMathew但是将sigmoid与CE一起使用不是很危险,因为CE(不是二进制的)具有互斥假设,而sigmoid没有?在整个训练过程中,我经历了一次崩溃,我认为这是由于假设的差异造成的。