背景:在使用 relu 激活拟合神经网络时,我发现有时预测变得接近恒定。我相信这是由于在训练期间 relu 神经元死亡,如此处所述。(什么是神经网络中的“垂死的 ReLU”问题?)
问题:我希望做的是对代码本身进行检查以检查神经元是否死亡。之后,如果需要,代码可以重新调整网络。
因此,什么是检查死亡神经元的好方法?目前我正在考虑将预测中的低方差作为一个标准来检查。
如果有帮助,我正在使用 keras。
背景:在使用 relu 激活拟合神经网络时,我发现有时预测变得接近恒定。我相信这是由于在训练期间 relu 神经元死亡,如此处所述。(什么是神经网络中的“垂死的 ReLU”问题?)
问题:我希望做的是对代码本身进行检查以检查神经元是否死亡。之后,如果需要,代码可以重新调整网络。
因此,什么是检查死亡神经元的好方法?目前我正在考虑将预测中的低方差作为一个标准来检查。
如果有帮助,我正在使用 keras。
一个死的 ReLU 几乎意味着它的参数值是负的,因此梯度保持在 0;从那时起,无论您如何训练它。您可以在训练期间简单地查看梯度,以了解 ReLU 是否已失效。
在实践中,您可能只想使用泄漏的 ReLU,即如果 x > 0 和 f(x) = 0.01x 如果 x <= 0 则设置 f(x) = x 而不是 f(x) = max(0,x) . 这样你总是允许一个小的非零梯度,并且单元不应该完全陷入训练中。
死神经元是在训练期间不更新的神经元,即。0梯度。
Keras 允许直接对给定的数据行进行梯度提取。 (另一个很好的例子)
或者您可以提取神经元权重并自己计算梯度
(例如,对于 relu,relu 的负参数 -> 0 梯度。)
不幸的是,梯度是特定于数据点的。只有当每一行训练数据的梯度为 0 时,你才能确定神经元不会在训练 epoch 期间更新所有 minibatch。
Leaky relu 可能是一个有用的策略,因为在梯度等于 0 的情况下,leaky relu 没有任何价值。