使用ReLU作为激活功能的注意事项

tul*_*ans 5 python numpy machine-learning neural-network activation-function

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

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

def relu(data, epsilon=0.1):
    return np.maximum(epsilon * data, data)
Run Code Online (Sandbox Code Playgroud)

NumPynp的名称在哪里.相关的衍生物实现如下:

def relu_prime(data, epsilon=0.1):
    if 1. * np.all(epsilon < data):
        return 1
    return epsilon
Run Code Online (Sandbox Code Playgroud)

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

  • 输入= [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
Run Code Online (Sandbox Code Playgroud)

Nic*_*ker 7

你的relu_prime功能应该是:

def relu_prime(data, epsilon=0.1):
    gradients = 1. * (data > 0)
    gradients[gradients == 0] = epsilon
    return gradients
Run Code Online (Sandbox Code Playgroud)

注意数据矩阵中每个值的比较为0,而不是epsilon.这源于泄漏ReLU的标准定义,其创建了1何时x > 0epsilon否则的分段梯度.

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


Arn*_*ykh 6

简短的回答

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

答案很长

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