【问题标题】:Artificial Neural Network RELU Activation Function and Gradients人工神经网络 RELU 激活函数和梯度
【发布时间】:2018-03-19 02:51:06
【问题描述】:

我有一个问题。我观看了关于在 C++ 中实现人工神经网络的非常详细的教程。现在,我对神经网络的工作原理以及如何实际编程和训练神经网络有了基本的了解。

所以在本教程中,双曲正切用于计算输出,显然它的导数用于计算梯度。但是我想继续使用不同的功能。特别是 Leaky RELU(以避免死亡的神经元)。

我的问题是,它指定这个激活函数应该只用于隐藏层。对于输出层,应使用不同的函数(softmax 或线性回归函数)。在教程中,这个人教神经网络是一个 XOR 处理器。那么这是分类问题还是回归问题呢?

我试图用谷歌搜索两者之间的区别,但我不能完全掌握 XOR 处理器的类别。是分类问题还是回归问题? 所以我实现了 Leaky RELU 函数及其导数,但我不知道应该为输出层使用 softmax 还是回归函数。

为了重新计算输出梯度,我使用 Leaky RELU 的导数(目前),但在这种情况下我是否也应该使用 softmax 的/回归导数?

提前致谢。

【问题讨论】:

  • 应该是分类问题,因为异或处理器有二进制输出(2类,即yes/no)。

标签: machine-learning neural-network backpropagation transfer-function activation-function


【解决方案1】:

我试图用谷歌搜索两者之间的区别,但我不能完全掌握 XOR 处理器的类别。是分类问题还是回归问题?

简而言之,分类是针对离散目标的,回归是针对连续目标的。如果是浮点运算,则存在回归问题。但是这里异或的结果是01,所以它是一个二进制分类(Sid 已经建议)。您应该使用 softmax 层(或 sigmoid function,它特别适用于 2 个类)。请注意,输出将是概率的向量,即实值,用于选择离散的目标类。

为了重新计算输出梯度,我使用 Leaky RELU 的导数(目前),但在这种情况下我是否也应该使用 softmax 的/回归导数?

正确。对于输出层,您需要一个 cross-entropy loss 函数,它对应于 softmax 层,它是反向传播的导数。 如果存在仍然使用 Leaky ReLu 的隐藏层,那么对于这些​​特定层,您还需要相应地使用 Leaky ReLu 的导数。

强烈推荐this post on backpropagation details

【讨论】:

  • 那么你认为你能给我一些关于新网络架构的建议吗?在教程中,这个人使用了一个带有 2 个神经元的输入层、一个带有 4 个神经元的隐藏层和一个带有单个神经元的输出层。我应该如何适应这个?输出层是否应该有一个与每个类对应的神经元? (在异或的情况下,2 个神经元?)或者...?提前致谢。
  • @Gogo 教程没有链接,所以不能评论。但是单个输出 sigmoid 神经元是完全可能的。在这种情况下,它的输出被解释为概率 1。您仍然可以使用交叉熵损失,因为您知道 p1-p
  • 好吧,视频长达一小时五分钟,但这是他编写的实际代码:inkdrop.net/dave/docs/neural-net-tutorial.cpp 我的代码有一些变化,因为我用 Leaky RELU (及其导数),并且现在还制作了一个新的 sigmoid 函数,我用它来重新计算最终神经元的输出。我还使用 sigmoid 的函数导数来重新计算输出层中神经元的梯度。然而,在一次训练之后,我的神经网络为 XOR 处理器的每个条目提供了 0.5。
  • @Gogo 据我所知,他的架构是在[0, 1] 中输出两个值(由于sigmoid)并具有L2损失函数。这可以作为一个例子(虽然不是很能说明,但它会让你感到困惑),但下一步是使用 softmax + 交叉熵损失。您可以尝试两种方式进行练习,但第二种方式肯定更适用于分类问题。如果它不起作用,请随意创建新问题。
  • 所以我终于让它工作了:),感谢所有的帮助,但我还有一个问题。现在看来,我实现它的方式(使用 ReLU + Sigmoid)需要更多的迭代才能让我的网络学习,但这里有一些奇怪的行为。对于一个集合的 500 次迭代,Tanh 已经学会了模仿 XOR,而 ReLU 还很遥远。对于 2.5k 次迭代,Tanh 几乎没有改进,而 ReLU 变得非常准确(比 Tanh 更准确)。这是否与学习率和动量有关?如果是这样,您对如何解决这个问题有任何最终建议吗?