gpt4 book ai didi

matlab - 如何检查relu梯度

转载 作者:太空宇宙 更新时间:2023-11-03 20:20:12 25 4
gpt4 key购买 nike

我正在尝试实现 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的subgradient设置为0,这样对吗?

最佳答案

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

ReLU 等数值梯度检查函数遇到的问题通常称为扭结问题。扭结是指目标或激活函数的不可微分部分。对于 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)同号时,梯度应该可以正常通过。

关于matlab - 如何检查relu梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40623512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com