激活函数
激活函数(activation function)通过计算加权和并加上偏置来确定神经元是否应该被激活, 它们将输入信号转换为输出的可微运算。
import torch
import matplotlib.pyplot as plt
简单定义一个画图的函数
def graph_drawing(x_,y_,label_=None):
plt.figure(figsize=(5, 2.5)) # 设置图形窗口的大小
if label_ is None:
plt.plot(x_, y_)
else:
plt.plot(x_, y_, label = label_)
# plt.plot()里不要marker='x'更好看
plt.legend() # 显示图例
plt.show()
创建数据
# 创建 x 数据,并设置 requires_grad=True
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
ReLU函数
ReLU(Rectified Linear Unit)函数是一种在深度学习中广泛使用的激活函数,其表达式为f(x) = max(0, x)。它简单地将所有的负值置为0,保持正值不变,有助于解决梯度消失问题,并加速神经网络的训练过程。
# 应用 ReLU 函数
y = torch.relu(x)
graph_drawing(x_=x.detach(),y_=y.detach(),label_='relu(x)')
当输入为负时,ReLU函数的导数为0,而当输入为正时,ReLU函数的导数为1。 当输入值精确等于0时,ReLU函数不可导。可以忽略这种情况,因为输入可能永远都不会是0.
# 绘制ReLU函数的导函数图像
y.backward(torch.ones_like(x), retain_graph=True)
# retain_graph=True:这是一个可选参数,用于控制梯度图(即用于计算梯度的图结构)的保留。在默认情况下,.backward()会清除梯度图以节省内存。
graph_drawing(x_=x.detach(),y_=x.grad.numpy(),label_='grad of ReLU')
#转换为 numpy 数组,似乎转不转都行
sigmoid函数
对于一个定义域在R中的输入, sigmoid函数将输入变换为区间(0, 1)上的输出。 因此,sigmoid通常称为挤压函数(squashing function): 它将范围(-inf, inf)中的任意输入压缩到区间(0, 1)中的某个值。
当我们想要将输出视作二元分类问题的概率时, sigmoid仍然被广泛用作输出单元上的激活函数 (sigmoid可以视为softmax的特例)。
当输入接近0时,sigmoid函数接近线性变换。
# 绘制sigmoid函数图像
y = torch.sigmoid(x)
graph_drawing(x_=x.detach(),y_=y.detach(),label_='sigmoid(x)')
sigmoid函数的导数当输入为0时,sigmoid函数的导数达到最大值0.25; 而输入在任一方向上越远离0点时,导数越接近0。
# 清除以前的梯度
x.grad.data.zero_()
y.backward(torch.ones_like(x),retain_graph=True)
graph_drawing(x_=x.detach(),y_=x.grad.numpy(),label_='grad of sigmoid')
tanh函数
与sigmoid函数类似, tanh(双曲正切)函数也能将其输入压缩转换到区间(-1, 1)上。
y = torch.tanh(x)
graph_drawing(x_=x.detach().numpy(), y_=y.detach().numpy(), label_='tanh(x)')
tanh函数的导数图像: 当输入接近0时,tanh函数的导数接近最大值1。 与sigmoid函数图像类似, 输入在任一方向上越远离0点,导数越接近0
# 清除以前的梯度
x.grad.data.zero_()
y.backward(torch.ones_like(x),retain_graph=True)
graph_drawing(x_=x.detach(),y_=x.grad.numpy(),label_='grad of tanh')
封面图片来源
欢迎点击我的主页查看更多文章。
本人学习地址https://zh-v2.d2l.ai/
恳请大佬批评指正。