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

Rak*_*eek 5 neural-network deep-learning keras activation-function

这可能是一个非常基本/微不足道的问题。

对于负输入,

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

下面提到的是我的问题:

  1. 为什么上述所有激活函数都对负输入值饱和。
  2. 如果我们想预测负目标值,是否有任何激活函数。

谢谢你。

Dan*_*ler 4

  1. True - ReLU 旨在导致负值为零。(如果学习率较大、初始化不良或单元很少,这可能会很危险 - 所有神经元都可能陷入零并且模型冻结)

  2. False - Sigmoid 对于“非常负”的输入结果为零,对于“负”输入则不然。如果您的输入介于 -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)
Run Code Online (Sandbox Code Playgroud)