【问题标题】:Why does multi-class classification fails with sigmoid?为什么多类分类会因 sigmoid 而失败?
【发布时间】:2019-08-23 02:23:08
【问题描述】:

使用 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 因梯度消失而臭名昭著,这可能会影响您的最终结果
  • 请注意,如果只有 2 个类,softmax 实际上会减少到 sigmoid。但是,我无法理解您实际上是如何使用 sigmoid 进行多类分类的。

标签: deep-learning pytorch loss-function multiclass-classification activation-function


【解决方案1】:

Sigmoid + 交叉熵可以用于多标签分类(假设一张图片有一只狗和一只猫,你希望模型返回“狗和猫”)。当类不互斥或样本包含多个您要识别的对象时,它可以工作。

在您的情况下,MNIST 具有互斥类,并且在每个图像中只有一个数字,因此最好使用 logsoftmax + 负对数似然,它假设类是互斥的并且只有一个与图片。

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

【讨论】:

  • 相互(排他)是什么意思?
  • MNIST 中的图像不能同时是 2 和 5,它是 2 或 5
  • Sigmoid + "binary" 交叉熵用于多标签分类,而不是 sigmoid + 交叉熵。正确的?您的第一行可能具有误导性
  • @BrandonLee 交叉熵对多类有效,它恰好是您的情况的二进制。
  • @JibinMathew 但是将 sigmoid 与 CE 一起使用是否危险,因为 CE(不是二进制)具有互斥假设而 sigmoid 没有?我在整个训练过程中都经历过崩溃,我认为这是由于假设不同造成的。
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
相关资源
最近更新 更多