5

我正在实现一个神经网络,并想使用 ReLU 作为神经元的激活函数。此外,我正在使用 SDG 和反向传播训练网络。我正在用范式 XOR 问题测试神经网络,到目前为止,如果我使用逻辑函数或双曲正切作为激活函数,它会正确分类新样本。

我一直在阅读有关使用 Leaky ReLU 作为激活函数的好处,并在 Python 中实现它,如下所示:

def relu(data, epsilon=0.1):
    return np.maximum(epsilon * data, data)

NumPynp的名称在哪里。相关的导数是这样实现的:

def relu_prime(data, epsilon=0.1):
    if 1. * np.all(epsilon < data):
        return 1
    return epsilon

使用此功能作为激活我得到不正确的结果。例如:

  • 输入 = [0, 0] --> 输出 = [0.43951457]

  • 输入 = [0, 1] --> 输出 = [0.46252925]

  • 输入 = [1, 0] --> 输出 = [0.34939594]

  • 输入 = [1, 1] --> 输出 = [0.37241062]

可以看出,输出与预期的 XOR 相差很大。那么问题来了,使用 ReLU 作为激活函数有什么特别的考虑吗?

请不要犹豫,向我询问更多上下文或代码。提前致谢。

编辑:导数中有一个错误,因为它只返回一个浮点值,而不是 NumPy 数组。正确的代码应该是:

def relu_prime(data, epsilon=0.1):
    gradients = 1. * (data > epsilon)
    gradients[gradients == 0] = epsilon
    return gradients
4

2 回答 2

7

你的relu_prime功能应该是:

def relu_prime(data, epsilon=0.1):
    gradients = 1. * (data > 0)
    gradients[gradients == 0] = epsilon
    return gradients

注意数据矩阵中的每个值与 0 的比较,而不是epsilon. 这来自leaky ReLUs的标准定义,它创建了1何时x > 0epsilon否则的分段梯度。

我无法评论泄漏的 ReLU 是否是 XOR 问题的最佳选择,但这应该可以解决您的梯度问题。

于 2017-01-09T14:16:28.647 回答
6

简短的回答

不要将 ReLU 与二进制数字一起使用。它旨在以更大的价值运行。也避免在没有负值时使用它,因为这基本上意味着您使用的不是最好的线性激活函数。最好与卷积神经网络一起使用。

长答案

不能说 python 代码是否有任何问题,因为我用 Java 编写代码。但从逻辑上讲,我认为在这种情况下使用 ReLU 是一个糟糕的决定。由于我们预测 XOR,因此您的 NN [0,1] 的值范围有限。这也是 sigmoid 激活函数的范围。使用 ReLU,您可以使用值 [0,infinity] 进行操作,这意味着您永远不会使用大量值,因为它是 XOR。但是 ReLU 仍然会考虑这个值,你得到的误差会增加。这就是为什么你大约有 50% 的时间得到正确答案的原因。事实上,这个值可以低至 0%,高至 99%。故事的寓意 - 在决定使用哪个激活函数时,尝试将 NN 中的输入值范围与激活函数值的范围相匹配。

于 2017-01-09T13:46:12.453 回答