【发布时间】:2017-05-23 04:25:48
【问题描述】:
我正在实现一个神经网络,并想使用 ReLU 作为神经元的激活函数。此外,我正在使用 SDG 和反向传播训练网络。我正在用范式 XOR 问题测试神经网络,到目前为止,如果我使用逻辑函数或双曲正切作为激活函数,它可以正确分类新样本。
我一直在阅读有关使用 Leaky ReLU 作为激活函数的好处,并在 Python 中实现它,如下所示:
def relu(data, epsilon=0.1):
return np.maximum(epsilon * data, data)
np 是 NumPy 的名称。相关的导数是这样实现的:
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
【问题讨论】:
-
修改梯度计算部分后是否有效?
-
@KrishnaKishoreAndhavarapu 修改后我得到了正确的结果,但 10 次中有 5 次。我相信我每次都应该得到正确的结果。这个激活函数显然缺少一些东西。
-
你确定
gradients = 1. * (data > epsilon)有意义吗?你对泄漏 ReLU 函数的定义是什么?对于某些大于零的数据值,这会将梯度设置为等于 epsilon。 -
@NickBecker 我对 Leaky ReLU 的定义来自维基百科 (en.wikipedia.org/wiki/Rectifier_(neural_networks)#Leaky_ReLUs)。该行返回一个由 0 和 1 组成的数组。 0 来自所有小于
epsilon的值,而 1 来自所有大于epsilon的剩余值。在这种情况下,我使用的是epsilon = 0.1。 -
当我查看有关 Leaky ReLU 的维基百科部分中的分段函数
f(x)时,我看到当 x > 0 时为 1 的分段导数,否则为 alpha。不过,我可能会遗漏一些东西。
标签: python numpy machine-learning neural-network activation-function