一、简介
我们在设计机器学习系统时,特别希望能够建立类似人脑的一种机制。神经网络就是其中一种。但是考虑到实际情况,一般的神经网络(BP网络)不需要设计的那么复杂,不需要包含反馈和递归。
人工智能的一大重要应用,是分类问题。
思维学普遍认为,人类大脑的思维分为抽象(逻辑)思维、形象(直观)思维和灵感(顿悟)思维三种基本方式。
人工神经网络就是模拟人思维的第二种方式。这是一个非线性动力学系统,其特色在于信息的分布式存储和并行协同处理。虽然单个神经元的结构极其简单,功能有限,但大量神经元构成的网络系统所能实现的行为却是极其丰富多彩的。
神经网络的研究内容相当广泛,反映了多学科交叉技术领域的特点。主要的研究工作集中在以下几个方面:
(1)生物原型研究。从生理学、心理学、解剖学、脑科学、病理学等生物科学方面研究神经细胞、神经网络、神经系统的生物原型结构及其功能机理。
(2)建立理论模型。根据生物原型的研究,建立神经元、神经网络的理论模型。其中包括概念模型、知识模型、物理化学模型、数学模型等。
(3)网络模型与算法研究。在理论模型研究的基础上构作具体的神经网络模型,以实现计算机模拟或准备制作硬件,包括网络学习算法的研究。这方面的工作也称为技术模型研究。
(4)人工神经网络应用系统。在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能、构造专家系统、制成机器人等等。
神经网络算法现在应用非常广泛,这种算法是通过模拟人的大脑的运转方式运行的。
BP算法由信号的正向传播和误差的反向传播两个过程组成。
正向传播时,输入样本从输入层进入网络,经隐层逐层传递至输出层,如果输出层的实际输出与期望输出(导师信号)不同,则转至误差反向传播;如果输出层的实际输出与期望输出(导师信号)相同,结束学习算法。
反向传播时,将输出误差(期望输出与实际输出之差)按原通路反传计算,通过隐层反向,直至输入层,在反传过程中将误差分摊给各层的各个单元,获得各层各单元的误差信号,并将其作为修正各单元权值的根据。这一计算过程使用梯度下降法完成,在不停地调整各层神经元的权值和阈值后,使误差信号减小到最低限度。
权值和阈值不断调整的过程,就是网络的学习与训练过程,经过信号正向传播与误差反向传播,权值和阈值的调整反复进行,一直进行到预先设定的学习训练次数,或输出误差减小到允许的程度。
二、主要内容
Neural Networks Representation:
Non-linear hypothesis:
从图片中的式子可以看出来,如果要用梯度下降或者正规方程的方法来计算θ的值的话,计算量会非常大,就算只有100个特征,如果只用最高降为二次项的函数
![](https://i-blog.csdnimg.cn/blog_migrate/15936cff15adb56c56cfadd61074e28c.png)
判断一个东西是不是汽车,一种方法是从每辆汽车上面取两个像素点作为样本的特征,然后通过算法来训练分类器。假设每幅图片有50乘以50个像素,那么,每个样本有2500个像素点可以选择,如果是二次项组合特征,大约有300万个特征组合。显然,这样的分类问题特征非常大,所以我们选择神经网络算法来解决这类型的问题,这种算法对于复杂的假设空间和复杂的非线性问题有很好的学习能力。
Neurons and the brain:
神经网络产生的原因是:人们想尝试设计出模仿大脑的算法,从某种意义上讲,如果我们想要建立学习系统,我们模仿人类的大脑就能很好解决问题。神经网络算法逐渐兴起于二十世纪八九十年代,并且在那个时候使用很广泛,但是由于各种原因,在90年代的时候,它的使用减少了,其中一个原因是神经网络算法是一个计算量偏大的算法。但是最近,神经网络又东山再起了,因为现在计算机的运转速度变快了,能够运行大规模神经网络算法。而且,目前神经网络对许多应用来说是最先进的技术。
上图是大脑的一部分,红色的部分是听觉皮层,用来处理耳朵收集的声音信号并让大脑理解。当切断耳朵和听觉皮层的联系,并且连接眼睛和听觉皮层,这样从眼睛采集的信号不再传送到视神经而是听觉皮层,这样做得最终结果是听觉皮层将会学习“看”。
上图的红色区域是躯体感觉皮层,是我们用来处理触觉的,与听觉皮层实验相似,如果我们做相似的实验,那么躯体感觉皮层也将学会”看“。
上面两个实验以及其他一些类似的实验被称为神经重接实验。也就是说,如果人有一块脑组织可以处理光、声音或者触觉信号,那么也许存在一种算法,可以同时处理光、声音、触觉信号而不是需要运行上千个不同的程序,或者上千个不同的算法来做这些一个大脑所能做的成千上万件事情。我们需要做的就是找出一些近似的或者实际的大脑学习算法,然后实现它。当我们将传感器接到大脑的某一个部位的时候,大脑就会处理它。
上图是模拟大脑传感器的例子:用舌头去看、回声定位器、触觉皮带、给青蛙植入第三个眼睛等。
从某种意义上来讲,如果我们能找出大脑的学习算法,然后在计算机上面执行大脑学习算法或者与之相似的算法,也许这将是我们向人工智能迈进做出最好的尝试。
Model representation:
上图为大脑中的神经元结构,神经元又称神经细胞,一个神经细胞由一个细胞体,一根很长的轴突(输出神经,给其它神经元传递信号)和一些树突(输入神经,接收来自其他神经元的信息)组成。神经细胞体是一颗星状球形物,里面有一个细胞核。树突由细胞体向各个方向长出,本身可有分支,是用来接收信号 的。轴突也有许多的分支。神经元是一个计算单元,它从输入神经接收一定数目的信息,并做一些计算,然后将结果通过它的轴突传送到其他节点或者大脑的其他神经元。
神经细胞利用电-化学过程交换信号。神经元利用微弱的电流进行沟通,这些弱电流也称为动作电位,其实就是一些微弱的电流。所以如果神经元想要,传递一个消息,它就会通过它的轴突发送一段微弱的电流给其他的神经元。轴突连接到输入神经或者连接另一个神经元,接下来这个神经元接收这条消息,做一些计算,它有可能会反过来将在轴突上面的自己的信息传递给其他神经元,这就是人类思考的模型:我们的神经元把自己接收到的信息进行计算,并向其他神经元传递消息,这也是我们的感觉和肌肉运转的原理,如果你想活动一块肌肉,就会触发一个神经元,给你的肌肉发送脉冲并引起你的肌肉收缩,如果一些感官想要给大脑传递一个消息,那么它就会发送电脉冲给大脑。
上图是模拟大脑中的神经元结构建立的一个简单的模型,其中,黄色圆圈相当于神经元,指向它的箭头称为输入神经,用来传递信号,它指出的箭头成为输出神经,输出计算结果,上图表示对假设函数进行计算。x_1、x_2、x_3称为输入节点,x_0称为偏置单元或偏置神经元,但是我们默认x_0=1,所以,有时候我们不需要画出x_0,θ称为权重或者参数,h_θ称为激活函数,这里的激活函数是sigmoid函数。
一个小圈代表一个单一的神经元,神经网络就是这些不同的神经元组合在一起的集合。
第一层称为输入层,第二层称为隐藏层,因为我们一般看不到隐藏层的数值,所以称它为隐藏层,第三层称为输出层。输入层和隐藏层都存在一个偏置,但是这些偏置的值都为1,所以可以不用写出来。
其中,
如果神经网络在第j层有
![](https://i-blog.csdnimg.cn/blog_migrate/229a204978571b220cf25bee72683528.png)
可以看到,我们由第一层的值,经过第一层的权重处理,得到第二层的值;由第二层的值,经过第二层的权重处理,计算第三层的值,得到预测的输出,计算的方式一层一层往前走的,向前传播。 将计算向量化了,得出更新的公式为右下角的。
![](https://i-blog.csdnimg.cn/blog_migrate/b2b63f8fd9ccc5ac3f2ee4811810fec7.png)
将上图的x变量列遮住,写出假设函数,然后发现,函数的表达式和逻辑回归的一样了,这时没有隐藏层。
![](https://i-blog.csdnimg.cn/blog_migrate/22d00e32449ff19753994c7841b8825c.png)
第一层是输入层,第四层是输出层,中间有两层隐藏层。从输入层的激励开始向前,传播到第一层,然后传播到第二层,最终到达输出层。
Examples and intuitions:
同或:如果当两个逻辑变量x_1、x_2相同时,逻辑函数F等于1,否则F等于0。异或:当两个逻辑变量x_1、x_2相异时,逻辑函数F等于1,否则F等于0。
利用神经网络实现一个逻辑代数中的同或运算,上图左边表示x_1、x_2只能有0,1两种取值,将其对应到一个非线性分类器,如上右图。
假设函数用sigmoid函数表示,设
![](https://i-blog.csdnimg.cn/blog_migrate/11d8101b8e4adc4d3bba769c58dd42df.png)
改变参数的值:
![](https://i-blog.csdnimg.cn/blog_migrate/c235e851d32538c5644030f68625da2a.png)
上图模拟了NOT运算,其原理和之前的AND和OR运算一样。当且仅当
![](https://i-blog.csdnimg.cn/blog_migrate/dc3123a07fc8f73168685de8b744c6ad.png)
XOR运算如上,有一个输入层,一个隐藏层,还有添加的另外一个隐藏层,中间的第一个隐藏层中进行了一次AND和一次OR运算,传递给下一个隐藏层进行了一次OR运算,最后为输出XOR运算。
手写数字识别也是神经网络算法的一种,第一层计算出一些特征,然后下一层再计算出一些稍微复杂的特征,然后再传递计算出更加复杂的特征,然后这些特征最终传递给最后一层逻辑回归分类器上,使其能够准确地预测出神经网络算法输入的东西。
Multi-class classification:
输入一张图片,需要识别出图片里面的东西属于那一个类型,这就是一个对分类的问题了,用神经网络结构表示如上图。输出一个四维向量(有几个类别就是几维向量),当识别出来的是行人的时候,四维向量的第一个元素为1,其他元素为0;当识别出来的是汽车的时候,四维向量的第二个元素为1,其他元素为0;当识别出来的是摩托车的时候,四维向量的第三个元素为1,其他元素为0,以此类推。
当向量的某个元素为1,其他为0时,代表分类结果为1元素所对应的类别。这与之前逻辑回归中的多类分类表示不同,在逻辑回归中,输出y属于类似于{1, 2, 3,4}中的某个值,而不是一个向量。但是,如果要训练一个多类分类问题的神经网络模型,训练集是上图的Training set,这个时候y就表示和假设函数一样的一个向量了。
Cost function:
神经网络算法是当今最强大的算法之一
上图中,训练集是:
逻辑回归的代价函数如下:
![](https://i-blog.csdnimg.cn/blog_migrate/7b4e28d6eb2ecef827aac09d0cdab30e.png)
神经网络算法的代价函数为:
![](https://i-blog.csdnimg.cn/blog_migrate/68a5076220ae1c47617d2c9cf5587e50.png)
神经网络的输出层通常有多个输出,属于K维向量,所以用求和的方式表示。在对θ求和的时候,要除去对应于偏差至的项,也就是说我们不把对于i=0的项加进去。(即使加进去了也不会有太大的影响,只是不把偏差值正规化比较符合常理而已)。
![](https://i-blog.csdnimg.cn/blog_migrate/5e79ab02548705c2b9e2640b037466cc.png)
Backpropagation algorithm:
反向传导算法的细节:
将上式中的nl-1与nl的关系替换为l和 l+1的关系,就可以得到:
以上逐次从后向前求导的过程即为反向传导的本意所在。直观的理解公式就是第l层,第i个结点的残差等于第
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/accb036030cb9c2843c1caed4e0e7cd4.png)
在上一节中我们知道了神经网络算法中向量化的实现,对于一个给定训练样本(x, y)的神经网络,首先通过“前向传播”的方式从输入层开始计算神经网络的每一层表示,直到输出层。如该例子:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/f469054f44372defff035f9fbfc91d8a.png)
反向传播算法,简称BP算法,BP网络是从网络的训练方法上来说 的,是指该网络的训练算法是反向传播算法,即神经元的链接权重的训练是从最后一层(输出层)开始,然后反向依次更新前一层的链接权重。反向传播算法的核心是最小化网络输出值和目标值之间的“误差”,
上面的情况是用于训练样本集比较小的时候。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/52f03b92abe6ea5f322593bee382d7d9.png)
当训练样本比较大的时候,采用上图中的算法运算。
Backpropagation intuition:
对于一个训练样本
![](https://i-blog.csdnimg.cn/blog_migrate/3d13092fd4124d5abb6ce25a56ea51ba.png)
当我们仅关注一个样本
![](https://i-blog.csdnimg.cn/blog_migrate/1b670d8f96e9a880acb1fc1be37cb2da.png)
BP算法主要是从输出层反向计算各个节点的误差。用输出层的值再和权值结合起来可以求到隐藏层的值。
![](https://i-blog.csdnimg.cn/blog_migrate/1fbeb78353eddb40586615a4a1eda2c9.png)
上图为反向传播与前向传播的一些基本结构图。
Implementation note:Unrolling parameters:
function [jVal, gradient] = costFunction(theta)
optTheta = fminunc(@costFunction, initialTheta, options)
与linear regression和logistic regression不同,在神经网络中,参数非常多,每一层j有一个参数向量
![](https://i-blog.csdnimg.cn/blog_migrate/e70d13248c4588953cc81991e42f70c9.jpeg)
计算时,方法如下:
![](https://i-blog.csdnimg.cn/blog_migrate/48c70f4645b7926a4d5e8e7426021be8.jpeg)
Gradient check:
在反向传播的时候,会遇到很多细小的错误,而且这些细小的错误很难被发现。梯度检验可以解决基本所有的这种问题。
当θ是一个具体的数字的时候,对θ点求导约等于
![](https://i-blog.csdnimg.cn/blog_migrate/89fefb882b0d38ce3aaf4ea08bfd3aa4.png)
当θ是一个n维向量的时候,对每一个元素的求导公式如上图。
![](https://i-blog.csdnimg.cn/blog_migrate/5414d3a59f7715790c4c5011539ef035.png)
对代价函数求导的代码如上。
![](https://i-blog.csdnimg.cn/blog_migrate/f282b566b12d9c0a3d93ea77f56ef650.png)
在back propagation中计算出J(θ)对θ的导数D,并组成
用numerical gradient check方法计算大概的梯度
确保它们有近似的结果
停止check,只用BP来进行神经网络学习(否则会非常慢,相当慢)。
Random initialization:
如果将所有的参数都初始化为0,那么会出现在每次更新每一层的结果的时候,与输入单元相关的两个隐藏单元的结果将是相同的。所以我们就要用到随机变量初始化了。
输入层与隐藏层的结果一样初始化θ_ij^((l))即变量的权重取 [-ε,ε]区间内的随机数, ε可以很小,但是与梯度检验中的ε没有任何关系。
Putting it together:
输入层单元的个数为特征量的个数,输出层单元的个数为类别的个数。每个隐藏层的单元个数相同,一般来说,隐藏层的单元个数越多越好,但是,如果有大量隐藏单元,计算量将会很大。如果
![](https://i-blog.csdnimg.cn/blog_migrate/131c16a5aaf39d6bd2aba378c633e036.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d6f58e874a8226087dd615ac05960f3d.png)
首先,随机初始化一个权值,然后然后用向前传递的方式一层一层地由输入的x特征值得到假设函数的输出值,之后将代价函数代码写出来,然后用BP算法求出代价函数的偏导数。再然后通过梯度下降检查来比较代价函数的偏导数和用BP算法求出的估计值,确保他们得到基本相近的值,以致确保我们用BP算法得到的结果是正确的,但是我们需要去掉梯度下降检查的代码,因为梯度下降检查非常的慢。最后,我们可以用一个最优算法,将其与BP算法相结合,然后计算出偏导数的值。
在神经网络算法中,代价函数不是一个凸函数,所以很难找到全局的最小值,可以招待局域的最小值。
![](https://i-blog.csdnimg.cn/blog_migrate/4228f416445d28d5268848d7a3ce5ecc.png)
假设只有两个参数值,可以画出上图。这里的代价函数度量的就是这个神经网络对训练数据的拟合情况。梯度下降法就是:从某个随机的初始点开始,不断往下降,知道达到最小值的点。反向传播就是找到梯度下降的方向。
三、参考链接
https://baike.baidu.com/item/%E7%AA%81%E8%A7%A6%E4%BC%A0%E9%80%92/3901106?fr=aladdin
https://baike.baidu.com/item/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E7%AE%97%E6%B3%95/1252235?fr=aladdin
http://blog.csdn.net/lu597203933/article/details/46575803
http://blog.csdn.net/liugallup/article/details/50985594
http://blog.csdn.net/zhongkejingwang/article/details/44514073
http://www.cnblogs.com/buptzym/p/5437973.html