1

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

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

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

4

2 回答 2

3

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

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

Sigmoid 是形式的激活函数,1/(1+exp(-z))其中z是前一个隐藏层(或输入)和权重矩阵的行的标量乘法,此外还有一个偏差(提醒:权重矩阵的第 - 行是哪里z=w_i . x + b) 。此激活与矩阵的其他行无关。w_ii

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

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

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

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

于 2018-04-24T00:10:14.340 回答
0

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

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

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

于 2018-04-23T22:44:12.253 回答