机器学习(5)-神经网络

什么是神经网络

此前的线性回归和逻辑回归,在特征数量较多时将面临计算负荷过大的问题。

人工神经网络(Artificial Neural Network,ANN),简称神经网络(Neural Network,缩写NN)或类神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。

神经网络主要由:输入层隐藏层输出层构成,如下图。

输入层接受并规范化数据,将其传递给神经网络。

隐藏层通过加权和激活函数提取特征,执行复杂计算。

输出层生成最终结果,提供预测或分类。

其中,由于输入层未做任何变换,可以不看做单独的一层,当隐藏层只有一层时,该网络为两层神经网络。

神经元模型

神经网络的最基本的构成元素是神经元(Neuron)。从生物学角度看,大脑中有上亿个神经元构成神经网络,神经网络中各个网络之间相互连接,通过神经递质相互传递信息。如果某个神经元接收了足够多的神经递质(乙酰胆碱),那么其点位变会积累地足够高,直到超过某个阈值(Threshold),超过这个阈值之后,此神经元变会被激活,达到兴奋的状态,而后发送神经递质给其他的神经元。

类似的,可以将生物神经网络工作的原理抽象成一个简单的机器学习模型,即MP神经元模型

MP神经元模型

MP神经元模型接收来自n个其他神经元传递过来的输入信号(x1-xn),这些输入信号通过带权重(θ或ω来表示权重,上图采用θ)的连接(Connection)进行传递,然后神经元(图示阈值为b)收到的总输入(即所有输入和权重的乘积的和)与神经元的阈值b比较,并经由激活函数(Activation Function,又称响应函数)处理之后产生神经元的输出。

激活函数

理想情况下,激活函数为阶跃函数,如下图所示,即输出有0或1两种,0表示神经元不兴奋,1表示神经元兴奋。

但阶跃函数不光滑且不连续,因此对于激活函数的选择通常会选择Sigmoid函数,Sigmoid函数在此前的逻辑回归中被用于分类,函数定义和图像如下。

Sigmoid函数的值域是(0,1),因此,其可以将较大范围内变化的输入值压缩到(0,1)区间内,因此也被成为挤压函数(Squashing Function)。

将多个神经单元按照一定的层次连接起来,便得到了一个神经网络。

感知机

感知机(Perceptron)是由两层神经元所构成,输入层接收输入信号之后传输给输出层,输出层为阈值逻辑单元(即MP神经元),感知机可以实现逻辑与、或、非运算。

假设阈值函数为阶跃函数,如下

输出为

则可定义权重ω和阈值b,实现逻辑运算如下

  • 逻辑“与”(x1∧x2):令权重ω1=ω2=1,阈值b=2,则y=f(1x1 + 1x2 -2),当且仅当x1=x2=1时,y=1;
  • 逻辑“或”(x1∨x2):令权重ω1=ω2=1,阈值b=0.5,则y=f(1x1 + 1x2 -0.5),当x1 = 1 或 x2=1时,y=1;
  • 逻辑“非”(﹁x1):令权重ω1=-0.6,ω2=0,阈值b=-0.5,则y=f(-0.6*x1 + 0.5),当x1=1时,y=0,当x1=0时,y=1。

定义权重和阈值,可得到可以进行逻辑运算的感知机,同样的,给定训练数据集,也可以通过学习得到相应地权重和阈值。阈值b可以看做是一个输入固定为-1.0,对应连接权重为ωn+1的固定结点,这样定义阈值,可以将学习权重和阈值简化为只学习权重。

在感知机中,只有输出层神经元进行激活函数的处理,意味着感知机只有一层功能神经元(Functional Neuron),因此,感知机的学习能力有限。实际上,通过感知机所实现的逻辑运算都是线性可分问题。

线性可分问题

若两类模式是线性可分的,那么存在一个线性超平面能将其分开,则感知机的学习过程一定会收敛从而得到合适的权向量。

否则,在学习的过程中,感知机会产生震荡,无法得到稳定的权向量,感知机无法求解。这意味着感知机无法解决像“异或XOR”(异或是非线性可分的问题)这样的非线性可分问题。

多层神经网络

神经元来组合成更为复杂的神经网络以实现更复杂的运算,例如要实现同或XNOR功能(即输入的两个值必须一样,均为 1 或均为 0)。

已知 XNOR = (x1 ANDx2) OR((NOT x1 )AND(NOT x2 ))

先构造一个能表达(NOT x1 )AND(NOT x2 )部分的神经元,如下

再将表示 AND 的神经元和表示(NOT x1 )AND(NOT x2 )的神经元以及表示 OR 的神 经元进行组合,得到如下的神经网络。

这样就实现了同或XNOR功能,通过这种方法,可以逐渐构造出越来越复杂的函数,让神经网络能够完成更复杂的任务。

神经网络算法

算法步骤

神经网络训练过程中每一次需要迭代的部分为:前向传播和计算损失、反向传播和权值更新。

前向传播简单而言就是计算预测y的过程 ,后向传播则是根据预测值和实际值之间的误差不断往回推更新权值和偏置的过程。

算法分析

  • 提升隐层数量或者隐层神经元个数,神经网络的“容量”会变大,空间表达能力会变强。
  • 过多的隐层和神经元结点会带来过拟合问题。

目标函数

交叉熵代价函数(二分类交叉熵解决多分类问题)

均方误差

优化算法

神经网络与普通的分类器不同,其是一个巨大的网络,最后一层的输出与每一层的神经元都有关系。而神经网络的每一层,与下一层之间,都存在一个参数矩阵。我们需要通过优化算法求出每一层的参数矩阵,对于一个有 K 层的神经网络,我们共需要求解出 K−1 个参数矩阵。因此我们无法直接对目标函数进行梯度的计算来求解参数矩阵。

前向传播

前向传播就是从输入层到输出层,计算每一层每一个神经元的激活值。也就是先随机初始化每一层的参数矩阵,然后从输入层开始,依次计算下一层每个神经元的激活值,一直到最后计算输出层神经元的激活值。

反向传播

反向传播,就是根据前向传播计算出来的激活值,来计算每一层参数的梯度,并从后往前进行参数的更新。

神经网络-python

对鸢尾花(iris)数据集进行分类预测,使用sklearn的MLPClassifier建立神经网络

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import classification_report, accuracy_score

# 加载Iris数据集
iris = load_iris()
X = iris.data
y = iris.target

# 数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 对特征进行标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 构建神经网络模型
model = MLPClassifier(hidden_layer_sizes=(10,), max_iter=1000, random_state=42)

# 训练模型
model.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)

# 输出分类报告和准确率
print("Classification Report:\n", classification_report(y_test, y_pred))
print("Accuracy Score:", accuracy_score(y_test, y_pred))

参考

机器学习算法(九):神经网络(neural networks,NN)_神经网络算法-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值