为什么在神经网络中几乎每个激活函数都会在负输入值处饱和

Why does almost every Activation Function Saturate at Negative Input Values in a Neural Network

这可能是一个非常 basic/trivial 的问题。

对于负输入,

  1. ReLu 激活函数的输出为零
  2. Sigmoid 激活函数的输出为零
  3. Tanh 激活函数的输出为 -1

下面是我的问题:

  1. Why is it that all of the above Activation Functions Saturated for Negative Input Values.
  2. Is there any Activation Function if we want to predict a Negative Target Value.

谢谢。

  1. True - ReLU 旨在为负值生成零。 (如果学习率大、初始化不好或单元很少,这可能很危险——所有神经元都可能卡在零并且模型冻结)

  2. False - 对于 "very negative" 输入,Sigmoid 结果为零,而不是 "negative" 输入。如果您的输入介于 -3 和 +3 之间,您将看到介于 0 和 1 之间的非常令人愉快的结果。

  3. False - 与 Sigmoid 相同的注释。如果您的输入介于 -2 和 2 之间,您将看到介于 -1 和 1 之间的不错结果。


所以,饱和问题只存在于绝对值过大的输入。

根据定义,输出为:

  • ReLU:0 < y < inf(中心在 0)
  • Sigmoid:0 < y < 1(中心在 0.5)
  • TanH: -1 < y < 1(中心在 0)

您可能希望在这些激活之前使用 BatchNormalization 层以避免具有大值并避免饱和。


对于预测负输出,tanh 是三者中唯一能够做到这一点的。

你可以发明一个负 sigmoid,不过这很简单:

def neg_sigmoid(x):
    return -keras.backend.sigmoid(x)

#use the layer:
Activation(neg_sigmoid)
  1. 引入 ReLu 激活函数背后的关键思想是解决更深层网络中梯度消失的问题。然而,对于不同的初始化,当权重超过 1 时,可能会导致梯度值爆炸并导致网络饱和。 ReLu 背后的关键思想是将稀疏性引入网络。我们可以用一种简单的方式说它只是修剪被认为不重要的连接(即 -ve 权重)。是的,在这里我们必须小心我们初始化的权重分布,否则网络可能会变得过于稀疏而无法学习更多信息。

  2. Sigmoid - 基于梯度的学习规则的 sigmoid 的关键问题是 sigmoid 的导数导致函数对于非常大的输入变为 0。因此导致梯度消失,并且 sigmoid 不会导致负值问题,而是对于大的正输入值。

  3. Tanh - tanh 背后的想法是不具有 ReLu 强制执行的稀疏性,并利用复杂的网络动态进行类似于 sigmoid 函数的学习。 Tanh 以更简单的方式尝试利用整个网络的能力来学习并解决类似于 ReLu 的梯度消失问题。并且在网络中具有负因子作为动态正则化器(负权重被强烈拉到 -1 并且接近 0 的权重趋向于 0)并且对于二进制 classification 或更少 class class化问题。

这个 link 有一些有用的信息,对您有帮助。

简而言之,negative/positive对这些激活函数来说无关紧要。

  1. Sigmoid 和 tanh 对于正值和负值都是饱和的。如评论中所述,它们与输入 0 对称。对于 relu,它只会对负值饱和,但我将在下一个问题中解释为什么它无关紧要。

  2. 答案是激活函数不需要 'predict' 负值。激活函数的重点不是给出一个方程来预测你的最终值,而是在中间层给你的神经网络一个非线性。然后在最后一层使用一些适当的函数来获得想要的输出值。 ex) 用于分类的 softmax,用于回归的只是线性的。
    因此,因为这些激活函数位于中间,即使您的 'wanted' 值为负,激活函数是否仅输出正值也没关系,因为模型将使下一层的权重为负。(因此术语 'wanted values are negative' 没有任何意义)

所以,Relu 在负端饱和和在正端饱和没有区别。有一些不饱和的激活函数,例如 leaky Relu,因此您可能需要检查一下。但是激活函数的点positive/negative并不重要。