我正在从头开始实施一个简单的神经网络,仅用于练习。我已经使用sigmoid,tanh和ReLU激活二进制分类问题。我现在正试图将它用于多类互斥问题。当然,softmax是最好的选择。
不幸的是,我在理解如何在backprop中实现softmax,交叉熵损失及其衍生物方面遇到了很多麻烦。即使在这里询问了几个问题并且在Cross Validated上,我也无法得到任何好的指导。
在我尝试进一步实现softmax之前,是否有可能以某种方式使用sigmoid来解决多类问题(我试图预测n个字符中的1个,它们被编码为单热矢量)?如果是这样,哪种损失函数最好?我一直在使用所有二进制分类的平方误差。
答案 0 :(得分:1)
你的问题是关于神经网络的基本原理,因此我强烈建议你开始here(Michael Nielsen的书)。 它是面向python的书,带有图形,文本和表达式的解释 - 非常适合初学者。我相信你会发现这本书对你的理解很有用。寻找第2章和第3章来解决你的问题。
解决有关Sigmoids的问题,可以将其用于多类预测,但不推荐使用。请考虑以下事实。
Sigmoids是1/(1+exp(-z))
形式的激活函数,其中z
是前一个隐藏层(或输入)的标量乘法和权重矩阵的一行,另外还有偏差(提醒: z=w_i . x + b
其中w_i
是权重矩阵的i
行。此激活是矩阵其他行的独立。
分类任务与类别有关。没有任何先验知识,甚至在大多数情况下,类别都没有订单价值解释,因此我们可以看到预测apple
而不是orange
比预测banana
更糟糕nuts
。因此,类别的one-hot
编码通常比使用单个激活函数预测类别编号更好。
总结一下,我们想要一个输出层,其中神经元的数量等于类别的数量,并且在给定前一个层值的情况下,sigmoids彼此独立。我们还想预测最可能的类别,这意味着我们将output layer
的激活视为probability disribution
。 但Sigmoids不保证总和为1,而softmax激活则为。
由于渐变问题消失,使用L2-loss
功能也存在问题。不久,损失的导数是(sigmoid(z)-y) . sigmoid'(z)
(误差乘以导数),这使得该数量变小,当S形闭合到饱和时甚至更多。您可以选择cross entropy
代替log-loss
。
答案 1 :(得分:0)
你问的是一个非常广泛的问题。