为什么 multi-class classification 会因 sigmoid 而失败?

Why does multi-class classification fails with sigmoid?

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

我正在尝试研究不同的激活如何影响最终结果,因此我使用 PyTorch 为 MNIST 实现了一个简单的网络。

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

当我将 softmax 作为最后一层的激活时,效果很好。 但是当我改用 sigmoid 时,我注意到事情分崩离析了

这是我的网络代码

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 + crossentropy可用于多标签分类(假设一张图片有狗和猫,你想让模型return"dog and cat")。它适用于 类 不互斥或样本包含多个您要识别的对象的情况。

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

所以,你真的不能指望 sigmoid 有这种行为。