Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用适当的ReLU导数可防止学习_Python_Machine Learning_Deep Learning_Relu - Fatal编程技术网

Python 使用适当的ReLU导数可防止学习

Python 使用适当的ReLU导数可防止学习,python,machine-learning,deep-learning,relu,Python,Machine Learning,Deep Learning,Relu,我试图用ReLU作为激活函数来实现反向传播。 如果我没有弄错的话,这个函数的导数对于x>0是1,对于x0部分中的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 r

我试图用ReLU作为激活函数来实现反向传播。 如果我没有弄错的话,这个函数的导数对于x>0是1,对于x<0是0。 使用这种衍生工具,网络根本无法学习。 搜索其他示例时,我发现大多数都忽略了X>0部分中的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
随机导入
x=随机均匀(0,1)
y=随机均匀(0,1)
w=随机均匀(0,1)
lr=0.1
对于范围(500)内的i:
z=x*w
yP=z
如果yP<0:
yP=0
损失=(年-年)**2
打印(一、丢失)
梯度y=2.0*(yP-y)
梯度z=梯度y
如果z<0:
梯度z=0
其他:
梯度z=梯度y
梯度w=梯度z*x
w-=lr*grad\u w

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

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

首先,尝试使用偏差进行反向传播。其次,为了便于反向传播,损耗应使用1/2(yP-y)^2(梯度y没有2)。最后,为什么在这里将x和y初始化为随机数?由于它们是随机数,我认为没有任何函数可以用来连接它们。我随机创建输入和输出,因为这只是一个测试网络,我手头没有任何实际数据。网络只是一遍又一遍地学习这一批。这不应该是一个问题,因为NN是一个任意函数逼近器。我可以将错误函数更改为使用1/2,但这并不能解决问题。奇怪的是,当我用x=x作为导数的正部分,而不是x=1时,它会正确地学习,这是正确的导数。