深度学习基础——神经网络起步

来源:互联网 发布:钻井液计算软件 编辑:程序博客网 时间:2024/06/05 22:51

深度学习基础——神经网络起步

原文地址Fundamentals of Deep Learning – Starting with Artificial Neural Network

前言

 深度学习和神经网络如今驱动着计算机科学的进步,两者拥有强大的通过数据和环境学习获取信息的能力,这也导致他们是机器学习领域的首选手段。
 深度学习和神经网络是自动驾驶,图像识别和推荐系统等产品的核心。而且,他们能够作为适应多种数据类型的通用算法。
 有人可能认为神经网络是很复杂的。因此,很多没使用过的人甚至是使用过它的人都把它当作一个黑盒,何为黑盒,也就是不关注深度学习的实现细节。但是要想熟练的运用他们就必须认识理解他们。
 在这篇文章中,我会尝试深入浅出的解释神经网络的概念。理解这篇文章只需要你掌握简单的生物学知识以及看下去的耐心。当你阅读完这篇文章,你会成为一个能够自信使用神经网络的数据分析师。
神经网络

主要内容:

  1. 什么是神经网络
  2. 单个神经元如何工作
  3. 为什么经常用到多层网络
  4. 神经网络的基本结构
  5. 后向反馈(重要!)

什么是神经网络

 神经网络也称为人工神经(ANN)网络顾名思义也就是人为模仿人类神经系统的工作模式。让我们重新学习一下人类的神经系统

神经系统

人类的神经系统主要的组成为:

  • 树突:接受刺激并将冲动传入细胞体的功能
  • 神经元:神经系统的结构和功能单位
  • 突触末梢:将刺激传出细胞体的功能

简单来说,每一个神经元都会通过树突接收多个神经元的刺激。然后它会对接收到的刺激进行必要的处理然后按照特定的规则向突触末梢传输脉冲电流。

人工神经网络(ANN)的工作模式非常相似。神经网络的基本工作框架如下

神经网络工作框架

图中展示了单个神经元在典型的神经网络中的工作模式,下面会详细解释。
和人类的神经系统类似,数据输入就像树突接受刺激一样然后神经元对输入进行校验和处理。最后将数据传输到另外一个和它相连的神经元(或者是下一层)。神经网络可以分成三层:

  • 输入层:输入层中的神经元用于输入训练数据或测试数据
  • 隐藏层:这是隐藏在输入层和输出层之间的层,能够使得神经网络在数据中学习到内在的复杂联系
  • 输出层:输出层是将前两层处理后的结果输出。例如:在一个有五类的匪类系统中,输出层有五个神经元。

接着我们会通过例子来学习单独神经元的功能。

单个神经元如何工作

 在这一部分,我们会通过一个简单的例子来了解单个神经元的工作。通过这个例子能够对神经元是如何通过输入计算得到输出有一个下意识的认识。典型的神经元如下:

单个神经元

单个神经元的组成部分为:
1. X1 ,X2,…,XN:输入到神经元的数据,可以是初始输入数据也可以是隐藏层输出的中间数据
2. X0:偏差值,作为一个常量引入用于调整结果。
3. W0 ,W1 ,W2 ,…, WN:指定每一个输入的权重。即使是偏差值也有权重
4. a:神经元的输出,计算公式为

神经元计算公式

这里的f称为活化函数,它使得神经网络非常灵活,并且赋予神经网络有能力去估计数据中复杂的非线性关系。它可以是高斯函数,逻辑函数,双曲函也可以是简单的线性函数。

接下来我们会使用神经网络实现OR,AND,NOT三个基本逻辑运算符来加深我们对神经网络的理解。你也可以把这个问题看作一个分类问题。

我们暂且把我们的问题抽象成下面的激活函数:

例子激活函数

例子1:AND

 我们可以把AND看作下面的神经元

AND神经元

对于这个神经元输出为

a=f(1.5+X1+X2)

结合激活函数我们可以得出真值表

真值表1

通过真值表我们可以看到AND运算符的功能已经实现了,a列的结果也就是’X1ANDX2’。这里我们的偏差值设为-1.5,但这个值并不是固定的,只要这个值使得当X1 ,X2为正数的时候,激活函数的结果为正,所以X0可以取在(-1,2)之间的任何值

例子2:OR

 同样的我们可以用下面的神经元实现OR:

OR神经元

该神经元的输出为

a=f(0.5+X1+X2)

真值表为

真值表2

同样a列为’X1 OR X2’的结果。通过上面两个例子看出我们只要修改偏差值的权重就能实现OR运算符,跟上面的AND的实现非常类似。同样偏差值取值就是,当X1X2中的其中一个为正,激活函数的结果为证的任何值。

例子3:NOT

 跟上两个例子类似,实现NOT的神经元为

NOT神经元

神经元的输出为

a=f(12X1)

真值表为

真值表3

同样的,权重和偏差值的选取只要满足NOT运算符的特性就可以了。通过这些例子,应该对神经网络中的神经元如何工作有了更深刻的理解了。

为什么经常用到多层网络

 通过上一部分我们已经了解了单个神经元是如何工作的,接下来我们会学习到一个多层神经网络是如何处理一些复杂关系的。为了更深入的了解,我们那XNOR运算符来举例子。先看一下XNOR运算符的真值表

真值表4

我们可以看到当输入的数据相同的时候,输出为1;而输入数据不一致的话则输出0。像这样的一种关系我们无法使用单个神经元来解决(不相信的话可以自己试一下)。所以我们会使用多层网络来解决。实现的原理是,一个复杂的关系可以分割成几个简单关系再结合。

接下来我们会分解XNOR运算符

A XNOR B = NOT(A XOR B)         = NOT[(A + B) . (A'+B')] (‘+’表示OR,‘.’表示AND)         = (A+B)'+(A'+B')         = (A'.B')+(A.B)

分解完之后我们就可以使用OR,AND,NOT三个简单的关系表示XNOR了。接着我们将会使用两种方法表示XNOR。

方法1:A XNOR B=(A’.B’)+(A.B)

 这里有一个难点就是设计一个神经元表示(A’.B’)的关系。涉及的结果如下图所示

a'.b'

该神经元的输出结果为:

a=f(0.5X1X2)

这个神经元的真值表如下:

真值表5

现在我们可以构建两个独立的神经元,然后将它们用多层网络结合起来。首先我们先来看一下这个网络的简略框架

简略框架

在第一层网络,我们将A’.B’和A.B进行判断。在第二层网络我们会获取第一层网络的输入燃火进行OR运算。这就是整个神经网络的运行流程,完整的网络如下图所示

完整的神经网络

可以注意到,其实也就是将我们之前不同的神经元组合到一起,不同的输入代表这不同的单元

  1. a1:表示A’B’
  2. a2:表示AB
  3. a3:表示a1 OR a2

X1 ,X2 ,a1 ,a2 ,a3所对应的真值表如下

真值表6

我想你已经对多层网络如何工作有了一定的认识,接下来会价绍另外一种方法。

方法2:A XNOR B=NOT [(A+B).(A’+B’)]

 在之前的例子中,我们单独计算A’.B’。如果我们想仅仅使用AND,OR,NOT这三个基本运算符呢。我们经过思考可以得到以下的框架

基本运算框架

在这里我们使用了三层隐藏层,工作的原理和之前的一样,神经网络的整体图如下

整体图

神经网络中各个符号表示如下:
1. a1:表示A
2. a2:表示A’
3. a3:表示B
4. a4:表示B’
5. a5:表示A+B
6. a6:表示A’+B’
7. a7:表示(A+B).(A’+B’)
8. a8:表示NOT[(A+B).(A’+B’)],也就是最终结果

典型的神经元的数据来源除了偏差值,其他都由另外一个圣经元提供。在这个例子中,我们在一层和二层之间去除了一些权重为0的连接。

真值表如下所示

真值表7

到此为止,我们成功的实现了XNOR运算符。可以看出方法二比方法一更加复杂,因此我们在实际中更加偏向于使用方法一。通过这两个方法展示了将复杂的关系分解为多层网络,我觉得现在多层网路的作用已经了然于心了。

神经网络的基本结构

 现在我们将会通过一个基础的例子来定义神经网络的基本结构。我们会看到输出就是输入按照一定的规则计算得到的。这也就是我们所说的正向传播。
一个基本的神经网络示意如下:

基本神经网络

这个示意图中的神经网络有L层,其中有一个输入层,一个输出层一级L-2个隐藏层。
示意图中的字幕表示如下
- L:神经网络的层数
- Ni:在第i层网络中神经元的个数,不包括偏差值
- a(j)i:指第i层网络中第j个神经元的输出

既然每一层的输出组成了下一层的输入,那么我们来定义一个规则来决定如何从第i层输出获得第i+1层的输入

第i+1层的输入如下

Ai=[a(0)ia(1)ia(Ni)i]

维度为Ni+1

第i层到第i+1层的权重矩阵

W(i)=W(i)01W(i)02W(i)0N1+1W(i)11W(i)12W(i)1N1+1W(i)Ni1W(i)Ni2W(i)NiN1+1

维度为Ni+1Ni+1

第i+1层的输出可以根据下面的式子计算:

Ai+1=f(i=0NAi.W(i))

对每一层使用这个式子计算,最终我们得出最后的输出。输出层的神经元数目将取决于待解决问题的类型,对于会跪问题可以有一个,对于二分问题可以有两个,对于多类分类问题则会有多个。

神经网络的终极目标是调整权重,使得模型的误差最小。权重的调整可以使用后面将会学习的后向反馈算法。

后向反馈

 后向反馈(BP)算法通过测定错误的结果然后反馈给网络来工作。为了降低错误的结果,各个神经元的权重都会的到调整。我们将会详细学习后向反馈算法的工作原理。

减少错误的第一步是测定每一个跟结果有关节点的梯度,但是在多层网络中,蹭凉节点的梯度并不是那么容易。

我们先来认识一下多层网络中梯度的概念,我们回顾一下神将网络的概念然后根据下图想象一个简单的系统

梯度概念

上图有三个输入,它们以下面的规则被处理

d=ab

e=dc=(ab)c

现在我们需要算出输出有关的a ,b ,c ,d的梯度。

计算梯度

然而,在计算a和b的梯度的时候我们需要使用链式法则

链式法则

梯度的计算就是将各层神经元的输出对于输入求梯度然后再相乘。如果还不明白可以多看几次式子。

但在实际的使用中并没有这么简单,接下来我们会看到另外一个例子。考虑一种情形单个神经元的输出同时作为下一层多个神经元的输入如下图所示:

特殊情形

在这个例子中,除了m的梯度之外,其他的梯度跟之前的一样。接下来我们会计算m的梯度,其它的梯度就留给读者自己证明:

m的梯度

通过上图我们可以看到m的梯度即使多条分支对于m的梯度的和。

在继续学习之前,我们先总结一下优化神经网络的具体步骤:

  1. 选择网络的结构,例如网络隐藏层的数量;每层网络神经元的数量和激活函数
  2. 随机初始化权重
  3. 使用前向传递决定输出界定
  4. 使用已知的数据发现错误的结果
  5. 把错误的结果后向反馈到网络让每一个节点测量错误
  6. 调整权重是的梯度最小

第一点到第三点我们之前已经深入的学习过,第五点也有了相当的认识。现在我们会深入学习第四点到第六点。我们将会使用到之前所说的神经网络的基本结构

发现错误

e(i)L=y(i)a(i)L|i=1,2,,NL

这里的y(i)是训练的结果

把错误后向反馈给网络

 第L-1层的错误可以使用下面的式子轻松确定:

L-1层错误

i=0,1,2…NL1(第L-1层网络节点的数目)

调整权重使得权重最小

 调整权重应该按照下面的规则

W(l)ik=W(l)ik+a(i).e(k)l+1

  • l=1 ,2 ,…,(L-1) 是指第几层
  • i=0 ,1 ,…,NL 是指第L层的第几个节点
  • k=1 ,2 ,…,Nl+1 是指第l+1层的第几个节点
  • W(l)ik 是指第l层到第l+1层之间第i个节点到第k个检点的权重

总结

 这篇文章着重与神经网络的基础和叙述神经网络如何工作。学习完这篇文章之后,对神经网络不再是纯粹当作黑盒调用。
当我们学习完神经网络的基础之后我们就可以使用神经网络进行实际上的应用例如图像处理和自然语言识别。

原创粉丝点击