KOB*_*KOB 1 classification machine-learning softmax activation-function sigmoid
我正在从头开始实现一个简单的神经网络,仅供练习。我已经让它可以很好地处理二元分类问题的 sigmoid、tanh 和 ReLU 激活。我现在尝试用它来解决多类、互斥的问题。当然,softmax 是最好的选择。
不幸的是,我在理解如何在反向传播中实现 softmax、交叉熵损失及其导数时遇到了很多困难。即使在这里和交叉验证上问了几个问题后,我也无法得到任何好的指导。
在我尝试进一步实现 softmax 之前,是否可以以某种方式使用 sigmoid 来解决多类问题(我试图预测 n 个字符中的 1 个,这些字符被编码为 one-hot 向量)?如果是这样,哪种损失函数最好?我一直在对所有二元分类使用平方误差。
你的问题是关于神经网络的基础知识,因此我强烈建议你从这里开始(迈克尔尼尔森的书)。这是一本面向Python的书,有图形、文本和公式化的解释——非常适合初学者。我相信您会发现这本书对您的理解很有帮助。请参阅第 2 章和第 3 章来解决您的问题。
解决您关于 Sigmoid 的问题,可以将其用于多类预测,但不推荐。考虑以下事实。
S 型函数是以下形式的激活函数1/(1+exp(-z)),其中z是前一个隐藏层(或输入)与权重矩阵的一行的标量乘法,此外还有偏差(提醒:z=w_i . x + b其中w_i是i权重矩阵的第 - 行)。此激活独立于矩阵的其他行。
分类任务是关于类别的。在没有任何先验知识的情况下,甚至在大多数情况下,类别也没有顺序值解释;预测apple而不是比预测更orange糟糕。因此,类别编码通常比使用单个激活函数预测类别数表现得更好。banananutsone-hot
回顾一下,我们希望输出层的神经元数量等于类别数量,并且在给定前一层值的情况下,sigmoid 彼此独立。我们还想预测最可能的类别,这意味着我们希望 的激活output layer具有 的含义probability disribution。但 Sigmoid 不能保证总和为 1,而 softmax 激活则可以。
L2-loss由于梯度消失问题,使用函数也会出现问题。简而言之,损失的导数是(sigmoid(z)-y) . sigmoid'(z)(误差乘以导数),这使得这个量很小,当 sigmoid 接近饱和时甚至更大。您可以选择cross entropy替代,或者选择log-loss.
编辑: 更正了有关排序类别的措辞。需要澄清的是,分类是许多任务的通用术语,这些任务与我们今天用作确定有限值集的分类预测相关。截至目前,在深度模型中使用 softmax 来预测通用“狗/猫/马”分类器中的这些类别、单热编码和交叉熵是一种非常常见的做法。如果上述正确的话,使用它是合理的。然而,有(很多)情况它并不适用。例如,当尝试平衡数据时。对于某些任务,例如语义分割任务,类别之间可以具有有意义的排序/距离(或其嵌入)。因此,请明智地为您的应用程序选择工具,了解它们在数学上的作用及其含义。