Sigmoid 函数是一种常用的激活函数,尤其在神经网络和逻辑回归中扮演重要角色。它将输入的实数映射到区间 (0, 1),形状类似于字母 "S"。
1. 定义与公式
Sigmoid 函数的公式为:
特点
- 输出范围:(0, 1),适合用于概率预测。
- 单调性:是一个单调递增函数。
- 对称性:以 x = 0 为中心,对称于 y = 0.5。
2.Sigmoid 函数的推导过程
2-1. 目标与需求
我们希望构造一个函数 f(x) 满足以下性质:
- 输出范围:f(x) 的值限定在区间 (0, 1),便于解释为概率。
- 平滑性:函数连续且可导,以便使用梯度下降进行优化。
- 单调性:函数值随着输入 x 的增大而增大。
- 对称性:以 x = 0 为对称中心,输入为 0 时,输出为 0.5,表示不偏不倚的概率。
2-2. 构造 Sigmoid 函数
为了满足这些性质,可以使用指数函数 的形式,因为指数函数本身是平滑的、单调递增的。
构造输出范围
首先,为了限制输出范围在 (0, 1),我们构造如下函数:
其中 g(x) > 0 保证分母大于 1,因此 f(x) 始终在 (0, 1)。
选择 ,得到:
性质验证
-
输出范围:
- 当 ,,;
- 当 ,,。
-
单调性 : 指数函数 单调递减,分母 随 x 增大而变大,分数值变小,因此 f(x) 单调递增。
-
对称性: 令 x = 0,
满足 f(0) = 0.5,以 x = 0 为中心对称。
2-3. 导数推导
公式
导数计算如下:
对 f(x) 求导:
-
分母求导法则:
-
应用到 f(x): 设 ,则:
-
进一步化简:
记 ,得:
2-4. 推导的直观解释
概率建模视角
Sigmoid 函数可以看作将线性模型的输出 转换为概率值的过程:
当 ,预测概率接近 1;当 ,预测概率接近 0。
对称性与平滑性
- 对称性来源于指数函数的性质:负指数 的曲线是正指数 的镜像。
- 平滑性来源于指数函数的连续和可导性。
3. Sigmoid 的性质
导数
Sigmoid 的导数具有简洁的形式:
这使得计算变得高效。
梯度消失问题
- 当 x 的绝对值较大时,σ(x) 的值接近 0 或 1,导数接近于 0。这会导致梯度更新过慢的问题,特别是在深层神经网络中。
4. Sigmoid 的用途
-
逻辑回归:
- 用于将线性回归的结果转化为二分类概率。
-
神经网络:
- 作为激活函数,尤其是输出层,用于预测概率值。
-
概率建模:
- 用于模型的概率预测或生成。
5. 缺点
- 梯度消失 :
- 绝对值较大的输入导致梯度趋于 0,影响深层网络的训练。
- 非零均值 :
- Sigmoid 输出的均值不为零,可能导致下一层神经元的输入分布偏移。
6. 代码实现
以下是 Sigmoid 函数的实现及其应用示例。
Sigmoid 函数
python
import numpy as np
import matplotlib.pyplot as plt
# Sigmoid 函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# Sigmoid 导数
def sigmoid_derivative(x):
s = sigmoid(x)
return s * (1 - s)
# 绘图
x = np.linspace(-10, 10, 100)
y = sigmoid(x)
y_prime = sigmoid_derivative(x)
plt.plot(x, y, label='Sigmoid Function')
plt.plot(x, y_prime, label='Sigmoid Derivative', linestyle='--')
plt.title("Sigmoid and Its Derivative")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.legend()
plt.grid()
plt.show()
逻辑回归示例
python
# 导入必要的库
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 生成一个模拟的二分类数据集
# 这里详细说明了数据集的特性:样本数、特征数、类别数、信息特征数、冗余特征数、重复特征数和随机种子
X, y = make_classification(n_samples=100, n_features=4, n_classes=2, n_informative=2, n_redundant=1, n_repeated=0,
random_state=0)
# 将数据集分为训练集和测试集,测试集大小为30%,并设置了随机种子以保证结果的可重复性
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 初始化逻辑回归模型
model = LogisticRegression()
# 使用训练集数据训练模型
model.fit(X_train, y_train)
# 使用训练好的模型对测试集进行预测
y_pred = model.predict(X_test)
# 打印模型的准确率
print("Accuracy:", accuracy_score(y_test, y_pred))
输出结果
bash
Accuracy: 0.9
7. Sigmoid 的替代品
为了克服 Sigmoid 的缺点,神经网络中常用以下替代激活函数:
- ReLU(Rectified Linear Unit): f(x) = max(0, x)
- Leaky ReLU :
- Tanh : 输出范围为 (-1, 1)。
Sigmoid 函数虽然简单,但由于其梯度问题和计算开销,在深度学习中逐渐被其他激活函数所取代。不过,它在概率建模等领域仍然非常实用!