神经网络是由具有适应性的简单单元组成的广泛并互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。
0.简单介绍
在机器学习和认知科学领域,人工神经网络(artificial neural network,缩写ANN),简称神经网络(neural network,缩写NN),是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具。典型的神经网络具有以下三个部分:
①结构 (Architecture):结构指定了网络中的变量和它们的拓扑关系。例如,神经网络中的变量可以是神经元连接的权重(weights)和神经元的激励值(activities of the neurons)。
②激励函数(Activity Rule):大部分神经网络模型具有一个短时间尺度的动力学规则,来定义神经元如何根据其他神经元的活动来改变自己的激励值。一般激励函数依赖于网络中的权重(即该网络的参数)。
③学习规则(Learning Rule):学习规则指定了网络中的权重如何随着时间推进而调整。这一般被看做是一种长时间尺度的动力学规则。一般情况下,学习规则依赖于神经元的激励值。它也可能依赖于监督者提供的目标值和当前权重的值。
1.神经元模型
神经网络中最基本的成分就是神经元模型,即上述的“简单单元”。下面介绍一下“M-P神经元模型”,如下图:
在这个模型中,神经元接收到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”处理以产生神经元的输出。
说到激活函数,下面我将介绍三种激活函数:
①阶跃函数:它将输入值映射为输出值“0”或“1”,显然“1”对于神经元兴奋,“0”对应于神经元抑制。然而阶跃函数具有不连续、不光滑等不太好的性质,因此出现了sigmoid函数。
s g n ( x ) = { 1 , x ≥ 0 0 , x < 0 sgn \left( x \right)=\left\{ \begin{matrix} 1,x\ge 0 \\ 0,x<0 \\ \end{matrix} \right. sgn(x)={1,x≥00,x<0
②sigmoid函数:它把可能在较大范围内变化的输入值挤压到(0,1)输出值范围内,因
此有时也被称为“挤压函数”。然而sigmoid函数具有计算量大,反向传播求误差梯度时,求导涉及除法,并且反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练,因此出现了RELU函数。
s i g m o i d ( x ) = 1 1 + e − x sigmoid\left( x \right)=\frac{1}{1+{{e}^{-x}}} sigmoid(x)=1+e−x1
③RELU函数:输入信号 <0 时,输出都是0,>0 的情况下,输出等于输入。RELU的
随机梯度下降的收敛速度会比sigmoid快很多。
r e l u ( x ) = { x , x ≥ 0 0 , x < 0 relu\left( x \right)=\left\{ \begin{matrix} x,x\ge 0 \\ 0,x<0 \\ \end{matrix} \right. relu(x)={x,x≥00,x<0
2.感知机与多层网络
感知机由两层神经元组成,如下图:
输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”。需要注意的是,感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元,其学习能力非常有限,一般用于解决线性问题。
如果要解决非线性问题,需要考虑多层神经元,如下图:
输出层和输入层之间有一层神经元,被称为隐层或者隐含层,隐含层和输出层的都是拥有激活函数的功能神经元。感知机的学习规则非常贱但,对训练数据 ,若当前感知机的输出为 ,则感知机的权重这样调整
w i ← w i + △ w i ( 1 ) {{w}_{i}}\leftarrow {{w}_{i}}+\vartriangle {{w}_{i}}(1) wi←wi+△wi(1)
△ w i = η ( y − y ^ ) x i \vartriangle {{w}_{i}}=\eta \left( y-\widehat{y} \right){{x}_{i}} △wi=η(y−y )xi
更一般的,常见的神经网络是下图所示的层级结构:
每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接。这样的神经网络结构称为“多层前馈神经网络”。其中输入层神经元接受外界输入,隐层与输出层神经元对信号进行加工,最终结果由输出层神经元输出;换言之,输入层神经元仅是接收输入,不进行函数处理,隐层与输出层包含功能神经元。因此通常被称为“两层网络”。神经网络的学习过程就是根据训练数据来调整神经元之间的连接权以及每个功能神经元的阈值;换言之,神经网络学到的东西,蕴含在连接权与阈值中。
3.误差逆传播算法(反向传播算法或BP算法)
多层网络的学习能力比单层感知机强得多,欲训练多层网络,简单感知机学习规则显然不够,需要更强大的学习算法。BP算法就是最杰出的代表。显示任务中使用神经网络时,大多是在使用BP算法进行训练。值得指出的是,BP算法不仅可用于多层前馈神经网络,还可用于其他类型的神经网络(例如递归神经网络)。
给定训练集 。即输入示例由d个属性描述,输出l维实值向量。为便于讨论给出下图:
对训练实例 ( x k , y k ) \left( {{x}_{k}},{{y}_{k}} \right) (xk,yk),假定神经网络的输出为 y ^ k = ( y ^ 1 k , y ^ 2 k , . . . , y ^ l k ) {{\widehat{y}}_{k}}=\left( \widehat{y}_{1}^{k},\widehat{y}_{2}^{k},...,\widehat{y}_{l}^{k} \right) y k=(y 1k,y 2k,...,y lk),即
y ^ 1 k = f ( β j − θ j ) ( 2 ) \widehat{y}_{1}^{k}=f\left( {{\beta }_{j}}-{{\theta }_{j}} \right)(2) y 1k=f(βj−θj)(2)
则网络在 ( x k , y k ) \left( {{x}_{k}},{{y}_{k}} \right) (xk,yk)上的均方差为
E k = 1 2 ∑ j = 1 l ( y ^ j k − y j k ) 2 ( 3 ) {{E}_{k}}=\frac{1}{2}{{\sum\limits_{j=1}^{l}{\left( \widehat{y}_{j}^{k}-y_{j}^{k} \right)}}^{2}}(3) Ek=21j=1∑l(y jk−yjk)2(3)
BP是一个迭代式学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计,即与式子(1)类似,任意参数 的更新估计式为
v i ← v i + △ v i {{v}_{i}}\leftarrow {{v}_{i}}+\vartriangle {{v}_{i}} vi←vi+△vi
BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,对式子(3)的误差 E k {{E}_{k}} Ek给定学习率 η \eta η,有
△ w h j = − η ∂ E k ∂ w h j ( 4 ) \vartriangle {{w}_{hj}}=-\eta \frac{\partial {{E}_{k}}}{\partial {{w}_{hj}}}(4) △whj=−η∂whj∂Ek(4)
注意到 w h j {{w}_{hj}} whj先影响到第 j j j个输出层神经元的输入值 β j {{\beta }_{j}} βj,再影响到其输出值 y ^ j k \widehat{y}_{j}^{k} y jk,然后影响到 E k {{E}_{k}} Ek,有
∂ E k ∂ w h j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ⋅ ∂ β j ∂ w h j ( 5 ) \frac{\partial {{E}_{k}}}{\partial {{w}_{hj}}}=\frac{\partial {{E}_{k}}}{\partial \widehat{y}_{j}^{k}}\cdot \frac{\partial \widehat{y}_{j}^{k}}{\partial {{\beta }_{j}}}\cdot \frac{\partial {{\beta }_{j}}}{\partial {{w}_{hj}}}(5) ∂whj∂Ek=∂y jk∂Ek⋅∂βj∂y jk⋅∂whj∂βj(5)
根据 β j {{\beta }_{j}} βj的定义,显然有
∂ β j ∂ w h j = b h \frac{\partial {{\beta }_{j}}}{\partial {{w}_{hj}}}={{b}_{h}} ∂whj∂βj=bh
Sigmoid函数有一个很好的性质
f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) {{f}^{'}}\left( x \right)=f\left( x \right)\left( 1-f\left( x \right) \right) f′(x)=f(x)(1−f(x))
于是根据(2)和(3)式,有
g j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j = − ( y ^ j k − y j k ) f ′ ( β j − θ j ) = y ^ j k ( 1 − y ^ j k ) ( y j k − y ^ j k ) ( 6 ) {{g}_{j}}=\frac{\partial {{E}_{k}}}{\partial \widehat{y}_{j}^{k}}\cdot \frac{\partial \widehat{y}_{j}^{k}}{\partial {{\beta }_{j}}}=-\left( \widehat{y}_{j}^{k}-y_{j}^{k} \right){{f}^{'}}\left( {{\beta }_{j}}-{{\theta }_{j}} \right)=\widehat{y}_{j}^{k}\left( 1-\widehat{y}_{j}^{k} \right)\left( y_{j}^{k}-\widehat{y}_{j}^{k} \right)(6) gj=∂y jk∂Ek⋅∂βj∂y jk=−(y jk−yjk)f′(βj−θj)=y jk(1−y jk)(yjk−y jk)(6)
将(6)式代入(5)式,再代入(4)式,就得到了BP算法中关于 的更新公式
△ w h j = − η g i b h ( 7 ) \vartriangle {{w}_{hj}}=-\eta {{g}_{i}}{{b}_{h}}(7) △whj=−ηgibh(7)
类似可得
△ θ j = − η g j ( 8 ) \vartriangle {{\theta }_{j}}=-\eta {{g}_{j}}(8) △θj=−ηgj(8)
△ v i h = η e h x i ( 9 ) \vartriangle {{v}_{ih}}=\eta {{e}_{h}}{{x}_{i}}(9) △vih=ηehxi(9)
△ γ h = − η e h ( 10 ) \vartriangle {{\gamma }_{h}}=-\eta {{e}_{h}}(10) △γh=−ηeh(10)
e h = − ∂ E k ∂ b h ⋅ ∂ b h ∂ α h = − ∑ j = 1 l ∂ E k ∂ β j ⋅ ∂ β j ∂ b h f ′ ( α h − γ h ) = ∑ j = 1 l w h j g i f ′ ( α h − γ h ) = b h ( 1 − b h ) ∑ j = 1 l w h j g i {{e}_{h}}=-\frac{\partial {{E}_{k}}}{\partial {{b}_{h}}}\cdot \frac{\partial {{b}_{h}}}{\partial {{\alpha }_{h}}}=-\sum\limits_{j=1}^{l}{\frac{\partial {{E}_{k}}}{\partial {{\beta }_{j}}}\cdot \frac{\partial {{\beta }_{j}}}{\partial {{b}_{h}}}}{{f}^{'}}\left( {{\alpha }_{h}}-{{\gamma }_{h}} \right)=\sum\limits_{j=1}^{l}{{{w}_{hj}}{{g}_{i}}{{f}^{'}}\left( {{\alpha }_{h}}-{{\gamma }_{h}} \right)}={{b}_{h}}\left( 1-{{b}_{h}} \right)\sum\limits_{j=1}^{l}{{{w}_{hj}}{{g}_{i}}} eh=−∂bh∂Ek⋅∂αh∂bh=−j=1∑l∂βj∂Ek⋅∂bh∂βjf′(αh−γh)=j=1∑lwhjgif′(αh−γh)=bh(1−bh)j=1∑lwhjgi
学习率 η ∈ ( 0 , 1 ) \eta \in \left( 0,1 \right) η∈(0,1)控制着算法每一轮迭代中的更新步长,若太大则容易振荡,太小收敛速度又会过慢。有时为了做精细调节,可令式(7)与(8)使用 η 1 {{\eta }_{1}} η1,式(9)与(10)使用 η 2 {{\eta }_{2}} η2,两者未必相等。
需要注意的是,BP算法的目标是要最小化训练集 D D D上的累计误差
E = 1 m ∑ k = 1 m E k E=\frac{1}{m}\sum\limits_{k=1}^{m}{{{E}_{k}}} E=m1k=1∑mEk
我们上面讨论的是标准BP算法,每次仅针对一个训练样例更新连接权和阈值,也就是说更新规则是基于单个的 E k {{E}_{k}} Ek推导而得。如果类似地推导出基于累计误差最小化的更新原则,就得到了累计误差逆传播算法。一般来说,标准BP算法每次更新只针对于单个样例,参数更新得非常频繁,而且对不同样例进行更新的效果可能出现“抵消”现象。因此为了达到同样的累计误差极小点,标准BP算法往往需要进行更多次数的迭代。累积BP算法直接针对累积误差最小化,它在读取整个训练集 D D D一遍后才对参数进行更新,七参数更新的频率低得多。但在很多任务中,累积误差下降到一定程度后,进一步下降会非常慢,这时标准BP往往会更快获得较好的解,尤其是在训练集 D D D非常大时更明显。
BP神经网络由于其强大的表示能力,经常遭遇过拟合。训练误差低,测试误差高。两种策略进行解决:①早停:将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。②正则化:基本思想就是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。
E = λ 1 m ∑ k = 1 m E k + ( 1 − λ ) ∑ i w i 2 E=\lambda \frac{1}{m}\sum\limits_{k=1}^{m}{{{E}_{k}}}+\left( 1-\lambda \right)\sum\limits_{i}{w_{i}^{2}} E=λm1k=1∑mEk+(1−λ)i∑wi2
其中 λ ∈ ( 0 , 1 ) \lambda \in \left( 0,1 \right) λ∈(0,1)用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。
4全局最小与局部最小
局部极小值是参数空间中的某个点,其邻域点的误差函数值均不小于该点函数值;全局最小解则是参数空间中的所有点的误差函数值均不小于该点的误差函数值。参数空间梯度为0的点,只要其误差函数值小于邻点的误差函数值,就是局部极小值点;可能存在多个局部极小值,但却只会有一个全局最小值。也就是说全局最小一定是局部最小,反之则不成立。
基于梯度的搜索是使用最为广泛的参数寻优方法。由于负梯度方向是函数值下降最快的方向,因此梯度下降法就是沿着负梯度方向搜索最优解。若误差函数在当前点的梯度为0,则已经达到局部最小,更新量将为0,这意味着参数的迭代更新将在此停止。显然,如果误差函数仅有一个局部极小,那么此时找到的局部极小就是全局最小;然而,如果误差函数有多个局部极小,则不能保证找到的解是全局最小。对后一种情形,我们称之为参数寻优陷入局部极小。下面介绍几种跳出局部极小的策略:
①以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数。多个不同的初始点会陷入不同的局部极小,选择其中最小的局部极小,这样就更接近于全局最小。
②模拟退火:每一步以一定的概率接受比当前解更差的结果,从而有助于跳出局部极小。在每一步迭代过程中,接受次优解的概率要随着时间的推移逐渐降低,从而保证算法的稳定。
③随机梯度下降:每次只随机选择一个样本来更新模型参数,因此每次的学习是非常快速的,并且可以进行在线更新。最大的缺点在于每次更新可能并不会按照正确的方向进行,因此可以带来优化波动(扰动)。不过从另一个方面来看,随机梯度下降所带来的波动有个好处就是,对于类似盆地区域(即很多局部极小值点)那么这个波动的特点可能会使得优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样便可能对于非凸函数,最终收敛于一个较好的局部极值点,甚至全局极值点。由于波动,因此会使得迭代次数(学习次数)增多,即收敛速度变慢。
参考文章:
周志华《机器学习》
https://blog.csdn.net/a819825294/article/details/53393837