神经网络 - 前馈神经网络概要简述
神经网络 - 前馈神经网络
人工神经网络是由大量处理单元互联组成的非线性、自适应信息处理系统。它是在现代神经科学研究成果的基础上提出的,试图通过模拟大脑神经网络处理、记忆信息的方式进行信息处理。神经网络是个非常大的科目。今天我们就介绍下最简单的模型前馈神经网络。
从神经元细胞说起
人的大脑拥有数以亿计的神经元细胞。他们彼此互相相连,来给大脑传递信息,帮助人类做出决策,分类事物,以及各种运算等。
神经元细胞的结构,由中间一个细胞体,一头长出许多的用来接收其他的神经元传递过来的信号的树突,以及另一头长出的一根长长的用来给别的神经元传递信号的轴突。轴突的末端又分叉处许多树杈,连接到其他的神经元的树突或者轴突上。
当大脑在运作思考的时候,神经元上的各个树突接收到其他的神经元发出的刺激脉冲,这些脉冲会持续的在神经元内叠加,一旦脉冲的强度达到一个临界数值以后,这个神经元就会产生动作电位,沿着轴突发送电信号,并且传递给别的神经元细胞。
而我们所说的神经网络中的最小的神经元单元也是以类似的方法工作。在了解神经网络之前我们先来了解下什么是感知机
感知机
感知机在上世纪50年代末和60年代初由科学家Frank Rosenblatt取得了进展,灵感来自早期又Warren McCulloch与沃尔特·皮兹的神经研究工作。先看下感知机是如何工作的:
感知机的模型非常类似我们大脑的神经元细胞,, , 为信号输入,为信号输出,中间的圆形表示神经细胞体。在上图,我们只表示了3个输入信号,也可以用更多的输入信号。
Rosenblatt提出了一个简单的规则来计算输出,他给每一个输入引入了一个权重(weight)。然后将他们累加求和,计算的方法为
这个非常像我们大脑的神经元细胞对来自其他神经元细胞的传递的刺激脉冲的累加。然后对于这个结果的,给予了一个阈值,阈值是一个实数,是神经元的一个参数。当大于这个阈值的时候,这个就输出1,小于这个阈值的时候,这个就输出0(可以参考**函数小节的函数图像)。公式表示为:
这个就是我们知道的**函数的最初形态,0表示抑制,1表示**。感知机的工作原理可以理解为,将输入信号,通过一系列的权值,加权求和以后,通过中间圆形的某个**函数得出的结果来跟某个阈值进行比较,来决定是否要继续输出。这种工作机制非常的类似我们的大脑的神经元细胞。
从上面我们可以看出,单个感知机的用做非常的小,就像我们大脑的神经元细胞一样,单个神经元细胞并不能完成我们日常生活的种种的任务,但是如果我们加入非常多的神经元细胞,并且将它们组成一个网络。它们就能完成很多高难度,复杂的事情。
从感知机的模型来看,单个感知机的功能非常的单一,但是它展示了每个感知单元是如何接收信号,并且,决定输出的过程。
但是如果我们将几千,几百,甚至上万个感知的模型,组成像我们的大脑的神经网络一样的网络模型,他就可以完成跟大脑一样,复杂的任务。这个就是我们所说的神经网络模型。
一个简单的四层神经网络模型
现实工作中我们所使用的神经网络模型,往往层次很深,很复杂。为了理解方便,我们从一个简单的四层神经网络来理解。能够更加容易的方便我们理解神经网络。
我们来看一个简单的四层网络模型:
在这个神经网络模型中我们有四层网络。
其中每个小圆圈代表一个感知机模型。
- 第一层称之为输入层,因为它直接跟输入数据相连。
- 第二和第三层称之为隐藏层
- 第四层为输出层。
第一层网络的各个神经元接收了输入信号,然后通过自身的神经体加权求和以后,输出给下一层神经元。第二层的神经网落的神经单元的输入来自前一层的神经网络的输出。以此类推。最后的经过中间的神经网络的计算以后,将结果输出到输出层。得出最后的结果。这里的输出层我们只让结果输出为一个结果,也可以输出多个结果。一般的分类用途的神经网络,最后会输出跟label相对应个数的输出维度。
在这里还有个地方没有说,就是**函数。下面我们来讲一下**函数
**函数
所谓**函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。
为什么要使用**函数
在说**函数之前,我们先要搞明白的一件事,为什么要使用**函数,不用有什么问题。在之前的感知机模型中,我们可以看到,神经元对待输入参数是以加权求和的方式来进行运算的。如果我们不使用**函数,那么我们输出的结果,应该是输入参数的线性叠加的结果。一个神经元的结果又作为下一层神经网络中神经元的输入参数,他也进行同样的操作,因此最后的整个网络的输出也是线性的。但是我们的生活中的实际问题往往是非线性的,因此,为了能够适应非线性的空间,我们在输出的结果之前,在最后的输出层加了个一个非线性的函数,我们称之为**函数,将网络的线性结果,映射到非线性的空间内。
**函数也像大脑的神经元细胞一包一样,会有**跟抑制。当输入**函数的值到达一定的区间内,**函数,会进行输出,否则,会抑制这些值的输出。这个概念比较抽象,下面我们举例一些常用的**函数,就可以看到,这些**函数在哪些部分是对输入进行了抑制,哪些部分进行了**。
常用的**函数
我们来看一下常用的**函数,以及他们的特点
Sigmoid
Sigmoid 是常用的非线性的**函数,它的数学形式如下
几何图形如下:
这个函数有如下特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1
但是这个函数也有如下的缺点:
- 梯度消失
- 不是以0值为中心
- 运算比较耗时,因为需要用到幂运算
tanh
函数解析式:
tanh函数及其导数的几何图像如下图:
与Sigmoid比较:
解决了输出不是0中心的问题,但是梯度消失跟幂运算还是存在
Relu
Relu函数的解析式
Relu函数及其导数的图像如下图所示:
Relu函数有如下几个优点:
- 解决了gradient vanishing问题 (在正区间)
- 计算速度非常快,只需要判断输入是否大于0
- 收敛速度远快于sigmoid和tanh
同时他的缺点是: - ReLU的输出不是zero-centered
- Dead ReLU Problem,指的是某些神经元可能永远不会被**,导致相应的参数永远不能被更新。
**函数是神经网络里一个比较大的主题,这里只是简单的介绍了下。在后续的专题中我们会在更加详细的介绍。
这里涉及到的梯度弥散的问题,我们会在下一次的反馈神经网络中给大家介绍。
总结
至此一个完整的简单的前馈神经网络就完成了。前馈神经网络是最简单的网络,因为他没有反馈,反馈是用来自我学习,也就是参数的自我修正,如果神经网络网络没有这个自我学习的过程。那么这个也就不能称之为人工智能。
预告
在下一次的篇幅里,我们来说一说,反馈神经网络,包含一下内容:
- 反向传播的细节和简单的推导
- loss函数的简单介绍
- 梯度爆炸跟弥散