我正在尝试使用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个纪元。它有同样的问题。
答案 0 :(得分:0)
我刚刚意识到自己犯了一个愚蠢的错误。 根据链规则,应将grad_y乘以ReLU的导数在h处为0或1。这当然等同于如果导数为0,则将其设置为0。