为了解决 Sigmoid 函数在深层神经网络中的梯度消失问题,可以设计一种改进的 Sigmoid 激活函数,使其同时具备以下特性:
- 减缓梯度消失问题:避免在输入值远离零时梯度趋于零的问题。
- 保持概率预测能力:保留 Sigmoid 的单调性和输出范围 (0,1)(0, 1)(0,1),用于概率预测。
- 计算简单且高效:能够方便地应用于深度学习框架。
以下是一种改进设计:
改进思路
1. 增强梯度的动态范围
传统 Sigmoid 的梯度公式为:
当 x 较大或较小时,σ(x) 接近 0 或 1,梯度趋于 0。这是梯度消失的根源。为了增强梯度的动态范围,可以调整函数的陡峭程度。
2. 保持概率性质
Sigmoid 函数输出在 (0, 1) 范围内,这一性质对于分类任务的概率预测至关重要。
设计一种改进的 Sigmoid
公式定义
改进的激活函数,可以定义为:
其中:
- α > 1:通过调节 α 控制曲线的陡峭程度,增强梯度幅度。
- β > 0:引入线性项 βx,避免输出饱和。
特性分析
-
增强梯度:
- 线性项 βx 的引入保证了在输入绝对值较大时,输出仍具有一定的变化率,避免梯度完全趋于零。
- 参数 α 增强函数在靠近原点附近的非线性程度。
-
输出范围:
- 基本 Sigmoid 的范围是 (0, 1),线性项的引入可能改变这一范围。但可以通过对 β 进行限制,使其保持接近概率的性质。
-
概率性质保留:
- 在 β 足够小的情况下,输出值仍接近 (0, 1),可用于概率预测。
优点
- 减少梯度消失 :
- 在线性项的辅助下,即使输入较大,梯度也不会完全消失。
- 简单易实现 :
- 与传统 Sigmoid 类似,改进仅需简单调整,不增加显著计算复杂度。
- 增强模型学习能力 :
- 在深层网络中改进梯度传递,提升模型对深层特征的捕获能力。
参数调节
- 参数 α :
- 一般设置为 1 < α < 5,增强非线性。
- 参数 β :
- 通常取 0 < β < 0.1,避免线性项过度影响。
与其他改进激活函数的对比
激活函数 | 输出范围 | 是否饱和 | 梯度范围 | 特点 |
---|---|---|---|---|
Sigmoid | (0, 1) | 是 | 小 | 概率预测,梯度消失问题严重 |
ImprovedSigmoid | (0,1+β) | 缓解 | 增强 | 增加线性项,减缓梯度消失 |
ReLU | [0,∞) | 否 | 恒大于零 | 简单高效,但无法输出概率 |
Leaky ReLU | [−∞,∞) | 否 | 恒大于零 | 减少死亡神经元,但非概率性 |
Swish | (−∞,∞) | 否 | 增强 | 自适应梯度,训练更稳健 |
代码实现
以下是改进 Sigmoid 函数的 Python 实现:
python
import numpy as np
import matplotlib.pyplot as plt
def improved_sigmoid(x, alpha=2.0, beta=0.1):
return 1 / (1 + np.exp(-alpha * x)) + beta * x
# 绘制比较图
x = np.linspace(-10, 10, 100)
y_sigmoid = 1 / (1 + np.exp(-x))
y_improved = improved_sigmoid(x)
plt.figure(figsize=(8, 6))
plt.plot(x, y_sigmoid, label='Sigmoid', linestyle='--', color='blue')
plt.plot(x, y_improved, label='Improved Sigmoid', linestyle='-', color='red')
plt.axhline(0, color='black', linewidth=0.5, linestyle='--')
plt.axvline(0, color='black', linewidth=0.5, linestyle='--')
plt.title("Improved Sigmoid vs Sigmoid")
plt.legend()
plt.grid()
plt.show()
总结
通过在 Sigmoid 中引入线性项或调整其陡峭程度,能够有效缓解梯度消失问题,同时保留其概率预测能力。这种改进适合用于深层网络,并可以根据具体任务灵活调节参数。