众所周知,当输入为负时,ReLU梯度恒为0,导致神经元‘死亡’且无法复活,这正是理解ReLU缺陷和后续改进(如Leaky ReLU, PReLU)的关键。
但是,很多人对上面的说法并没有深刻的理解,所以本文特地给大家讲一下。我们需要分步拆解这个问题:(1)为什么梯度恒为0呢?(2)为什么神经元无法复活呢?
这需要从ReLU的函数定义和反向传播的原理说起。
ReLU的函数定义:f(x) = max(0, x),这意味着:当 x > 0 时,梯度为 1。误差可以顺畅地反向传播回来。当 x <= 0 时,梯度为 0。
反向传播算法通过链式法则将损失函数对最终输出的误差,一层层地反向传递,计算误差对每个权重(Weight)和偏置(Bias)的梯度。这个梯度决定了参数更新的方向和大小:权重 = 权重 - 学习率 * 梯度。
现在,我们来看一个“死亡”的神经元是如何形成的:
假设在某个神经元,经过加权求和和偏置后的输入 z 是一个很大的负数。
在前向传播中:输出 a = ReLU(z) = 0。
在反向传播中:我们需要计算损失函数 L 对权重 w 的梯度 ∂L/∂w。根据链式法则:
∂L/∂w = (∂L/∂a) * (∂a/∂z) * (∂z/∂w)
无法“复活”才是最致命的问题,一个神经元一旦“死亡”,它很可能就“永远死亡”了。原因如下所示。
让我们继续上面的例子。
因为 ∂L/∂w = 0,所以权重的更新公式变为:w_new = w_old - 学习率 * 0 = w_old。权重没有任何变化。
这个神经元的输入是 a 输出是 0。在下一个样本的前向传播中,由于权重没有更新,计算出的新输入 z_new 很可能仍然是一个负数(因为上轮的 z 是个“很大的负数”,微小的权重变化都不足以把它拉回正数区,更何况现在权重根本没变)。于是,在下一轮反向传播中,梯度再次为 0,权重再次无法更新。这个过程会不断重复,形成一个无法打破的循环。
这就像一辆车冲下了一个平坦的悬崖,掉进了一个谷底(z 变成了很大的负数)。发动机(梯度)熄火了(变为0)。因为没有动力(梯度),车就无法从谷底开出来(权重无法更新到使 z 变为正数)。所以它将永远困在谷底。
当某个神经元因为ReLU激活函数而“死亡”时,根本原因是它的权重值使得输入(样本)持续为负。这个过程如下:
第一个样本:假设对于样本A,经过某个神经元的处理之后,结果z为负,而z在经过ReLU则输出为0,梯度为0。在反向传播时,由于梯度为0,该神经元的权重无法更新。
下一个样本(样本B):现在处理样本B时,网络使用相同的权重(因为权重没有被更新)。如果这些权重值使得对于样本B, 结果z仍然为负(这很可能发生,因为权重没有改变),那么ReLU输出再次为0,梯度再次为0,权重再次无法更新。
后续样本:这个循环会持续下去。权重永远卡在导致结果为负的状态,因此对于几乎所有样本,该神经元都会输出0,无法恢复。
总之,神经网络的权重(参数)在初始的过程是随机生成的,并且所有样本之间是共享的。训练过程的目的就是通过多个样本逐渐调整这些权重,使其更适合整个数据集。但是,一旦随机初始化的过程中出现了特殊值,这些特殊值往往会因为ReLU激活函数的先天缺陷,而陷入死亡陷阱。
因为它们的导数在负区不为0,即使输入 z 是负数,梯度 ∂a/∂z = α(一个很小的值,但不是0)。因此:
∂L/∂w = (∂L/∂a) * α * (∂z/∂w) ≠ 0
这就是Leaky ReLU和PReLU能有效缓解“神经元死亡”问题的根本原因。