【问题标题】:How to check relu gradient如何检查relu梯度
【发布时间】:2017-03-30 03:25:19
【问题描述】:

我正在尝试实现 ANN,并且我还为反向传播编写了一个数值梯度检查。 当我使用 sigmoid 函数时,数值梯度检查工作正常。
但是,当我使用 relu 激活时,梯度检查失败。

我得到的渐变是这样写的:

switch opts.act_function
    case 'relu'
        d_act = a{i} > 0;
    case 'sigmoid'
        d_act = a{i} * (1 - a{i});
end

我的问题是0处没有梯度。如果我将0的次梯度设置为0,这样是否正确?

【问题讨论】:

  • 究竟是什么失败了?或者问题只是关于x=0 的渐变应该是什么?
  • 权重梯度检查失败。我使用dw = f(w + epsilon) - f(w - epsilon) / (2 * epsilon) 来检查渐变。当我使用 sigmoid 激活时,这是正确的,但是当我使用 relu 激活时,它会失败。那么,x = 0 时我应该设置的正确渐变是什么。

标签: matlab machine-learning neural-network deep-learning


【解决方案1】:

使用 ReLU 函数进行数值检查在x = 0 存在问题。如果你还记得,ReLU 函数是这样定义的:f(x) = max(0, x)。这是一个斜坡函数,其中小于 0 的值被限制为 0,而严格为正的值保留相同的值。

像 ReLU 这样的数值梯度检查函数遇到的问题通常被称为 kinks 问题。扭结是指目标或激活函数的不可微分部分。对于 ReLU 函数,从 x = 0 左侧和 x = 0 右侧逼近的导数相等,因此在 x = 0 或更通俗地讲,导数不存在x = 0

即使您在 0 处没有梯度,对于给定的 wepsilon,您在执行梯度检查时可能会计算出非零梯度。以x = -1e-5 为非零的情况为例,并考虑epsilon = 1e-4 的情况。通过使用您在评论中看到的居中差异近似,f(x + epsilon) = f(-1e-5 + 1e-4) = f(9e-5) = 9e-5 给出了 ReLU 的定义。同样,f(x - epsilon) = f(-1e-5 - 1e-4) = f(-1.1e-5) = 0 给出了 ReLU 的定义。因此,如果您尝试近似导数:

(f(x + epsilon) - f(x - epsilon)) / (2*epsilon) = (9e-5 - 0) / 2e-4 = 0.45

数值梯度在理论上应该为 0 时给了我们 0.45。因此,对于朝向x = 0 的小值的情况,这里不能依赖数值梯度。 sigmoid 函数不会遇到这个问题,因为它是一个处处可微的函数,因此对于足够小的epsilon,您应该能够获得与函数的实际导数大致相同的值。

您可以做的是识别何时会出现数字错误。您可以做的是确定f(x + epsilon)f(x - epsilon) 的符号何时不同,这将表明您正在通过x = 0 的扭结。然后,您可以向用户输出警告,说明这种情况已经发生,不应依赖数值梯度。否则,当f(x + epsilon)f(x - epsilon)同号时,梯度应该可以正常通过。

【讨论】:

  • “当f(x + epsilon)f(x - epsilon)符号不同时”是什么意思? f(x) = max(0, x)。可能是x+epsilon and x-epsilon 符号不同吗?
  • 不,当f(x + epsilon)f(x - epsilon) 的符号不同时... 通常。当您计算这两个量时,请检查两个值是否为正、均为负或极性不相等。如果两个值的极性不相等,那么对于 ReLU 的情况你会有一个扭结。但是,正如您所注意到的,您可以简化为x + epsilonx - epsilon,因为它们的极性不同,以查看是否存在扭结。这种简化通常不适用于所有激活函数或目标函数。碰巧它与 ReLU 一起工作。
  • 非常感谢。但是,当我在神经网络中进行数值检查时,我得到的是一个平方损失函数。因此f(w + epsilon)f(w - epsilon) 总是积极的。我怎么能看到有扭结?就在w + epsilonw - epsilon 符号不同的时候,有扭结吗? f(w + epsilon)可能等于f(g(h(w + epsilon)))f(x)是平方损失,g(x)是relu。
  • 您的问题现在具有误导性。它表明您要对 ReLU 函数进行梯度检查。你现在问的和你原来的问题完全不同。
  • 好的。我会问另一个问题。非常感谢。
猜你喜欢
  • 2020-01-26
  • 2011-09-27
  • 2013-02-09
  • 2018-05-14
  • 2020-03-28
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多