使用适当的ReLU导数会妨碍学习

2024-04-29 15:20:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用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个时代的批量大小。它也有同样的问题。你知道吗


Tags: 函数gt网络示例if代表randomuniform
1条回答
网友
1楼 · 发布于 2024-04-29 15:20:30

我才意识到我犯了一个多么愚蠢的错误。 根据链式法则,梯度y应乘以ReLU在h处的导数,即0或1。当然,如果导数为0,这相当于将其设置为0。你知道吗

相关问题 更多 >