循环神经网络中的 ReLU 函数。权重变为无穷大或零

rks*_*ksh 3 python artificial-intelligence machine-learning neural-network

我是机器学习的新手。我读过,由于梯度消失问题,ReLU 函数比循环神经网络的 sigmoid 函数更好。

我正在尝试实现一个非常基本的循环神经网络,其中包含 3 个输入节点、10 个隐藏节点和 3 个输出节点。

输入节点和隐藏节点都有 ReLU 函数,输出节点有 softmax 函数。

但是,当我在几个时期(小于 10 个)之后使用 ReLU 函数时,根据权重变化是从原​​始权重中添加还是减去,误差会变为 0 或误差会变为无穷大。

weight = weight + gradient_decent #weights hits infinity
weight = weight - gradient decent #weights become 0
Run Code Online (Sandbox Code Playgroud)

而且因为它达到无穷大,所以会出现以下错误,

RuntimeWarning: invalid value encountered in maximum
  return np.maximum(x, 0)
Run Code Online (Sandbox Code Playgroud)

但是,当我实现 sigmoid 函数时,错误很好地降低了。但是因为这是一个简单的例子,很好,但是如果我在更大的问题上使用它,我担心我会遇到消失的梯度问题。

是不是隐藏节点少造成的,怎么解决?如果您需要代码示例,请发表评论,不要发布代码,因为它太长了。

谢谢你。

小智 5

我不认为隐藏节点的数量是问题所在。

在第一种情况下,权重接近无穷大,因为梯度下降更新是错误的。损失相对于权重的梯度表示您应该更新权重以增加损失的方向。由于人们(通常)想要最小化它,如果权重在正方向上更新,它们将增加损失并且很可能导致发散。

尽管如此,即使假设更新是正确的,我也会将其视为错误的初始化/超参数设置,而不是严格依赖 ReLU 的问题(显然 ReLU 在其积极部分爆炸,给出无穷大,而 sigmoid 饱和,给出 1)。

相反,在第二种情况下,发生的是死 ReLU问题,一个饱和的 ReLU,它总是给出相同的(零)输出,并且无法自我恢复。发生这种情况的原因有很多(例如初始化错误、偏差学习错误),但最有可能的原因是更新步骤太高。试着降低你的学习率,看看会发生什么。

如果这不能解决问题,请考虑使用Leaky ReLU版本,也仅用于简单的调试目的。

有关Leaky ReLU死 ReLU 的更多(和更好的解释)细节可以在这里找到:https : //datascience.stackexchange.com/questions/5706/what-is-the-dying-relu-problem-in-neural-网络