新手理解
- 一.导论
- 1.1 ANN的概念
- 官方语言:
- 狐仙语言:
- 1.2 ANN的基本特征
- 1.3 ANN的基本功能
- 1.4 ANN的结构
- 1.4.1 生物神经网络
- 1.4.2 人工神经网络
- 二.神经网络类别
- 2.1 单层神经网络(感知器)
- 2.2 两层神经网络(多层感知器)
- 2.3 多层神经网络(深度学习)
- 三.神经网络模型
- 3.1 前馈神经网络
- 3.2 反馈神经网络
- 3.3 两者区别
- 四.结语
- 4.1 神经网络的发展历程
- 4.2 效果
- 4.3 快速发展的原因
一.导论
1.1 ANN的概念
官方语言:
人工神经网络( Artificial Neuron Network ),又简称为神经网络,是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激活函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重(weight),神经网络就是通过这种方式来模拟人类的记忆。网络的输出则取决于网络的结构、网络的连接方式、权重和激活函数。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。
狐仙语言:
如果是第一次听到人工神经网络这个名词,不免会觉得比较高大上,好像我们已经可以模仿神秘的神经系统了。其实它只是一个数学模型而已。当然ANN的效果是令人眼前一亮的,好像计算机一下子真的有了人的能力,可以识人、识物。
但其实稍加抽象便能发现,这个东西无非就是个分类器,它的输入是一张图片,或者确切的说就是一堆代表像素点的数值,而输出则是一个类别。
所以说白了,所谓的人工神经网络其实就是一个超大规模的函数。
这就好比飞机和鸟儿的关系。让飞机飞起来靠的不是依葫芦画瓢造一个人工鸟,而是靠流体力学中的原理建立数学模型,然后计算得出飞机的尺寸、造型,并设计相应的发动机。
1.2 ANN的基本特征
结构特点:
1.信息处理的并行性:单个单元处理简单,可以大规模并行处理,有较快的涑度;
2.信息存储的分布性:信息不是存储在网络中的局部,而是分布在网络所有的连接权中;
3.信息处理单元的互联性:处理单元之间互联,呈现出丰富的功能;
4.结构的可塑性:连接方式多样,结构可塑。
性能特点:
1.高度的非线性:多个单元链接,体现出非线性;
2.良好的容错性:分布式存储的结构特点使容错性好;
3.计算的非精确性:当输入模糊信息时,通过处理连续的模拟信号及不精确的信息逼近解而非精确解。
能力特征:
自学习、自组织与自适应性:根据外部环境变化通过训练或感知,能调节参数适应变化(自学习),并可按输入刺激调整构建神经网络(自组织)
1.3 ANN的基本功能
1.4 ANN的结构
1.4.1 生物神经网络
了解一个陌生的东西最好的学习方法就是利用已知的知识来解决。人工神经网络乍一听好像很高深,但是我们通过类比高中所学的生物神经网络,可以对其进行一个简单的了解。
人工神经网络(ANN)是由试图去模仿生物神经系统而激发的。如下图所示,人的大脑主要由神经元(neuron)组成,神经元通过轴突(axon)连接在一起。当神经元收到刺激时,神经脉冲(nerve impulses)通过轴突由一个神经元传递到另一个神经元。一个神经元通过树突(dendtrite)连接到其他神经元的轴突,树突是神经元细胞体的延伸物。树突和一个轴突的连接点叫做突触(synapse)。人的大脑通过在同一个脉冲反复刺激下改变神经元之间的突触连接强度来进行学习。神经网络由很多简单的,相互交互的节点构成。信息通过这些节点间的连接的强度来表达,通过在学习过程中调整这些连接来获得。
这样可以概况的说明生物神经网络的假定特点:
1.每个神经元都是一个多输入单输出的信息处理单元;
2.神经元输入分兴奋性输入和抑制性输入两种类型;
3.神经元具有空间整合特性和阈值特性;
4.神经元输入与输出间有固定的时滞,主要取决于突触延搁
1.4.2 人工神经网络
上图⽹络中最左边的称为输⼊层,其中的神经元称为输⼊神经元。最右边的称为输出层,其中的神经元称为输出神经元,中间层既不是输⼊也不是输出,被称为隐藏层。
说明:
1.通常一个神经网络由一个input layer,多个hidden layer和一个output layer构成。
2.图中圆圈可以视为一个神经元(又可以称为感知器)
3.设计神经网络的重要工作是设计hidden layer,及神经元之间的权重
4.添加少量隐层获得浅层神经网络SNN;隐层很多时就是深层神经网络DNN
二.神经网络类别
本文并不是讲的是“神经网络”的内容,而是其中的一个子类,也是目前最常说的前馈神经网络,先来看下面一个图:
神经网络其实是一个非常宽泛的称呼,它包括两类,一类是用计算机的方式去模拟人脑,这就是我们常说的ANN(人工神经网络),另一类是研究生物学上的神经网络,又叫生物神经网络。对于我们计算机人士而言,肯定是研究前者。
在人工神经网络之中,又分为前馈神经网络和反馈神经网络这两种。那么它们两者的区别是什么呢?这个其实在于它们的结构图。我们可以把结构图看作是一个有向图。其中神经元代表顶点,连接代表有向边。对于前馈神经网络中,这个有向图是没有回路的。你可以仔细观察本文中出现的所有神经网络的结构图,确认一下。而对于反馈神经网络中,结构图的有向图是有回路的。反馈神经网络也是一类重要的神经网络。其中Hopfield网络就是反馈神经网络。深度学习中的RNN也属于一种反馈神经网络。
具体到前馈神经网络中,就有了本文中所分别描述的三个网络:单层神经网络,双层神经网络,以及多层神经网络。深度学习中的CNN属于一种特殊的多层神经网络。另外,在一些Blog中和文献中看到的BP神经网络是什么?其实它们就是使用了反向传播BP算法的两层前馈神经网络。也是最普遍的一种两层神经网络。
神经元模型的使用可以这样理解:
我们有一个数据,称之为样本。样本有四个属性,其中三个属性已知,一个属性未知。我们需要做的就是通过三个已知属性预测未知属性。
具体办法就是使用神经元的公式进行计算。三个已知属性的值是,,,未知属性的值是z。z可以通过公式计算出来。
这里,已知的属性称之为特征,未知的属性称之为目标。假设特征与目标之间确实是线性关系,并且我们已经得到表示这个关系的权值,,。那么,我们就可以通过神经元模型预测新样本的目标。
2.1 单层神经网络(感知器)
结构:
下面来说明感知器模型。
在原来模型的“输入”位置添加神经元节点,标志其为“输入单元”。
在“感知器”中,有两个层次。分别是输入层和输出层。输入层里的“输入单元”只负责传输数据,不做计算。输出层里的“输出单元”则需要对前面一层的输入进行计算。
我们把需要计算的层次称之为“计算层”,并把拥有一个计算层的网络称之为“单层神经网络”。有一些文献会按照网络拥有的层数来命名,例如把“感知器”称为两层神经网络。但在本文里,我们根据计算层的数量来命名。
假如我们要预测的目标不再是一个值,而是一个向量,例如[2,3]。那么可以在输出层再增加一个“输出单元”。下图显示了带有两个输出单元的单层神经网络,其中输出单元的计算公式如下图。
可以看到,的计算公式跟原先的z并没有区别。我们已知一个神经元的输出可以向多个神经元传递,因此的计算公式如下图。
可以看到,的计算中除了三个新的权值:,,以外,其他与是一样的。
整个网络的输出如下图。
,,是后来加的,很难表现出跟原先的,,的关系。
因此我们改用二维的下标,用来表达一个权值。下标中的x代表后一层神经元的序号,而y代表前一层神经元的序号(序号的顺序从上到下)。
例如,代表后一层的第1个神经元与前一层的第2个神经元的连接的权值(这种标记方式参照了Andrew Ng的课件)。根据以上方法标记,我们有了下图。
如果我们仔细看输出的计算公式,会发现这两个公式就是线性代数方程组。因此可以用矩阵乘法来表达这两个公式。
例如,输入的变量是(代表由,,组成的列向量),用向量a来表示。方程的左边是,用向量z来表示。系数则是矩阵W(2行3列的矩阵,排列形式与公式中的一样)。于是,输出公式可以改写成:
;
下面是我手工解释:
这个公式就是神经网络中从前一层计算后一层的矩阵运算。
效果:
与神经元模型不同,感知器中的权值是通过训练得到的。因此,根据以前的知识我们知道,感知器类似一个逻辑回归模型,可以做线性分类任务。
我们可以用决策分界来形象的表达分类的效果。决策分界就是在二维的数据平面中划出一条直线,当数据的维度是3维的时候,就是划出一个平面,当数据的维度是n维时,就是划出一个n-1维的超平面。
下图显示了在二维平面中划出决策分界的效果,也就是感知器的分类效果。
2.2 两层神经网络(多层感知器)
结构:
两层神经网络除了包含一个输入层,一个输出层以外,还增加了一个中间层。此时,中间层和输出层都是计算层。
现在,我们的权值矩阵增加到了两个,我们用上标来区分不同层次之间的变量。
例如代表第y层的第x个节点。,变成了,。下图给出了,的计算公式。
计算最终输出z的方式是利用了中间层的,和第二个权值矩阵计算得到的,如下图:
我们使用向量和矩阵来表示层次中的变量。,,z是网络中传输的向量数据。和是网络的矩阵参数。如下图:
使用矩阵运算来表达整个计算公式的话如下:
;
;
由此可见,使用矩阵运算来表达是很简洁的,而且也不会受到节点数增多的影响(无论有多少节点参与运算,乘法两端都只有一个变量)。因此神经网络的教程中大量使用矩阵运算来描述。
需要说明的是,至今为止,我们对神经网络的结构图的讨论中都没有提到偏置节点(bias unit)。事实上,这些节点是默认存在的。它本质上是一个只含有存储功能,且存储值永远为1的单元。在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。正如线性回归模型与逻辑回归模型中的一样。
偏置单元与后一层的所有节点都有连接,我们设这些参数值为向量b,称之为偏置。如下图:
可以看出,偏置节点很好认,因为其没有输入(前一层中没有箭头指向它)。有些神经网络的结构图中会把偏置节点明显画出来,有些不会。一般情况下,我们都不会明确画出偏置节点。
在考虑了偏置以后的一个神经网络的矩阵运算如下:
;
在两层神经网络中,我们不再使用sgn函数作为函数g,而是使用平滑函数sigmoid作为函数g。我们把函数g也称作激活函数(active function)。
事实上,神经网络的本质就是通过参数与激活函数来拟合特征与目标之间的真实函数关系。初学者可能认为画神经网络的结构图是为了在程序中实现这些圆圈与线,但在一个神经网络的程序中,既没有“线”这个对象,也没有“单元”这个对象。实现一个神经网络最需要的是线性代数库。
效果:
理论证明,两层神经网络可以无限逼近任意连续函数。
也就是说,面对复杂的非线性分类任务,两层(带一个隐藏层)神经网络可以分类的很好。
单层网络只能做线性分类任务。而两层神经网络中的后一层也是线性分类层,应该只能做线性分类任务。为什么两个线性分类任务结合就可以做非线性分类任务?
从输入层到隐藏层时,数据发生了空间变换。也就是说,两层神经网络中,隐藏层对原始的数据进行了一个空间变换,使其可以被线性分类,然后输出层的决策分界划出了一个线性分类分界线,对其进行分类。
这样就导出了两层神经网络可以做非线性分类的关键–隐藏层。联想到我们一开始推导出的矩阵公式,我们知道,矩阵和向量相乘,本质上就是对向量的坐标空间进行一个变换。因此,隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。两层神经网络通过两层的线性模型模拟了数据内真实的非线性函数。因此,多层的神经网络的本质就是复杂函数拟合。
下面来讨论一下隐藏层的节点数设计。在设计一个神经网络时,输入层的节点数需要与特征的维度匹配,输出层的节点数要与目标的维度匹配。而中间层的节点数,却是由设计者指定的。因此,“自由”把握在设计者的手中。但是,节点数设置的多少,却会影响到整个模型的效果。如何决定这个自由层的节点数呢?目前业界没有完善的理论来指导这个决策。一般是根据经验来设置。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。这种方法又叫做Grid Search(网格搜索)。
了解了两层神经网络的结构以后,我们就可以看懂其它类似的结构图。例如EasyPR字符识别网络架构(下图):
EasyPR使用了字符的图像去进行字符文字的识别。输入是120维的向量。输出是要预测的文字类别,共有65类。根据实验,我们测试了一些隐藏层数目,发现当值为40时,整个网络在测试集上的效果较好,因此选择网络的最终结构就是120,40,65。
训练:
下面简单介绍一下两层神经网络的训练。
机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。
具体做法是这样的。首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。样本的预测目标为,真实目标为。那么,定义一个值loss,计算公式如下:
loss=
这个值称之为损失(loss),我们的目标就是使对所有训练数据的损失和尽可能的小。
如果将先前的神经网络预测的矩阵公式带入到中(因为有z=),那么我们可以把损失写为关于参数(parameter)的函数,这个函数称之为损失函数(loss function)。下面的问题就是求:如何优化参数,能够让损失函数的值最小。
此时这个问题就被转化为一个优化问题。一个常用方法就是高等数学中的求导,但是这里的问题由于参数不止一个,求导后计算导数等于0的运算量很大,所以一般来说解决这个优化问题使用的是梯度下降算法。梯度下降算法每次计算参数在当前的梯度,然后让参数向着梯度的反方向前进一段距离,不断重复,直到梯度接近零时截止。一般这个时候,所有的参数恰好达到使损失函数达到一个最低值的状态。
在神经网络模型中,由于结构复杂,每次计算梯度的代价很大。因此还需要使用反向传播算法。反向传播算法是利用了神经网络的结构进行的计算。不一次计算所有参数的梯度,而是从后往前。首先计算输出层的梯度,然后是第二个参数矩阵的梯度,接着是中间层的梯度,再然后是第一个参数矩阵的梯度,最后是输入层的梯度。计算结束以后,所要的两个参数矩阵的梯度就都有了。
反向传播算法可以直观的理解为下图。梯度的计算从后往前,一层层反向传播。前缀E代表着相对导数的意思。
反向传播算法的启示是数学中的链式法则。在此需要说明的是,尽管早期神经网络的研究人员努力从生物学中得到启发,但从BP算法开始,研究者们更多地从数学上寻求问题的最优解。不再盲目模拟人脑网络是神经网络研究走向成熟的标志。正如科学家们可以从鸟类的飞行中得到启发,但没有必要一定要完全模拟鸟类的飞行方式,也能制造可以起飞的飞机。
优化问题只是训练中的一个部分。机器学习问题之所以称为学习问题,而不是优化问题,就是因为它不仅要求数据在训练集上求得一个较小的误差,在测试集上也要表现好。因为模型最终是要部署到没有见过训练数据的真实场景。提升模型在测试集上的预测效果的主题叫做泛化(generalization),相关方法被称作正则化(regularization)。神经网络中常用的泛化技术有权重衰减等。
2.3 多层神经网络(深度学习)
CNN(Conventional Neural Network,卷积神经网络)与RNN(Recurrent Neural Network,循环神经网络)都属于多层神经网络的范畴。详细讲解可以看我发的链接 CNN链接 下面我们只讨论普通的多层神经网络。
结构:
我们延续两层神经网络的方式来设计一个多层神经网络。
在两层神经网络的输出层后面,继续添加层次。原来的输出层变成中间层,新加的层次成为新的输出层。所以可以得到下图:
依照这样的方式不断添加,我们可以得到更多层的多层神经网络。公式推导的话其实跟两层神经网络类似,使用矩阵运算的话就仅仅是加一个公式而已。
在已知输入的情况下,输出z的推导公式如下:
多层神经网络中,输出也是按照一层一层的方式来计算。从最外面的层开始,算出所有单元的值以后,再继续计算更深一层。只有当前层所有单元的值都计算完毕以后,才会算下一层。有点像计算向前不断推进的感觉。所以这个过程叫做“正向传播”。
下面讨论一下多层神经网络中的参数。
首先我们看第一张图,可以看出中有6个参数,中有4个参数,中有6个参数,所以整个神经网络中的参数有16个(这里我们不考虑偏置节点,下同)。
假设我们将中间层的节点数做一下调整。第一个中间层改为3个单元,第二个中间层改为4个单元。
经过调整以后,整个网络的参数变成了33个。
虽然层数保持不变,但是第二个神经网络的参数数量却是第一个神经网络的接近两倍之多,从而带来了更好的表示(represention)能力。表示能力是多层神经网络的一个重要性质,下面会做介绍。
在参数一致的情况下,我们也可以获得一个“更深”的网络。
上图的网络中,虽然参数数量仍然是33,但却有4个中间层,是原来层数的接近两倍。这意味着一样的参数数量,可以用更深的层次去表达。
效果:
与两层层神经网络不同。多层神经网络中的层数增加了很多。
增加更多的层次有什么好处?更深入的表示特征,以及更强的函数模拟能力。
更深入的表示特征可以这样理解,随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如第一个隐藏层学习到的是“边缘”的特征,第二个隐藏层学习到的是由“边缘”组成的“形状”的特征,第三个隐藏层学习到的是由“形状”组成的“图案”的特征,最后的隐藏层学习到的是由“图案”组成的“目标”的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。
更强的函数模拟能力是由于随着层数的增加,整个网络的参数就越多。而神经网络其实本质就是模拟特征与目标之间的真实关系函数的方法,更多的参数意味着其模拟的函数可以更加的复杂,可以有更多的容量(capcity)去拟合真正的关系。
通过研究发现,在参数数量一样的情况下,更深的网络往往具有比浅层的网络更好的识别效率。
训练:
在单层神经网络时,我们使用的激活函数是sgn函数。到了两层神经网络时,我们使用的最多的是sigmoid函数。而到了多层神经网络时,通过一系列的研究发现,ReLU函数在训练多层神经网络时,更容易收敛,并且预测性能更好。因此,目前在深度学习中,最流行的非线性函数是ReLU函数。ReLU函数不是传统的非线性函数,而是分段线性函数。其表达式非常简单,就是y=max(x,0)。简而言之,在x大于0,输出就是输入,而在x小于0时,输出就保持为0。这种函数的设计启发来自于生物神经元对于激励的线性响应,以及当低于某个阈值后就不再响应的模拟。
在多层神经网络中,训练的主题仍然是优化和泛化。当使用足够强的计算芯片(例如GPU图形加速卡)时,梯度下降算法以及反向传播算法在多层神经网络中的训练中仍然工作的很好。目前学术界主要的研究既在于开发新的算法,也在于对这两个算法进行不断的优化,例如,增加了一种带动量因子(momentum)的梯度下降算法。
在深度学习中,泛化技术变的比以往更加的重要。这主要是因为神经网络的层数增加了,参数也增加了,表示能力大幅度增强,很容易出现过拟合现象。因此正则化技术就显得十分重要。目前,Dropout技术,以及数据扩容(Data-Augmentation)技术是目前使用的最多的正则化技术。
三.神经网络模型
按照信息流向划分可分为前馈性网络和反馈性网络
前馈型网络:网络信息从输入层到隐藏层再到输出层逐层前进。
反馈型网络:反馈网络中所有节点都具有信息处理功能,并且每个节点既可以接收输入同时又可以进行输出。(类似生物学中的反馈调节)
下面这个图可以使大家更好理解:
3.1 前馈神经网络
前馈神经网络(Feed Forward NN)是一种最简单的神经网络,采用单向多层结构,各神经元分层排列,每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层,各层间没有反馈。
前馈网络包括三类节点:
输入节点(lnput Nodes):外界信息输入,不进行任何计算,仅向下一层节点传递信息;
隐藏节点(Hidden Nodes):接收上一层节点的输入,进行计算,并将信息传到下一层节点;
输出节点(OutputNodes):接收上一层节点的输入,进行计算,并将结果输出;
输入层和输出层必须有,隐藏层可以没有,即为单层感知器,隐藏层也可以不止一层,有隐藏层的前馈网络即多层感知器。
3.2 反馈神经网络
反馈神经网络(Feed Back NN):又称递归网络、回归网络,是一种将输出经过一步时移再接入到输入层的神经网络系统。这类网络中,神经元可以互连,有些神经元的输出会被反馈至同层甚至前层的神经元。常见的有HopfieId神经网络、Elman神经网络、Boltzmann机等。
3.3 两者区别
1.前馈神经网络各层神经元之间无连接,神经元只接受上层传来的数据,处理后传入下一层,数据正向流动;反馈神经网络层间神经元有连接,数据可以在同层间流动或反馈至前层。
2.前馈神经网络不考虑输出与输入在时间上的滞后效应,只表达输出与输入的映射关系;反馈神经网络考虑输出与输入之间在时间上的延迟,需要用动态方程来描述系统的模型。
3.前馈神经网络的学习主要采用误差修正法(如BP算法),计算过程一般比较慢,收敛速度也比较慢;反馈神经网络主要采用Hebb学习规则,一般情况下计算的收敛速度很快。
相比前馈神经网络,反馈神经网络更适合应用在联想记忆和优化计算等领域。
四.结语
4.1 神经网络的发展历程
4.2 效果
随着神经网络的发展,其表示性能越来越强。
从单层神经网络,到两层神经网络,再到多层神经网络,下图说明了,随着网络层数的增加,以及激活函数的调整,神经网络所能拟合的决策分界平面的能力。
可以看出,随着层数增加,其非线性分界拟合能力不断增强。图中的分界线并不代表真实训练出的效果,更多的是示意效果。
神经网络的研究与应用之所以能够不断地火热发展下去,与其强大的函数拟合能力是分不开关系的。
4.3 快速发展的原因
更强的计算性能,更多的数据,以及更好的训练方法。
只有满足这些条件时,神经网络的函数拟合能力才能得已体现。