【问题标题】:Using the Proper ReLU derivative prevents learning使用正确的 ReLU 导数会阻止学习
【发布时间】:2018-08-03 18:21:53
【问题描述】:

我正在尝试使用 ReLU 作为激活函数来实现反向传播。 如果我没记错的话,该函数的导数对于 x > 0 是 1,对于 x 0 部分,只是将其保留在 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 个输入神经元、1 个隐藏层、100 个神经元和 10 个输出神经元的网络上进行了测试。我使用了 64 和 500 个 epoch 的批量大小。它有同样的问题。

【问题讨论】:

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

标签: python machine-learning deep-learning relu


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2018-10-11
    • 2020-07-17
    • 1970-01-01
    • 2017-09-08
    • 2014-12-01
    相关资源
    最近更新 更多