【问题标题】:Sigmoid activation for multi-class classification?用于多类分类的 Sigmoid 激活?
【发布时间】:2018-10-04 01:46:09
【问题描述】:

我正在从头开始实现一个简单的神经网络,只是为了练习。对于二进制分类问题,我已经让它与 sigmoid、tanh 和 ReLU 激活一起正常工作。我现在正试图将它用于多类、互斥的问题。当然,softmax 是最好的选择。

不幸的是,我在理解如何在反向传播中实现 softmax、交叉熵损失及其衍生物时遇到了很多麻烦。即使在此处和 Cross Validated 上提出了几个问题,我也无法获得任何好的指导。

在我尝试进一步实现 softmax 之前,是否有可能以某种方式使用 sigmoid 来解决多类问题(我试图预测 n 个字符中的 1 个,它们被编码为 one-hot 向量)?如果是这样,哪个损失函数最好?我一直在对所有二元分类使用平方误差。

【问题讨论】:

  • 我不完全清楚你在找什么。您不需要多类分类器作为神经网络本身的激活函数来生成多类分类。构建多类神经网络的方法不是调整单个神经元中的激活函数,而是让输出层每个类包含一个节点。
  • 对不起,我想问我的问题的更好方法是:因为我的类是互斥的,softmax 显然是最好的,因为你会把概率最高的类作为预测,是吗仍然可以使用 sigmoid (输出不会是互斥概率)并且只取具有最高 sigmoid 值的输出?神经网络能学会以这种方式有效地工作吗?
  • 您当然可以通过运行一堆一对多的分类器并从中挑选得分最高的类来创建一个多类分类器。我的猜测是这很难应用反向传播。 Softmax 是可微的,应该更容易在 NN 中使用。
  • @Metropolis 我知道这超出了问题的范围,但是如果您愿意,我很乐意在聊天中将我的代码发送给您,以讨论我使用 softmax 的尝试实现,看看您是否可以改进一下?
  • 顺便说一句,它只是 Python 和 numpy。

标签: machine-learning classification softmax activation-function sigmoid


【解决方案1】:

你问的是一个非常广泛的问题。

  • 据我所知,当类变为 2 时,softmax 函数将与 sigmoid 相同,所以它们是相关的。交叉熵可能是最好的损失函数。
  • 对于反向传播,找到公式并不容易......那里 方法很多。自从有了CUDA的帮助以后,如果以后只想用NN或者CNN,我觉得没必要花太多时间在上面。也许尝试一些框架,如 Tensorflow 或 Keras(强烈推荐初学者)会帮助你。
  • 还有许多其他因素,例如梯度下降方法、超参数设置...

就像我说的,这个话题很国外。为什么不尝试 Coursera 或斯坦福在线课程上的机器学习/深度学习课程?

【讨论】:

  • 我在学位期间研究了很多 ML/DL,并广泛使用 TensorFlow 来实现模型。正因为如此,我意识到自从我看到反向传播背后的理论已经有一段时间了,如果有人要求我从头开始实现算法,我可能会迷失方向。我发现我列出的激活函数在反向传播中相对容易实现,但在使用 softmax 时遇到了障碍。我不想从头开始实现神经网络,以便在实践中实际使用它 - 我只想实现它以非常熟悉内部工作原理。
  • 我们碰巧有家庭作业之类的话题,使用tensorflow结构而不使用内置优化功能......相信我,以矩阵或一个的形式这样做是相当痛苦的一个....无论如何,祝你好运。
【解决方案2】:

您的问题是关于神经网络的基础知识,因此我强烈建议您从here(Michael Nielsen 的书)开始。 这是一本面向 python 的书,带有图形、文本和公式化的解释——非常适合初学者。我相信你会发现这本书对你的理解很有帮助。寻找第 2 章和第 3 章来解决您的问题。

解决您关于 Sigmoid 的问题,可以将其用于多类预测,但不推荐。考虑以下事实。

Sigmoids 是1/(1+exp(-z)) 形式的激活函数,其中z 是前一个隐藏层(或输入)和权重矩阵行的标量乘积,以及一个偏差(提醒:z=w_i . x + b 其中w_i 是权重矩阵的i-th 行)。此激活独立于矩阵的其他行。

分类任务与类别有关。在没有任何先验知识的情况下,即使在大多数情况下,类别也没有顺序值解释;预测 apple 而不是 orange 并不比预测 banana 而不是 nuts 差。因此,类别的one-hot 编码通常比使用单个激活函数预测类别编号的性能更好。

回顾一下,我们想要一个神经元数量等于类别数量的输出层,并且在给定前一层值的情况下,sigmoid 彼此独立。我们还想预测最可能的类别,这意味着我们希望output layer 的激活具有probability disribution 的含义。 但是 Sigmoid 不能保证总和为 1,而 softmax 激活可以。

由于梯度消失问题,使用L2-loss 函数也存在问题。很快,损失的导数是(sigmoid(z)-y) . sigmoid'(z)(误差乘以导数),这使得这个量很小,当 sigmoid 接近饱和时甚至更多。你可以选择cross entropy,或者log-loss

编辑: 更正了有关排序类别的措辞。澄清一下,分类是与我们今天用作确定有限值集的分类预测相关的许多任务的通用术语。时至今日,在深度模型中使用 softmax 来预测通用“狗/猫/马”分类器中的这些类别,单热编码和交叉熵是一种非常普遍的做法。如果上述内容正确,则使用它是合理的。但是,有(很多)情况不适用。例如,在尝试平衡数据时。对于某些任务,例如语义分割任务,类别可以在它们(或它们的嵌入)之间具有排序/距离的含义。因此,请明智地为您的应用程序选择工具,了解它们在数学上的作用以及它们的含义。

【讨论】:

  • 我不太明白apple-orange 部分。您的意思是说“预测apple 而不是orange 并不比预测banana 而不是nuts 差”?
  • 正确。我编辑了文本以更正措辞。
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 2021-01-06
  • 2018-08-29
  • 2019-02-02
  • 2018-09-20
相关资源
最近更新 更多