神经网络中最基本的成分是神经元模型,在生物神经元中每个神经元与其他神经元相连,当他“兴奋”时就会向连接的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过一个“阈值”那么他就会被激活,即兴奋起来,向其他神经元发送化学物质。
1943年,【McCulloch and Pitts】将上述的情形抽象为如图所示的简单模型,这就是一直沿用至今的“M-P神经元模型”。在这个模型中,神经元接收来自n个其他神经元的输入信号,这些信号通过带权重的连接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”处理已产生的神经元的输出。
阈值的目的是:使通过激活函数后得到的非线性图像可以左右移动而增加解决问题的能力
理想中的激活函数是阶跃函数,他将输入值映射成为0或1,1对应神经元的兴奋。0对应神经元的抑制,然而阶跃函数具有不连续不光滑等不好的性质,因此常用Sigmoid函数作为激活函数,典型的Sigmoid函数如如所示,它把可能在较大范围内变化的输入值挤压到(0,1)输出值范围内,因此也常被称为挤压函数。
激活函数通常选择非线性的函数,非线性的函数比起线性的函数进行任意的线性组合,或者在复合一个线性函数,仍得到一个线性函数;而非线性的函数进行线性符合或者在复合非线性函数之后得到的就不再是一个线性函数,它将呈现一个更加回环曲折的图像。
激活函数的主要作用是:提供网络的非线性建模能力。
神经网络是复杂多元函数的拟合器。其主要面对的困难是既要能够在参数变化时候生成各种复杂的形状,又要相对的简单。它对于这对矛盾的解决方法是将自变量线性组合、复合非线性函数、再线性组合、再复合非线性函数,如此循环往复。这样一来,组成函数的两个部分:线性的组合与非线性的函数都是比较简单的,我们对它们都有足够的了解。而它们之间不断复合,又能产生出任意复杂的形状,满足我们对于表示能力的要求。这样一种构建神经网络的思想,对于系列文章中后几篇里要介绍的CNN、RNN等神经网络,这都是十分重要的。
常见的神经网络是如图所示的层级结构,每层神经元与下一层神经元完全互连,神经元之间不存在同层连接,也不存在跨层连接,这样的神经网络结构通常称为“多层前馈神经网络”,其中输入层神经元接受外界输出,隐含层与输出层神经元对信号进行加工,最终由输出层神经元输出;换而言之,输入层神经元仅是接受输入,不进行函数处理,隐含层与输出层包含功能神经元,因此下图也被称为两层神经网络。神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权”以及每个功能神经元的阈值;换而言之,神经网络“学”到的东西,蕴含在连接权和阈值中。
训练神经网络的过程就是在求解一个极值表达式,在这个表达式中,x是固定参数,而w(权重)和θ(阈值)是可变的自变量。在数学中有一门学科,叫做“优化”,就是专门研究如何求解极值的。
可能有人会感到不解:求极值,不就是让那个函数的所有偏导数等于0吗?(必要条件)不就是函数的海瑟矩阵是正定的吗?(充分条件)这么简单的原理,为什么还要专门发展出一套理论去研究呢?
要注意的是,数学上的定理追求的是理论的完美性。而在现实中,我们所关注的是可计算性。对于一个有确定表达式的函数,我们自然有其所有偏导数的表达式。神经网络也不例外。但是,要找出w和b,使得所有偏导数等于0,就相当于要求解一个大规模的方程组。对于比较简单的线性回归而言,这是一个线性方程组,可以用矩阵将极值直接表示出来。但对于神经网络而言,这是一个形式极其复杂的、大规模的非线性方程组。这是根本没有办法解出来的。
优化这门学科,采取的是一种与求解方程完全相反的套路。我们假定有一个f有关w、b的偏导数表达式g(w,θ)、h(w,θ)。要求g=0,h=0去求解w,b总是很困难的。可是知道w和θ去求解g和h总是相对简单的。也就是说,当我们身处这个函数的一点,我们可以知道其各个分量的偏导数。由于我们的函数形式是可微的,我们便也可以算出其所有的方向导数。这样一来,我们就可以找出其下降最快的方向(方向导数最大的方向),这被称作“最速下降方向”。
事实上,各种各样的优化方法都是一个如下的过程:选择一个初始点,求出该点的一些数据(例如各个偏导数),根据这些数据走到下一个点,再求出下一个点的一些数据,如此往复循环,直到达到某些停止准则为止。如何根据当前点所包含的局部数据,选择出下降的方向、步长,并且判断是否停止,各种各样的搭配有不同的性能,这就是优化这门学科所研究的主要内容。
BP算法的基本思想是梯度下降,利用梯度搜索技术,以期使神经网络的实际输出值和期望输出值得误差均方差最小。
BP算法是一种有监督式的学习算法,其主要思想是:输入学习样本,使用反向传播算法对网络的权值和偏差进行反复的调整训练,使输出的向量与期望向量尽可能地接近,当网络输出层的误差平方和小于指定的误差时训练完成,保存网络的权值和偏差。具体步骤如下:
(1)初始化,随机给定各连接权[w],[v]及阀值θi,rt。
(2)由给定的输入输出模式对计算隐层、输出层各单元输出
bj=f(■wijai-θj) ct=f(■vjtbj-rt)
式中:bj为隐层第j个神经元实际输出;ct为输出层第t个神经元的实际输出;wij为输入层至隐层的连接权;vjt为隐层至输出层的连接权。
dtk=(ytk-ct)ct(1-ct) ejk=[■dtvjt] bj(1-bj)
(3)选取下一个输入模式对返回第2步反复训练直到网络设输出误差达到要求结束训练。
传统的BP算法,实质上是把一组样本输入/输出问题转化为一个非线性优化问题,并通过负梯度下降算法,利用迭代运算求解权值问题的一种学习方法,但其收敛速度慢且容易陷入局部极小,为此提出了一种新的算法,即高斯消元法。
对于整个优化过程而言,这无疑是最重要的一步,但这也并不是优化过程的全部。我们找出下降最快的方向之后,还要确定我们向这个方向走的步长。
考虑一种最为简单的最速下降法:每一步沿着最速下降方向下降一个固定的步长,直到一共走了一个指定的步数(例如一万步)为止。公式如下(SD代表最速方向steepest descent,P为一个固定的步长)
这是一个最简单的算法,但是很难达到很好的性能。我们应该对其进行一些改动。
在每一步的优化中,我们保留了上一步的步长与方向,并且计算出了这一步的各个偏导。我们可以充分利用这些信息。例如有一种算法叫做“Momentum”(动量算法)。每一步除了沿着最速下降方向下降一个固定的步长之外,还要加一个“惯性项”,即上一步乘以一个衰减系数(0-1之间)。从总体来看,我们的优化算法就像具有了“动量”一般。这个算法总体来说比前一种最速下降法的效果要好。