keras - 为什么神经网络中几乎每个激活函数都会在负输入值处饱和
问题描述
这可能是一个非常基本/微不足道的问题。
对于负输入,
- ReLu 激活函数的输出为零
- Sigmoid 激活函数的输出为零
- Tanh 激活函数的输出为 -1
下面提到的是我的问题:
- 为什么上述所有激活函数都对负输入值饱和。
- 如果我们想预测负目标值,是否有任何激活函数。
谢谢你。
解决方案
True - ReLU 旨在为负值产生零。(大学习率、糟糕的初始化或很少的单元可能很危险——所有神经元都可能卡在零并且模型冻结)
False - Sigmoid 导致“非常负”输入的结果为零,而不是“负”输入。如果您的输入介于 -3 和 +3 之间,您将看到介于 0 和 1 之间的非常令人愉快的结果。
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)
推荐阅读
- xpages - Xpages - 将锚标记添加到 Notes 视图中的列
- android - 使用新导航组件处理 Android onBackPressed
- python - 来自人类可读文本的 Python JSON 数据
- c++ - Mongoose RESTful HTTP 服务器
- c++ - 可以默认初始化具有已删除默认构造函数的类类型吗?
- vb.net - 开始出现错误“未为 DBNULL 类型和字符串定义运算符'='
- angular - 在运行时更改角度环境变量
- reporting-services - 处理 SSRS 报告 - 分页问题 - SSRS 2016
- mysql - MySQL 中不允许子查询限制,但我需要“它”
- python - 在 Python 中映射数据框