使用适当的ReLU派生词会阻止学习

时间:2018-08-03 18:21:53

标签: python machine-learning deep-learning relu

我正在尝试使用ReLU作为激活功能来实现反向传播。 如果我没记错的话,对于x> 0,该函数的导数是1;对于x <0,该函数的导数是0。 使用这种派生网络根本无法学习。 在搜索其他示例时,我发现对于X> 0部分,大多数人都忽略了1,而只将其保留为x,这会导致更好的结果。 我不知道为什么会这样。

为确保没有其他错误,这是训练1输入1输出无隐藏Neuron Network的代码。 我将均方误差用作误差函数

import random

x = random.uniform(0, 1)
y = random.uniform(0, 1)
w = random.uniform(0, 1)
lr = 0.1

for i in range(500):
    z = x * w
    yP = z
    if yP < 0:
        yP = 0
    loss = (yP - y)**2
    print(i, loss)

    grad_y=2.0*(yP - y)
    grad_z = grad_y
    if z < 0:
        grad_z = 0
    else :
        grad_z = grad_y
    grad_w = grad_z * x
    w -= lr * grad_w

请注意,这不太可能与网络的大小有关。我也在一个具有1000个输入神经元,1个具有100个神经元和10个输出神经元的隐藏层的网络上进行了测试。我使用的批处理大小为64和500个纪元。它有同样的问题。

1 个答案:

答案 0 :(得分:0)

我刚刚意识到自己犯了一个愚蠢的错误。 根据链规则,应将grad_y乘以ReLU的导数在h处为0或1。这当然等同于如果导数为0,则将其设置为0。