用神经网络解决分类问题

神经网络也称为人工神经网络(Artificial Neural Network, ANN)。

神经网络的4个概念:

  • 神经元
  • 兴奋传递
  • 激活函数
  • 反向传播机制

用圆圈表示神经元,箭头表示数据流向,一个神经元如图所示:

神经网络的分类算法代码 神经网络算法分类实例_机器学习

上图表示的是从一个方向获取数据,经过神经元处理后,将结果数据向三个方向进行输出。

神经元的内部结构

神经元从数学的角度来说,我们可以认为代表了一个函数。

但是神经元函数通常由两个部分组成:

  1. 线性函数
  2. 非线性函数,称为激活函数(Activation Function)

神经元内部结构图

神经网络的分类算法代码 神经网络算法分类实例_Pyhton_02

多个神经元之间相互连接,就构成了人工神经网络:

神经网络的分类算法代码 神经网络算法分类实例_激活函数_03

激活函数

激活函数用于产生二元输出,描述如下:

if (满足激活条件):
	return 1
else:
	return 0

这也就是神经网络可以用于分类的原因。

神经网络的传递机制

神经元的作用就两个:

  1. 感受刺激
  2. 传递兴奋

由于激活函数的存在,神经元就能够根据需要传递1或者0,最终利用“兴奋传递”机制完成判断:

神经网络的分类算法代码 神经网络算法分类实例_神经网络_04

这个过程称为正向传播

什么样的函数能够成为激活函数?

从原理上来说,激活函数的输出不是“0”就是“1”,这是非常典型的阶跃函数。Sgn函数就是最知名的一个阶跃函数,但是由于它不可导,这对于优化算法来说非常致命。

Logistic函数即可以模拟“阶跃”的效果,又可导,所以Logistic函数是一个非常好的激活函数的选择,在神经网络中,习惯将其称为Sigmoid函数。Sigmoid函数在0点附近,特别是在\((-1,1)\)区间非常平缓,变化率非常小,在使用梯度下降等优化方法时,很容易导致梯度弥散甚至梯度消失。

因此,业界开始使用Tanh函数来作为激活函数,Tanh同样满足可导和阶跃两大要求。同时,相比Sigmoid函数,Tanh函数梯度更大,使用梯度下降等优化方法时收敛更快,所需要的学习时间更短。虽然梯度比Sigmoid函数大,但是越接近0点,变化率越小的问题依然存在。为了解决这个问题,又开发出了ReLu函数来作为激活函数,这也是目前公认效果最好的激活函数。

Logistic回归可以看成只有一层的神经网络。

在神经网络中,层(Layer)是非常重要的概念,深度学习中所谓的“深度”就是神经网络的层数很多、很深的意思。

一个三层的神经网络构成如下:

  • 输入层:第一层,直接接受输入数据的神经元;
  • 隐藏层:中间所有层,既不直接接受输入,也不直接产生输出,所以统称为隐藏层;
  • 输出层:最后一层,产生最终数据并输出到外部。

这就是最简单的神经网络,只有一层隐藏层。

神经网络的分类算法代码 神经网络算法分类实例_激活函数_05

一般来说,神经元的个数和层数越多,模型的学习能力就越强。

神经网络分类的算法原理

基本思路

为了训练,神经网络引入了正向传播和反向传播机制。正向传播扮演的是传播输入的功能,输入层首先接收输入,通过激励函数产生输出,而输出则作为隐藏层的输入,就这样一步一步的传递下去,直到输出层产生输出。

而反向传播的意义是为了调节每个神经元的权重,首先通过输出层获取偏差,调整权值,然后一层一层地反向传播,一直到输出层,整个神经网络就完成了一轮权值更新。

数学解析

1.激活函数

Tanh函数(双曲正切函数)的数学表达式如下:

\[tanh(x) = \frac{\sinh(x)}{\cosh(x)} = \frac{e^x-e^{-x}}{e^x+e^{-x}} \]

ReLu函数(线性整流函数,Rectified Linear Unit)的数学表达式如下:

\[ReLu(x) = \max(0,x) \]

2.反向传播

正向传播实际上就是简单的代数赋值运算过程,比较难的是反向传播。

神经网络算法的反向传播的独特之处在于方向。神经网络中一个神经元的输入可能源于多个神经元的输出,比如A、B、C都给D贡献了输入:

神经网络的分类算法代码 神经网络算法分类实例_机器学习_06

现在知道了D的损失偏差,怎么计算A、B、C分别“贡献”了多少偏差呢?这就是反向传播要解决的核心问题。

方法就是用偏导

具体步骤

神经网络分类算法是一种有监督的分类算法。

神经网络分类算法信息表

神经网络的分类算法代码 神经网络算法分类实例_激活函数_07

使用神经网络分类算法需要五步:

  1. 初始化所有神经元激励函数的权值;
  2. 输入层接收输入,通过正向传播产生输出;
  3. 根据输出的预测值,结合实际值计算偏差;
  4. 输出层接收偏差,通过反向传播机制让所有神经元更新权值;
  5. 重复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

神经网络分类算法的使用场景

神经网络分类算法的特点

神经网络的分类算法代码 神经网络算法分类实例_机器学习_08