神经网络(Neural Network)是以人脑中的神经网络为启发的,历史上出现过很多不同的版本,其中最著名也是最常用的算法就是在1980提出的backpropagation(反向传播),也可以称为BP神经网络,它被应用于多层向前神经网络(Multilayer Feed-Forward Neural Network)。

定义

多层向前神经网络由3部分组成,输入层(input layer),隐藏层(hidden layers),输出层(output layers)。

  • 每一层由单元(units)组成,我们也可称其为神经节点。
  • 输入层(input layer)由训练集的实例特征向量传入。
  • 经过连接点的权重传入下一层,一层的输出是下一层的输入。
  • 隐藏层(hidden layer)的个数可以是任意的,输入层有一层,输出层有一层。
  • 上面这幅图称为两层神经网络(输入层不算)。
  • 作为多层向前神经网络,理论上,如果有足够多的隐藏层,和足够大的训练集,可以模拟出任何方程。

设计神经网络结构

  1. 使用神经网络训练数据之前,必须先设计神经网络的结构,也就是确定神经网络的层数以及每层的单元个数。
  2. 特征向量在被传入输入层时,通常要先标准化到0,1之间,目的是加速学习的过程。
  3. 离散型变量的可以被编码成:每一个输入单元对应一个特征值可能被赋的值。
  4. 没有特定的规则来说明最好设计多少个隐藏层,往往需要根据实验测试和误差,以及准确度来实验并改进。

分类

神经网络既可以做分类,也可以解决回归问题,
本文主要讨论分类问题。

  • 二分类:用一个输出单元表示(分别用0和1表示)。
  • 多于两类:每一个类别用一个输出单元表示。

所以,一般情况下,输出单元数量,往往等于类别数量。

交叉验证

之前介绍的机器学习的一般框架主要是把一组数据分成训练集和测试集两部分。训练集来训练模型。测试集输入进去看结果是不是对的,根据正确率得到一个准确度。

机器学习中还有一种更常用和科学的方法,交叉验证方法(cross-validation)。下面来介绍一下这种方法。

前面我们用机器学习的一般框架是把数据分成2份,一份测试集一份数据集。

交叉验证方法就是把数据分成更多份,比如像上图中分成3份,其中2份当做训练集,1份当做测试集。重复三次,就可以得到3个准确度,做一个均值就得到最终的准确度,这就是交叉验证。实际上可以分成任意的K份,所以这个方法也被称为K-fold cross validation。

backpropagation算法

开篇的时候提到神经网络中最常用的算法就是backpropagation,下面是这种BP算法的主要思想:

  1. 通过迭代性处理训练集中的实例。
  2. 对比经过神经网络后输入层预测值(predict value)和真实值(target value)。
  3. 反方向(output->hidden->input)来以最小化误差(error)来更新每个连接的权重(weight)。

输入

数据集、学习率(learning rate)和一个多层向前神经网络。

输出

一个训练好的神经网络。

初始化

权重(weights)和偏向(bias,每个单元都有这样一个偏向)需要在开始时进行初始化,一般在-1到1或-0.5到0.5之间进行随机初始化。

步骤

对于一个训练实例X执行以下步骤:

  1. 由输入层,向前传送,具体传递和计算过程见下图:

$$I_j=\sum_{i}{} w_ij O_i+\theta_j$$

其中,\(O_j=\frac{1}{1+{e^{-I_j}}}\)

如上图所示n个单元,加权求和加上一个偏向后得到一个值,再代入上面的非线性转化方程,可以得到输出结果。

通过这样的方式就能够一步一步正向的计算出最后输出,接下来就是倒推回去修正优化神经网络。

2.根据误差(error)反向传送。

  • 输出层:\(E_{rr_j}=O_j(1-O_j)(T_j-O_j)\)
  • 隐藏层:\(E_{rr_j}=O_j(1-O_j)\sum_{k}{} E_{rr_j} w_{jk}\)
  • 权重更新:\(w_{ij}(new)=w_{ij}(old)+\Delta w_{ij}\),其中,\(\Delta w_{ij}=(l)E_{rr_j}O_i\),l为学习率(learning rate)。
  • 偏向更新:\(\theta_j(new)=\theta_j(old)+\Delta \theta_j\),其中,\(\Delta \theta_j=(l)E_{rr_j}O_i\)

注:上述的更新实际上采用的是一种梯度爬行的方法。

3.终止条件。

  • 权重的更新低于某个阈值。
  • 预测的错误率低于某个阈值。
  • 达到预设的循环次数。

实际上最核心的过程就是在不断的更新、优化权重和偏向。以上就是对神经网络的初步认识,为后面的深度学习打下基础,本文完。