刚接触神经网络不久,对这方面的知识掌握得还很浅,把自己的学习过程写下来也是理解、提高的过程,希望可以跟志同道合的人一起交流、进步。
我以后会写一些自己对机器学习的理解,欢迎一起交流讨论。
一、神经网络简介
1.1 前言
神经网络起源于上个世纪40年代,到现在已经有70年的历史。然而神经网络是最近重新火起来的,因为以前相关的理论模型、训练方法和计算能力的条件都还不成熟,随着06年多伦多大学的hinton在science上发表了论文,用神经网络来把高维的数据降维,并且降维后的数据也能重建出原来高维的数据,比PCA的效果还好,一下子又燃起了学术、工业研究者对神经网络的热情。hinton是为数不多的长期研究神经网络的人,除了他之外,还有纽约大学的lecun也一直在用神经网络应用到语音识别、机器视觉和自然语言处理中。hinton用的神经网络模型是第一层是输入层,第二层以上是隐含层,他是先用RBM训练出第一层与第二层的权重系数,即先训练出第二层对输入层的表示,然后训练第二层与第三层的权重系数,依次类推。训练好的权重系数作为BP算法的输入,学习autoencoder模型,这样能够更好地有效地训练神经网络,用RBM模型已经选取了比较好的权重(已经算是对输入的近似表示了,权重初值的选取是很重要的)。
神经网络也是受到人类大脑的学习系统的启发,大脑神经是有很多神经元连接在一起的异常复杂的网络,所以,神经网络(准确地说是人工神经网络,因为自40年代后,神经网络分化为两个研究方向,一个是专注于生物信息处理的过程,叫生物神经网络,而另一个是人工神经网络,专注于工程和应用)也是有一系列单元相互密集连接在一起的,但是这个神经网络跟人类大脑相比是非常简单的,其实我们现在还没真正搞清楚人类大脑的神经是如何学习的。神经网络的每个单元都是由一定数量的输入(可以是实数值或二值)产生的,表示对这些输入的一个响应度。
近些年基于神经网络的深度学习已经有很多研究成果,已经被应用到模式识别、预测(分类、回归等)、优化、控制和推荐系统、图像特征提取等等。神经网络可用于监督学习和无监督学习中。
1.2 简要历史
二、神经网络模型演变
2.1 McCulloch-Pitts模型
2.2 感知机
2.3 神经网络模型种类
三、 feed-forward网络模型
3.1 模型分析
考虑一个最简单的监督学习问题,我们有已标注的训练数据(x(i),y(i)),神经网络学习到一种复杂的、非线性的假设hW,b(x),其中w和b都是要学习的参数。
神经元把输入x1,x2,x3还有截距1作为输入,通过计算单元h来计算出,
这个函数f是激活函数(activation function),可以是sigmoid函数或tanh函数,b是偏置项。
sigmoid函数表达式是,tanh函数表达式为
它们的函数f(z)与z的关系如下图所示:
Wx是对输入x的线性组合,经过sigmoid函数作用后变为对输入x的非线性表达,其实这个就是逻辑斯蒂回归模型用到的函数。对于sigmoi函数,计算出的f(W'x)是在(0,1)范围内的实数,在很多问题中是用二值的,就是以f(Wx)的概率把输出置为1,以1-f(Wx)的概率置为0,这样输出单元也具有一定的随机性,如果Wx大的话,置为1的概率也大。
如果把多个简单的神经元组合在一起,形成一个复杂的神经网络模型。
第一层就是输入层,第二层是隐含层,第三层是输出层。当然可以有很多的隐含层,这样的模型很复杂,可能学习到的表示更抽象。
这时各层的输入计算公式为:
网络模型参数是(W,b) = (W(1),b(1),W(2),b(2)), a是响应值,f是激活函数,参数的上标表示属于第几层的参数。
上面的式子用向量化的形式表示为:
这个步骤叫做前向传播(forward propogation),每层要用到前面一层已经计算好的数据。这个过程表示在给定的各层之间的权重系数后,从输入层经过隐含层到最后输出层的运算。
更通用的形式如下:
z是第二层开始的每个层由前面一层的输入单元的线性组合计算出的值;a是每一层的激活值,第一层的a就是输入的训练数据。
3.2 Backpropagation(后向传播算法)
第一步是前向传播,算出各层的输出值;第二步是算出最后一层的残差,即对最后一层的z(线性组合值)求导的结果;第三步是从后向前算出各层节点的残差,求每一层的参差时,我们要用到后面一层的残差,比如算倒数第二层(nl - 1)层的节点i的残差时,由于它对后面一层(nl)的所有节点对产生了影响,因为后面一层的所有节点的z值其中一项是i节点的a值乘于相应的权重得到,所以对i节点的z值求导时,所以我们看到表达式括号里有累加的形式;第四步是算出各层参数的梯度,即相应残差乘于激活值,因为是w*a的算出z的。具体的推导细节请参考反向传导算法。一个简单的BP实例参考BP算法浅谈。
如果采用矩阵向量的形式,算法可写成:
梯度下降的实现方法:
3.3 梯度检验
我们在BP算法中推导出了W和b的梯度,但是要用程序正确实现出来还是不容易的,如果我们程序写错了会得不到正确的结果,而且也浪费了很多时间,这里有个技巧就是用梯度的定义算出梯度来跟推导的梯度比较,如果一样就证明写的求导程序没错!
在高数中我们学过导数的定义是,
所以对任意theta值,我们用这个公式算梯度
EPSILON是个很小的值,但不能太小,太小会导致误差,设为1e-4合适。注意这里的theta是个向量(把W和b凑起来),所以求出来的导数的维数也是跟theta维数一样的,在用数值方法算theta的导数时,我们要求出每一维的导数。求某一维导数时,其它维应保持不变。
四、参考文献
转载请注明出处,http://blog.csdn.net/freeliao/article/details/17564819