如何检查relu梯度

Vit*_*ang 3 matlab machine-learning neural-network deep-learning

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

我得到的梯度写如下:

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

我的问题是0处没有梯度.如果我将0的子梯度设置为0,这是正确的吗?

ray*_*ica 5

已知具有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
Run Code Online (Sandbox Code Playgroud)

当理论上它应该为0时,数值梯度给出0.45.因此,对于小值朝向的情况,这里不能依赖数值梯度x = 0.你不会遇到sigmoid函数的这个问题,因为它是一个在任何地方都是可微分的函数,所以对于一个足够小的函数epsilon,你应该能够获得与函数的实际导数大致相同的值.

你可以做的是确定何时会出现数字不准确.你可以做的是确定何时f(x + epsilon)f(x - epsilon)不同的标志,这将表明你正在穿过扭结x = 0.然后,您可以向用户输出已发生此情况的警告,并且不应依赖数值梯度.否则,梯度应该能当两个正常传递f(x + epsilon)f(x - epsilon)符号相同的.