一我的工神经网络(Artificial Neural Network, ANN)其实就是一个计算模型,其灵感来自于人类大脑中生物神经网络处理信息的方式。人工神经网络在机器学习和科研行业引发来不小的热潮,其中已经不乏不少突破性的成果,例如 语音识别
、计算机视觉
、文字处理
、计算机决策
等等。在这篇文章中,咱们将尝试开发一个流行的人工神经网络---多层感知器。html
在神经网络计算中,计算最基本的单元是---神经元(neuron),一般又称为节点(node)或者单元(unit)*,它从一些其余节点或从外部源接收输入并计算输出。每一个输入都会关联一个权值(weight)**,它是相对于其余输出的相对重要性而分配的。除了输入层节点外,每一个节点为一个计算单元,能够经过一个计算函数f对输入进行加权求和,以下图所示:node
上面的网络从输入X1和X2获取数值,并从节点关联的w1和w2中获取权重。另外还要一个输入1**,关联的权重为b(Bias:偏置)。咱们将在后面详细解释偏置。python
在上图中计算的结果输出为Y。计算函数f是非线性的,也叫作激活函数。激活函数的目的是将非线性引入到神经元的输出中。这很是重要,由于大多数真实世界的数据是非线性的,咱们但愿神经元学习这些非线性的描述。linux
每一个激活函数(或者非线性)都采用单个数据并对其执行某个固定的数学运算。 在实践中可能会遇到几个激活函数:git
Sigmoid: 获取真实值进行输入,并将其压缩到0和1的范围github
σ(x) = 1 / (1 + exp(−x))
复制代码
tanh: 获取真实值进行输入,并将其压缩到范围[-1,1]算法
tanh(x) = 2σ(2x) − 1
复制代码
ReLU: ReLU表明整流线性单元。采用真实值输入且阈值为0(使用0替换负值)markdown
f(x) = max(0, x)
复制代码
下图展现了三种激活函数:网络
**偏置的重要性:**Bias的主要功能是为每一个节点提供可训练的常数值(除了节点接收的正常值外)。能够参考this link了解更多关于Bias的知识。dom
前馈神经网络是第一个也是最简单的人工神经网络设计。其包含了多层的排列的神经元(节点)。相邻层之间的节点具备链接或者边,全部的这些链接都有权重向关联。
下图是一个前馈神经网络的网络设计:
一个前馈神经网络有一下三种类型的节点组成:
在前馈网络中,信息的移动只有一个方向 -- 前向 -- 从输入层获取信息,经过隐藏层(若是有),最后到达输出层。在网络中没有环或者循环。Feedforward neural network
前馈神经网络的两个示例以下:
一个多层感知器(MLP)包含一个或者多个隐藏层(除了一个输入层和一个输出层)。单层感知器能够学习线性函数,多层感知器能够学习非线性函数。
前馈神经网络部分的样图中,就是一个包含单个隐藏层的多层感知器,全部的链接都有相关联的权重,但上图中仅仅显示了(w0,w1,w2)三个而已。
输入层: 输入层含有三个节点,Bias节点有一个值 1,其余两个节点将 X1 和 X2 做为外部输入(取决于输入数据集的数值)。前面已经讲过,在输入层不进行任何的计算,所以输入层的输出分别是 1,X1 和 X2,其被馈送到隐藏层。
隐藏层: 隐藏层一样含有三个节点,其中Bias节点带有一个输出值 1 。隐藏层其余节点的输出取决于和该节点链接(边)的输入层(1,X1,X2)以及其相关联的权重。下图展现了其中一个节点(亮色表示)的输出。一样,其余节点的输出都是被计算过的,还记得以前讲过的激活函数f吗。计算后的结果会馈送给输出层:
输出层: 输出层有两个节点,它们从隐藏层接收输入,并执行与亮色显示的隐藏节点所示的计算。计算的结果(Y1和Y2)就是这个多层感知器的输出。
给定一组特征X = (x1, x2, ...)和目标y,多层感知器能够学习特征和目标之间的关系,以用于分类和回归。
让咱们使用一个示例来解释多层感知器,以更好的理解。假设咱们有一组关于学生标记的数据集:
前两个输入栏显示的是学生学习的小时数和学生中期考核。最终的结果列有两个值 0 或者 1 ,表示学生是否经过了期末考核。例如,能够看到,若是学生学习了35个小时,并在中期得到了67分,他/她就最终经过了期末考核。
可是若是有一个新的学生,其学习的时长为25个小时,中期获得70分,其是否经过最后的期末考核呢?
这实际上是一个典型的二元分类问题,多层感知器可以从给定的示例(训练数据)中学习而且可以在新的数据点下给出执行的预测。咱们将在下面看到多层感知器是如何学习这样的关系的。
多层感知器学习的算法叫作反向传播算法。我建议阅读这个Quora答案Hemanth Kumar(下面引用),这解释了反向传播明确。
Backward Propagation of Errors, often abbreviated as BackProp is one of the several ways in which an artificial neural network (ANN) can be trained. It is a supervised training scheme, which means, it learns from labeled training data (there is a supervisor, to guide its learning).
To put in simple terms, BackProp is like “learning from mistakes“. The supervisor corrects the ANN whenever it makes mistakes.
An ANN consists of nodes in different layers; input layer, intermediate hidden layer(s) and the output layer. The connections between nodes of adjacent layers have “weights” associated with them. The goal of learning is to assign correct weights for these edges. Given an input vector, these weights determine what the output vector is.
In supervised learning, the training set is labeled. This means, for some given inputs, we know the desired/expected output (label).
BackProp Algorithm: Initially all the edge weights are randomly assigned. For every input in the training dataset, the ANN is activated and its output is observed. This output is compared with the desired output that we already know, and the error is “propagated” back to the previous layer. This error is noted and the weights are “adjusted” accordingly. This process is repeated until the output error is below a predetermined threshold.
Once the above algorithm terminates, we have a “learned” ANN which, we consider is ready to work with “new” inputs. This ANN is said to have learned from several examples (labeled data) and from its mistakes (error propagation).
如今已经对反向传播有了必定的了解,让咱们回到上面学生标记的问题中。
设想,咱们的多层感知器中包含两个输入节点(除去Bias节点),分别用于“学生学习小时数”和“中期考核成绩”,一样含有一个隐藏层包含两个节点(除去Bias节点),输出层一样含有两个节点 --- 上层节点输出“经过”的几率,而下层节点输出“失败”的几率。
一般使用Softmax 函数做为多层感知器输出层中的激活函数,以确保输出是几率,而且相加为 1 。Softmax函数使用任意真实数据的向量,并将其压缩为 0 和 1 之间的值得向量,其总和为 1。所以,在这种状况下:
Probability (Pass) + Probability (Fail) = 1
复制代码
Step 1: 前向传播
网络中的权重都是随机分配的。让咱们考虑下面图中标记为V的隐藏层节点。假设从输入到该节点的链接的权重是w1,w2和w3(如图所示)。
而后网络将第一组训练样本做为输入(咱们知道第一组的输入为35何67,经过的几率为1)。
而后考虑中的节点的输出 V 可以按照以下的公式计算(f是相似sigmoid的激活函数):
V = f(1*w1 + 35*w2 + 67*w3)
复制代码
一样的,其余隐藏节点的输出也是计算过的。隐藏层两个节点的输入时输入层两个节点的输出。这使咱们可以从输出层中的两个节点计算输出几率。
假设输出层两个节点的输出几率分别为 0.4 和 0.6(因为权重是随机分配的,所以输出也是随机的)。咱们能够看到计算的几率(0.4 和 0.6)里最终的指望几率(1 和 0)很是远,所以下图被定义为“不正确的输出”。
Step 2: 反向传播和权重更新
在上一步中,能够看到计算的输出有很大的偏差,咱们经过计算输出节点处的总偏差,并经过网络使用反向传播将这些偏差传播回计算梯度。而后使用一种优化的方法,例如梯度降低来调整全部网络节点中的权重,目的是减少输出层的偏差。以下图所示(先忽略下图中的数学方程):
假设与所考虑的节点相关联的新权重是w4,w5和w6(在反向传播和调整权重以后)。
如今,再次使用一样的样本输入到网络中,网络应该比以前更好的执行,由于如今调整了权重以最小化预测中的偏差。以下图所示,输出节点的偏差已经由以前的[0.6, -0.4]减少到了[0.2, -0.2],这意味着咱们的网络已经学会正确的分类第一个训练样本了。
在其余数据集中的训练样本重复这个过程,最后,网络说已经学会了这些样本了。
若是如今须要预测一个学习时长为25小时,中期考核已经获得70分的学生,是否可以在期末考核中经过呢,咱们经过正向传播步骤找到最后经过和非经过的几率便可。
在文章中已经忽略了不少的数学方程和概念,例如“梯度降低”等。有关反向传播算法的更多数学参考的讨论,请参阅此连接。
前面虽然讲了那么多多层感知器的理论知识,可是对于学习来讲,最好的方式仍是可以直观的看到整个感知器的执行过程和结果最好,Adam Harley建立了一个多层感知器的3D可视化工具,而且已经使用反向传播训练了手写数字MINIST的数据集。
网络从一个手写数字的28×28图像(其在输入层中具备对应于像素的784个节点)获取784个数字像素值做为输入。 网络在第一隐藏层中具备300个节点,在第二隐藏层中具备100个节点,在输出层中具备10个节点(对应于10位数字)。
虽然这里描述的网络比咱们在前面部分讨论的更大(使用更多的隐藏层和节点),可是正向传播步骤和反向传播步骤中的全部计算都以相同的方式完成(在每一个节点) 以前。
下图展现了当输入数字“5”时的网络:
具备比其余输出值更高的输出值的节点由更亮的颜色表示。 在输入层中,亮节点是接收较高数值像素值做为输入的节点。 注意在输出层中,惟一的明亮节点对应于数字5(其输出几率为1,其高于输出几率为0的其余九个节点)。 这表示MLP已正确分类输入数字。
这篇文章到此算是一个结束,文章中还有不少的数学工程和相关概念没有解释,就当作后续继续学习的动力吧。
本文针对神经网络进行了简单的介绍,对其中的多层感知器进行了说明和举例,可是多层感知器的内容不只限于此,在不断地学习中会有更多内容和新知识会遇到,不断地努力才是正道。