我尝试用ReLU作为激活函数来实现反向传播。 如果我没弄错的话,这个函数的导数是1代表x>;0,0代表x<;0。 使用这种衍生工具,网络根本不会学习。 搜索其他示例时,我发现大多数示例都忽略了X的1部分,而将其保留在X处,这样会得到更好的结果。 我想知道为什么会这样。你知道吗
为了确保我没有其他错误,这里的代码是训练一个1输入1输出的无隐神经元网络。 我用均方误差作为误差函数
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个输入神经元的网络上测试过,一个有100个神经元和10个输出神经元的隐藏层。我使用了64和500个时代的批量大小。它也有同样的问题。你知道吗
我才意识到我犯了一个多么愚蠢的错误。 根据链式法则,梯度y应乘以ReLU在h处的导数,即0或1。当然,如果导数为0,这相当于将其设置为0。你知道吗
相关问题 更多 >
编程相关推荐