多 class class 化的 S 型激活?

Sigmoid activation for multi-class classification?

我正在从头开始实现一个简单的神经网络,只是为了练习。对于二进制 classification 问题,我可以很好地处理 sigmoid、tanh 和 ReLU 激活。我现在正尝试将它用于多class、相互排斥的问题。当然,softmax 是最好的选择。

不幸的是,我在理解如何在反向传播中实现 softmax、交叉熵损失及其导数时遇到了很多麻烦。即使在这里和 Cross Validated 上问了几个问题之后,我也得不到任何好的指导。

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

你问的是一个很宽泛的问题。

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

我说了,话题很国外。为什么不在 Coursera 或斯坦福在线课程上尝试机器 learning/deep 学习课程?

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

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

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

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

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

使用 L2-loss 函数也存在梯度消失问题。简而言之,损失的导数是 (sigmoid(z)-y) . sigmoid'(z)(误差乘以导数),这使得这个量很小,当 sigmoid 接近饱和时甚至更多。您可以选择 cross entropylog-loss.

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