首页 > 解决方案 > 为什么神经网络中几乎每个激活函数都会在负输入值处饱和

问题描述

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

对于负输入,

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

下面提到的是我的问题:

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

谢谢你。

标签: kerasdeep-learningneural-networkactivation-function

解决方案


  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)

推荐阅读