前文介绍
我们在前面了解到了线性回归模型,其实我们可以把线性回归看成一个单个的神经元,它实际上就完成了两个步骤
1.对输入的特征的加权求和
2.将结果通过传递函数(或者激活函数)输出
这里我们提到了传递函数(或者激活函数),我们从线性回归的模型中可以看出,在回归问题上,输出并没有做激活,仅仅是直接输出
单个神将元所完成的任务就是对所有输入的特征乘以权重(w)、加上偏置(b)。例如有3个特征,分别为x1,x2,x3,那么线性回归模型所做的就是对这些输入特征乘以权重(w),加上偏置(b),使用激活函数激活后,然后输出
输出=激活函数(w1*x1+w2*x2+w3*x3+b)
激活函数
激活为了模拟生物大脑中神经元的工作原理,大脑中神经元会对接收到的信号进行考察,如果此信号满足一定条件,神经元才会将信号往下输出,繁殖就不往下传递了。激活函数的作用也类似,激活会为网络带来非线性,使得网络可以拟合非线性问题等更多复杂问题,大大增强了网络的拟合能力。
神经网络的作用有哪些呢
引入非线性关系:神经网络中的每一层都是由线性变换和激活函数组成的,激活函数的非线性特性使得神经网络能够学习和表示更为复杂的函数关系。
解决梯度消失问题:在深度神经网络中,梯度消失问题是一个普遍存在的问题。激活函数的非线性特性可以使得梯度在反向传播时更容易传递,从而缓解梯度消失问题。
去除对称性:在神经网络中,如果所有的神经元都使用相同的激活函数,那么神经网络会出现对称性的问题。而使用不同的激活函数可以打破对称性,使得神经网络可以更好地学习和表示不同的特征。
控制输出范围:有些激活函数可以控制输出的范围,例如sigmoid函数可以将输出限制在0到1之间,tanh函数可以将输出限制在-1到1之间。这些函数可以使得神经网络更加稳定和鲁棒。
模块导入
import torch
import numpy as np
import matplotlib.pyplot as plt
from torch import nn
ReLU激活函数
ReLU也叫修正线性单元,是目前应用最多的一个激活函数,在当前大部分模型中,都是用ReLU函数作为激活函数,其公式如下
f(x)=max(x,0)
ReLU激活函数的特点是,如果输入是大于0的,将其往后传递,反之则输出0,ReLU激活函数在实际应用中几乎是当前最受欢迎的激活函数,它是大多数神经网络的默认选择,在PyTorch中有内置的torch.relu()方法用来实现ReLU激活。
input=torch.randn(2) # 生成随机数input
print(input)
output=torch.relu(input) #对输入激活得到输出
print(output)
绘图展示
x = np.linspace(-5, 5, 100)
y = np.maximum(0, x)
plt.plot(x, y)
plt.title('ReLU Activation Function')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid(True)
plt.show()
Sigmoid激活函数
sigmoid函数的输出可以认为是一个是或者否的概率值,常用来解决二分类问题
input=torch.randn(2)
print(input)
output=torch.sigmoid(input)
print(output)
number=-1
for i in output:
number+=1
if i>0.5:
output[number]=1
else:
output[number]=0
print(output)
绘图展示
def sigmoid(x):
return 1 / (1 + np.exp(-x))
x = np.linspace(-5, 5, 100)
y = sigmoid(x)
plt.plot(x, y)
plt.title('Sigmoid Activation Function')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid(True)
plt.show()
Tanh函数
其中心位置是0,其输出为(-1,1)。Tanh激活函数的一个常见的使用场景是对生成模型的输出做激活,从而使得输出规范为(-1,1)。PyTorch的内置函数torch.tanh()用来实现双曲正切激活函数
绘图展示
input=np.linspace(-6, 6,100)
input_tensor=torch.from_numpy(input)
output=torch.tanh(input_tensor)
output_numpy=output.numpy()
plt.plot(input,output_numpy)
plt.title('Tanh')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()
LeakyReLU激活函数
input=np.linspace(-6,6,100)
input_tensor=torch.tensor(input)
m=nn.LeakyReLU(0) # 初始化LeakyReLU,参数表示负轴部分的斜率
output=m(input_tensor)
output_numpy=output.numpy()
plt.plot(input,output_numpy)
plt.title('LeakyReLU')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()