我有一个问题。我观看了一个关于在C++中实现人工神经网络的非常详细的教程。现在我对神经网络的工作原理以及如何编程和训练一个神经网络有了不仅仅是基础的理解。
在教程中使用了双曲正切函数来计算输出,显然也使用了它的导数来计算梯度。然而,我想尝试使用不同的函数。具体来说是Leaky RELU(以避免神经元死亡)。
我的问题是,教程中提到这个激活函数应该只用于隐藏层。对于输出层,应该使用不同的函数(要么是softmax,要么是线性回归函数)。在教程中,这个人教神经网络成为一个XOR处理器。那么这是分类问题还是回归问题呢?
我尝试通过谷歌搜索了解两者的区别,但对于XOR处理器的分类我还是不太明白。这是分类问题还是回归问题?所以我实现了Leaky RELU函数及其导数,但我不知道在输出层是应该使用softmax还是回归函数。
另外,对于重新计算输出梯度,我目前使用的是Leaky RELU的导数,但在这种情况下,我是否也应该使用softmax或回归的导数呢?
提前感谢。
回答:
我尝试通过谷歌搜索了解两者的区别,但对于XOR处理器的分类我还是不太明白。这是分类问题还是回归问题?
简而言之,分类是针对离散目标,回归是针对连续目标。如果是浮点运算,你就有了一个回归问题。但在这里,XOR的结果是0
或1
,所以这是一个二元分类问题(Sid已经暗示过)。你应该使用一个softmax层(或者一个Sigmoid函数,它特别适用于两个类别)。请注意,输出将是一个概率向量,即实值,用于选择离散目标类别。
另外,对于重新计算输出梯度,我目前使用的是Leaky RELU的导数,但在这种情况下,我是否也应该使用softmax或回归的导数呢?
正确。对于输出层,你需要一个交叉熵损失函数,它对应于softmax层,并且需要它的导数用于反向传播。如果还有使用Leaky ReLu的隐藏层,你也需要相应地使用Leaky ReLu的导数,适用于这些特定层。
强烈推荐阅读这篇关于反向传播细节的文章。