文章目录
- 1、Sigmoid函数
- 1.1 公式
- 1.2 对应图像
- 1.2 生成图像代码
- 1.4 优点与不足
- 1.5 torch.sigmoid()函数
1、Sigmoid函数
1.1 公式
Sigmoid函数的公式:
f
(
x
)
=
1
1
+
e
−
x
f(x) =\frac{1}{1+e^{-x}}
f(x)=1+e−x1
Sigmoid函数的导函数:
f
′
(
x
)
=
e
−
x
(
1
+
e
−
x
)
2
=
f
(
x
)
(
1
−
f
(
x
)
)
f'(x) = \frac{e^{-x}}{(1+e^{-x})^2}=f(x)(1-f(x))
f′(x)=(1+e−x)2e−x=f(x)(1−f(x))
1.2 对应图像
1.2 生成图像代码
import numpy as np
import matplotlib.pyplot as plt
# 定义Sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义Sigmoid函数的导数
def sigmoid_derivative(x):
return sigmoid(x) * (1 - sigmoid(x))
# 创建一个x值的数组,从-10到10,间隔为0.01
x = np.arange(-10, 10, 0.01)
# 计算Sigmoid函数和它的导数的值
y_sigmoid = sigmoid(x)
y_sigmoid_derivative = sigmoid_derivative(x)
# 绘制Sigmoid函数和它的导数的图像
plt.figure(figsize=(8, 6))
plt.plot(x, y_sigmoid, label='Sigmoid Function')
plt.plot(x, y_sigmoid_derivative, label='Sigmoid Derivative')
# 设置图表的标题和坐标轴标签
plt.title('Sigmoid Function and Its Derivative')
plt.xlabel('x')
plt.ylabel('y')
# 显示图例
plt.legend()
# 设置网格线
plt.grid(True)
# 显示图像
plt.show()
1.4 优点与不足
优点
1、其值域为[0,1],非常适合作为模型的输出函数用于输出一个(0,1)范围内的概率值,可用于将预测概率作为输出的模型,比如用于表示二分类的类别或者用于表示置信度。
2、Sigmoid 函数的输出范围是 0 到 1。由于输出值限定在0到1,因此它对每个神经元的输出进行了归一化。
3、该函数是连续可导的(即可微),可以提供非常平滑的梯度值,防止模型训练过程中出现突变的梯度(即避免「跳跃」的输出值)。
不足
1、从其导数的函数图像上可以看到,其导数的最大值只有0.25,而且当x在[-5,5]的范围外时其导数值就已经几乎接近于0了。这种情况会导致训练过程中神经元处于一种饱和状态,反向传播时其权重几乎得不到更新,从而使得模型变得难以训练,这种现象被称为梯度消失问题。
2、其输出不是以0为中心而是都大于0的(这会降低权重更新的效率),这样下一层的神经元会得到上一层输出的全正信号作为输入,所以Sigmoid激活函数不适合放在神经网络的前面层而一般是放在最后的输出层中使用。
3、需要进行指数运算(计算机运行得较慢),计算量大及计算复杂度高,训练耗时;指数的越大其倒数就越小,容易产生梯度消失。
1.5 torch.sigmoid()函数
在PyTorch中,torch.sigmoid函数用于计算输入张量每个元素的Sigmoid函数值。Sigmoid函数是一个逻辑函数,它可以将任何实数映射到0和1之间
在PyTorch中,torch.sigmoid 函数的签名如下:
torch.sigmoid(input, *, out=None) → Tensor
这里的参数解释如下:
- input (Tensor): 输入张量。
- out (Tensor, optional): 输出张量。如果提供,则函数的结果将写入此张量中,并且函数将返回这个张量。
torch.sigmoid 函数返回一个新的张量,其中包含了输入张量 input 每个元素的Sigmoid函数值。如果提供了 out 参数,则结果将直接写入这个张量中,并且返回这个张量。
例如,你可以像下面这样调用 torch.sigmoid 函数:
import torch
# 创建一个输入张量
input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
# 计算Sigmoid函数值
output_tensor = torch.sigmoid(input_tensor)
# 打印结果
print(output_tensor)
# tensor([0.1192, 0.2689, 0.5000, 0.7311, 0.8808])