解决深度神经网络中梯度消失/爆炸问题的正确原因是什么?

数据挖掘 深度学习 激活函数
2021-10-12 19:13:30

我已经阅读了几篇博客文章,其中建议解决深度神经网络中梯度消失/爆炸问题的解决方案是使用Relu 激活函数而不是tanHsigmoid

但是,我遇到了Andrew NG 教授讲座的解释,它解释了消失梯度问题的部分解决方案是更好或更仔细地选择神经网络中权重的随机初始化。

即解决方案是:

将 Wi 的方差设置为等于 1/n,其中 n 是进入神经元的输入特征的数量。除了假设激活的输入特征大致为 0 和标准方差为 1。所以,它正在尝试设置每个权重矩阵 w,使其不会比 1 大太多,也不会太小比 1,因此,它不会爆炸或消失太快。

  • 因此,如果您使用ReLu 激活函数,则将 Wi 的方差设置为等于sqrt(2/n)效果更好**。
  • 如果您使用的是TanH 激活函数,则将 Wi 的方差设置为等于sqrt(2/n)效果更好。
  • 或者在某些情况下,建议使用Xavier 初始化
  • 此外,如果我们需要,我们可以variance parameter通过乘以上述公式将其调整为另一个超参数,并将该乘数调整为超参数搜索的一部分。

因此,为如何初始化权重选择一个合理的缩放比例有助于权重不会太快爆炸,也不会太快衰减到零,这反过来又有助于训练一个合理的深度网络,而不会导致权重或梯度过度爆炸或消失,不仅仅是使用 ReLu!。如果我的理解有误或不完整,请纠正我!

1个回答

我认为你提到的两个方面是同一个奖牌的两个方面:如果你的权重太高或太低,那么层的激活最终会太高或太低。如果你使用tanh(z) 或者 sigmoid(z)作为激活函数,您最终会得到导数几乎为零的值,并且梯度将在反向传播到网络中时消失。通过使用relu(z),相反,您使用线性函数 z>0因此,随着激活的增长,导数是恒定的。这有助于在反向传播时梯度不接近零。

这适用于任何情况:无论您使用的权重过高还是过小。Tanh 和 sigmoid 在某种意义上是相似的,它们在附近基本上是线性的z=0, 但几乎平坦时 |z|>>0, ReLU 解决了后一种情况下的问题,因为它对于任何 z>0.

另一方面,另一个策略是防止 z 避免太大或太小,因此您尝试将其保持在原点附近(z=0)。这样,tanh 和 sigmoid 都是线性的,就像 ReLU 对于任何z>0.

预期的结果是一样的:函数的导数几乎是线性的,因此梯度可以穿过网络而不会消失或爆炸。

当然,这里还必须考虑其他因素(例如,ReLU 将每个负值钳制为 0,这会产生其他影响),但除此之外,在这两种情况下,您都会得到相似的结果(非消失梯度),但具有不同的方法(通过调整激活函数或通过调整权重)。