「机器学习算法的数学解析与Python实现」神经网络分类算法
用神经网络解决分类问题
神经网络也称为人工神经网络(Artificial Neural Network, ANN)。
神经网络的4个概念:
- 神经元
- 兴奋传递
- 激活函数
- 反向传播机制
用圆圈表示神经元,箭头表示数据流向,一个神经元如图所示:
![](https://tva1.sinaimg.cn/large/008i3skNgy1gxqaczj6lhj30u00o8jrm.jpg)
上图表示的是从一个方向获取数据,经过神经元处理后,将结果数据向三个方向进行输出。
神经元的内部结构
神经元从数学的角度来说,我们可以认为代表了一个函数。
但是神经元函数通常由两个部分组成:
- 线性函数
- 非线性函数,称为激活函数(Activation Function)
神经元内部结构图
![](https://tva1.sinaimg.cn/large/008eGmZEgy1gnv7drbjo3j30lh0gkdhd.jpg)
多个神经元之间相互连接,就构成了人工神经网络:
![](https://tva1.sinaimg.cn/large/008eGmZEgy1gnv7dh0wxmj30nu0fqmzi.jpg)
激活函数
激活函数用于产生二元输出,描述如下:
if (满足激活条件):
return 1
else:
return 0
这也就是神经网络可以用于分类的原因。
神经网络的传递机制
神经元的作用就两个:
- 感受刺激
- 传递兴奋
由于激活函数的存在,神经元就能够根据需要传递1或者0,最终利用“兴奋传递”机制完成判断:
![](https://tva1.sinaimg.cn/large/008eGmZEgy1gnv7d404dnj30jk0bqt9z.jpg)
这个过程称为正向传播。
什么样的函数能够成为激活函数?
从原理上来说,激活函数的输出不是“0”就是“1”,这是非常典型的阶跃函数。Sgn函数就是最知名的一个阶跃函数,但是由于它不可导,这对于优化算法来说非常致命。
而Logistic函数即可以模拟“阶跃”的效果,又可导,所以Logistic函数是一个非常好的激活函数的选择,在神经网络中,习惯将其称为Sigmoid函数。Sigmoid函数在0点附近,特别是在\((-1,1)\)区间非常平缓,变化率非常小,在使用梯度下降等优化方法时,很容易导致梯度弥散甚至梯度消失。
因此,业界开始使用Tanh函数来作为激活函数,Tanh同样满足可导和阶跃两大要求。同时,相比Sigmoid函数,Tanh函数梯度更大,使用梯度下降等优化方法时收敛更快,所需要的学习时间更短。虽然梯度比Sigmoid函数大,但是越接近0点,变化率越小的问题依然存在。为了解决这个问题,又开发出了ReLu函数来作为激活函数,这也是目前公认效果最好的激活函数。
Logistic回归可以看成只有一层的神经网络。
在神经网络中,层(Layer)是非常重要的概念,深度学习中所谓的“深度”就是神经网络的层数很多、很深的意思。
一个三层的神经网络构成如下:
- 输入层:第一层,直接接受输入数据的神经元;
- 隐藏层:中间所有层,既不直接接受输入,也不直接产生输出,所以统称为隐藏层;
- 输出层:最后一层,产生最终数据并输出到外部。
这就是最简单的神经网络,只有一层隐藏层。
![](https://tva1.sinaimg.cn/large/008eGmZEgy1gnv7crebzdj30t30krdjc.jpg)
一般来说,神经元的个数和层数越多,模型的学习能力就越强。
神经网络分类的算法原理
基本思路
为了训练,神经网络引入了正向传播和反向传播机制。正向传播扮演的是传播输入的功能,输入层首先接收输入,通过激励函数产生输出,而输出则作为隐藏层的输入,就这样一步一步的传递下去,直到输出层产生输出。
而反向传播的意义是为了调节每个神经元的权重,首先通过输出层获取偏差,调整权值,然后一层一层地反向传播,一直到输出层,整个神经网络就完成了一轮权值更新。
数学解析
1.激活函数
Tanh函数(双曲正切函数)的数学表达式如下:
ReLu函数(线性整流函数,Rectified Linear Unit)的数学表达式如下:
2.反向传播
正向传播实际上就是简单的代数赋值运算过程,比较难的是反向传播。
神经网络算法的反向传播的独特之处在于方向。神经网络中一个神经元的输入可能源于多个神经元的输出,比如A、B、C都给D贡献了输入:
![](https://tva1.sinaimg.cn/large/008eGmZEgy1gnv7cbwqb1j30cz0dcmy3.jpg)
现在知道了D的损失偏差,怎么计算A、B、C分别“贡献”了多少偏差呢?这就是反向传播要解决的核心问题。
方法就是用偏导。
具体步骤
神经网络分类算法是一种有监督的分类算法。
神经网络分类算法信息表
使用神经网络分类算法需要五步:
- 初始化所有神经元激励函数的权值;
- 输入层接收输入,通过正向传播产生输出;
- 根据输出的预测值,结合实际值计算偏差;
- 输出层接收偏差,通过反向传播机制让所有神经元更新权值;
- 重复2~4步训练过程,直到偏差最小。
在Python中使用神经网络分类算法
在sklearn中,基于神经网络的算法模型都在neural_network
包中,神经网络算法在sklearn中被称为多层感知机(Multi-layer Perceptron, MLP)。
本章介绍的神经网络分类算法可通过MLPClassifier
类调用,用法如下:
# 从sklearn中导入神经网络模型中的神经网络分类算法
from sklearn.neural_network import MLPClassifier
# 载入鸢尾花数据集
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
# 训练模型
clf = MLPClassifier().fit(X, y)
# 使用模型进行分类预测
clf.predict(X)
预测结果如下:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
使用默认的性能评估器评分:
clf.score(X, y)
性能得分如下:
0.98
神经网络分类算法的使用场景
神经网络分类算法的特点