原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080
一、 由Multi-layer Feedforward Neural Network到Back Propagation
1.1 多层前馈神经网络
在文章ANN人工神经网络(Artificial Neuron Network )已经介绍了从B-P神经元模型到多层感知机模型。其中的多层感知机模型,又叫多层神经网络,是多层前馈神经网络(Multi-layer Feedforward Neural Network:MLFNN)中的一种。
多层神经网络的拓扑结构如下图所示:
在神经网络中,输入层与输出层之间的层称为隐含层或隐层(hidden layer),隐层和输出层的神经元都是具有激活函数的功能神经元。 只需包含一个隐层便可以称为多层神经网络,常用的神经网络称为“多层前馈神经网络”(multi-layer feedforward neural network)( 这里的层实际上是隐含层的个数),该结构满足以下几个特点:
-
每层神经元与下一层神经元之间完全互连
-
神经元之间不存在同层连接
-
神经元之间不存在跨层连接
注意:根据上面的特点可以得知:这里的“前馈”指的是网络拓扑结构中不存在环或回路,而不是指该网络只能向前传播而不能向后传播
1.2 逆向误差神经网络
这样,BP(Back Propagation)网络,实际上,也是是多层感知器的一种,是1986年由Rumelhart和Hinton为首的科学家小组提出,相比于多层感知机,BP网络除了具有前馈神经网络的是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛、最成功的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)。
BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。
举个例子:我要追求女神,那我总得表示一下吧!于是我给她买花,讨她欢心。然后,她给我一些表示(或者叫暗示),根据这个表示,与我最终目的进行对比(追求到女神),然后我进行调整继续表示,一直循环往复,知道实现最终目的——成功最求到女神。我的表示就是“信号前向传播”,女神的表示就是“误差反向传播”。这就是BP神经网络的核心。
3层BP神经网络
具体来说,对于如下的只含一个隐层的神经网络模型:BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。
3层BP神经网络
神经网络利用现有的数据找出输入与输出之间得权值关系(近似),然后利用这样的权值关系进行仿真,例如输入一组数据仿真出输出结果,当然你的输入要和训练时采用的数据集在一个范畴之内。例如预报天气:温度 湿度 气压等作为输入 天气情况作为输出利用历史得输入输出关系训练出神经网络,然后利用这样的神经网络输入今天的温度 湿度 气压等 得出即将得天气情况。同理,运用到自动化测试中,使用测试数据反映结果走向,bug数,质量问题等情况也可以做到提前预测的!
二、 BP神经网络算法详解
2.1 BP网络使用的激活函数Sigmoid
BP网络采用的传递函数是非线性变换函数——Sigmoid函数(又称S函数)。其特点是函数本身及其导数都是连续的,因而在处理上十分方便。为什么要选择这个函数,等下在介绍BP网络的学习算法的时候会进行进一步的介绍。S函数有单极性S型函数和双极性S型函数两种,单极性S型函数定义如下:
f
(
x
)
=
1
1
+
e
−
x
f(x)=\cfrac{1}{1+e^{-x}}
f(x)=1+e−x1其函数曲线如图所示:
单极性S曲线
双极性S型函数:
f
(
x
)
=
1
−
e
−
x
1
+
e
−
x
f(x)=\cfrac{1-e^{-x}}{1+e^{-x}}
f(x)=1+e−x1−e−x
双极性S曲线
使用S型激活函数时,输入:net =
x
1
ω
1
x_1\omega_1
x1ω1+
x
2
ω
2
x_2\omega_2
x2ω2+
x
3
ω
3
x_3\omega_3
x3ω3+…+
x
n
ω
n
x_n\omega_n
xnωn
输出为:y = f(net) =
1
1
+
e
−
n
e
t
\cfrac{1}{1+e^{-net}}
1+e−net1
输出的导数:
f
’
(
n
e
t
)
f^’(net)
f’(net) =
1
1
+
e
−
n
e
t
\cfrac{1}{1+e^{-net}}
1+e−net1 -
1
(
1
+
e
−
n
e
t
)
2
\cfrac{1}{(1+{e^{-net})}^2}
(1+e−net)21 = y(y-1)
使用S型激活函数时,BP网络的输出及其导数图形:
根据S激活函数的图形:
- net在 -5~0 的时候导数的值为正,且导数的值逐渐增大,说明此时f(x)在逐渐变大且变大的速度越来越快
- net在 0~5 的时候导数的值为正,且导数的值逐渐减小,说明此时f(x)在逐渐变大但是变大的速度越来越慢
- 对神经网络进行训练,我们应该尽量将net的值尽量控制在收敛比较快的范围内。
2.2 BP算法如何进行误差反馈
2.2.1 三层 BP 神经网络
反向传播算法,即Back Propagation是建立在梯度下降算法基础上,适用多层神经网络的参数训练方法。由于隐藏层节点的预测误差无法直接计算,因此,反向传播算法直接利用输出层节点的预测误差反向估计上一层隐藏节点的预测误差,即从后往前逐层从输出层把误差反向传播到输入层,从而实现对链接权重调整,这也是反向传播算法名称的由来。
BP (Back Propagation)神经网络,即误差反传误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成。
-
输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元;
-
中间层是内部信息处理层,负责信息变换,根据信息变化能力的需求,中间层可以设计为单隐层或者多隐层结构;其中隐藏层的节点个数经验公式为:S = 1 + [ m ∗ ( n + 2 ) ] 0.5 {1 + [m*(n+2)]}^{0.5} 1+[m∗(n+2)]0.5 其中S为隐藏层的节点个数,m为输入节点数,n为输出 节点数。
-
最后一个隐层传递到输出层各神经元的信息,经进一步处理后,完成一次学习的正向传播处理过程,由输出层向外界输出信息处理结果。
-
当实际输出与期望输出不符时,进入误差的反向传播阶段。误差通过输出层,按误差梯度下降的方式修正各层权值,向隐层、输入层逐层反传。周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。
一个典型的3层BP神经网络模型如下图所示:
三层BP神经网络示意图
如上图所示的三层神经网络中,W=(W1,W2,…,Wj,…,Wl),其中列向量Wj=(Wj1,Wj2,…,Wjm)表示输出层神经元j与隐藏层神经元k的连接权重。
对于神经网络输出层有:
O k O_k Ok = f( n e t k net_k netk) (1)
n e t k net_k netk = ∑ j = 0 m ω f k y k \sum_{j=0}^m\omega_{fk} y_{k} ∑j=0mωfkyk,k=1,2,…,l (2)
对于神经网络隐藏层有:
y j y_j yj = f( n e t j net_j netj),j = 1,2,…,m (3)
n e t j net_j netj = ∑ r = 0 n ν r f χ r \sum_{r=0}^n\nu_{rf} \chi_{r} ∑r=0nνrfχr,k=1,2,…,l (4)
在上面的两个式子中的激活函数(或转移函数)根据应用需要可以均为Sigmoid函数,或者均为双极S形函数。以上式(1)~( 4 )以及激活函数共同构成了三层前馈网的数学模型。
2.2.2 网络误差与权值调整
当神经网络的输出与期望的输出差距较大或者不在接受范围内时,即存在输出误差,其定义如下:
E = 1 2 \cfrac{1}{2} 21. ( d − O ) 2 (d-O)^2 (d−O)2 = 1 2 \cfrac{1}{2} 21. ∑ k = 1 l ( d k − O k ) 2 \sum_{k=1}^l(d_k-O_k)^2 ∑k=1l(dk−Ok)2 (5)
为什么要乘以
1
2
\cfrac{1}{2}
21的原因是,E求导后系数会为1。 将上面的误差定义表达式展开,带入隐藏层数据有:
E = 1 2 \cfrac{1}{2} 21. ∑ k = 1 l [ d k − f ( n e t k ) ] 2 \sum_{k=1}^l[d_k-f(net_k)]^2 ∑k=1l[dk−f(netk)]2 (6)
表达式展开到输入层,则有:
E = 1 2 \cfrac{1}{2} 21. ∑ k = 1 l ( d k − f [ ∑ r = 0 m w r k f ( n e t r ) ] ) 2 \sum_{k=1}^l({d_k-f[\sum_{r=0}^m w_{rk}f(net_r)]})^2 ∑k=1l(dk−f[∑r=0mwrkf(netr)])2
= 1 2 \cfrac{1}{2} 21. ∑ k = 1 l ( d k − f [ ∑ r = 0 m w r k f ( ∑ r = 0 n ν r f χ r ) ] ) 2 \sum_{k=1}^l({d_k-f[\sum_{r=0}^m w_{rk}f(\sum_{r=0}^n\nu_{rf} \chi_{r} )]})^2 ∑k=1l(dk−f[∑r=0mwrkf(∑r=0nνrfχr)])2 (7)
根据上式可以看出,神经网络输出的误差E是关于各层权值的函数,因此可以通过调整各层的权值来改变误差E的大小。显然,进行权值调整的目的是不断减少误差E的大小,使其符合具体的要求。因此,要求权值的调整量与误差的负梯度成正比,即:
Δ \Delta Δ ω j k \omega_{jk} ωjk = - η ∂ E ∂ ω j k \eta\frac{\partial E}{\partial \omega_{jk}} η∂ωjk∂E,j = 0,1,2,…,m;k = 1,2,…,l (8.a)
Δ \Delta Δ ν r f \nu_{rf} νrf = - η ∂ E ∂ ν r f \eta\frac{\partial E}{\partial \nu_{rf}} η∂νrf∂E,r = 0,1,2,…,n;j = 1,2,…,m (8.b)
上式中,负号表示梯度下降,比例系数用常数表示,它就是神经网络训练中的学习速率。
2.2.3 BP算法推导
式(8)给出的是权值调整思路的数学表达,而并非神经网络权值调整的具体计算公式,下面经给出三层BP神经网络权值的具体计算公式。
对于BP神经网络输出层,式(8.a)可以写为:
Δ
\Delta
Δ
ω
j
k
\omega_{jk}
ωjk = -
η
∂
E
∂
ω
j
k
\eta\frac{\partial E}{\partial \omega_{jk}}
η∂ωjk∂E= -
η
∂
E
∂
n
e
t
k
∂
n
e
t
k
∂
ω
j
k
\eta\frac{\partial E}{\partial net_{k}}\frac{\partial net_{k}}{\partial \omega_{jk}}
η∂netk∂E∂ωjk∂netk (9.a)
式(8.b)可以写为:
Δ \Delta Δ ν r f \nu_{rf} νrf = - η ∂ E ∂ n e t j ∂ n e t j ∂ ν r f \eta\frac{\partial E}{\partial net_{j}}\frac{\partial net_{j}}{\partial \nu_{rf}} η∂netj∂E∂νrf∂netj (9.b)
定义输出层和隐藏层信号分别为:
δ k 0 \delta_k^0 δk0 = - η ∂ E ∂ n e t k \eta\frac{\partial E}{\partial net_{k}} η∂netk∂E δ j y \delta_j^y δjy = - η ∂ E ∂ n e t j \eta\frac{\partial E}{\partial net_{j}} η∂netj∂E (10)
由(9.a)和(2)得:
Δ \Delta Δ ω j k \omega_{jk} ωjk = η δ k 0 y j \eta \delta_k^0 y_j ηδk0yj (11.a)
由(9.b)和(4)得:
Δ \Delta Δ ν r f \nu_{rf} νrf = η δ j y x r \eta \delta_j^y x_r ηδjyxr (11.b)
通过(11.a) 和(11.b)可以看出要完成神经网络权值调整计算的推到,只需要计算出式(10)中的误差信号,下面继续求导。对于输出层的进行展开:
对于输出层进行展开:
δ k 0 \delta_k^0 δk0 = - η ∂ E ∂ n e t k \eta\frac{\partial E}{\partial net_{k}} η∂netk∂E= - η ∂ E ∂ O k ∂ O k ∂ n e t k \eta\frac{\partial E}{\partial O_{k}}\frac{\partial O_{k}}{\partial net_{k}} η∂Ok∂E∂netk∂Ok = - η ∂ E ∂ O k f ′ ( n e t k ) \eta\frac{\partial E}{\partial O_{k}} f^{'}(net_k) η∂Ok∂Ef′(netk) (12.a)
对隐藏层进行展开:
δ j y \delta_j^y δjy = - η ∂ E ∂ n e t j \eta\frac{\partial E}{\partial net_{j}} η∂netj∂E=- η ∂ E ∂ y j ∂ y j ∂ n e t j \eta \frac{\partial E}{\partial y_{j}} \frac{\partial y_{j}}{\partial net_{j}} η∂yj∂E∂netj∂yj = - η ∂ E ∂ y j f ′ ( n e t j ) \eta\frac{\partial E}{\partial y_{j}} f^{'}(net_j) η∂yj∂Ef′(netj) (12.b)
接着求式子(12)网络误差对各层输出的偏导。
对输出层,利用式子(5)可得:
∂ E ∂ O k \frac{\partial E}{\partial O_{k}} ∂Ok∂E = - ( d k − O k ) (d_k - O_k) (dk−Ok) (13.a)
对于隐藏层利用公式(6)可得:
∂ E ∂ y j \frac{\partial E}{\partial y_{j}} ∂yj∂E = - ∑ k = 1 l ( d k − O k ) f ′ ( n e t k ) W j k \sum_{k=1}^l(d_k-O_k)f^{'}(net_k)W_{jk} ∑k=1l(dk−Ok)f′(netk)Wjk (13.b)
将上面式子带入(12)中,并结合公式(4),得:
δ k 0 \delta_k^0 δk0 = ( d k − O k ) O k ( 1 − O k ) (d_k-O_k)O_k(1-O_k) (dk−Ok)Ok(1−Ok) (14.a)
δ j y \delta_j^y δjy = [ ∑ k = 1 l ( d k − O k ) f ′ ( n e t k ) W j k ] f ′ ( n e t k ) [ \sum_{k=1}^l(d_k-O_k)f^{'}(net_k)W_{jk}]f^{'}(net_k) [∑k=1l(dk−Ok)f′(netk)Wjk]f′(netk)
= ( ∑ k = 1 l δ k 0 W j k ) y j ( 1 − y j ) (\sum_{k=1}^l \delta_k^0 W_{jk})y_j(1-y_j) (∑k=1lδk0Wjk)yj(1−yj) (14.b)
至此,关于两个误差信号的推导已经完成,将公式(14)带入到公式(11)得到神经网络权值调整计算公式为:
Δ \Delta Δ ω j k \omega_{jk} ωjk = η δ k 0 y j \eta \delta_k^0 y_j ηδk0yj& = η ( d k − O k ) O k ( 1 − O k ) y j \eta(d_k-O_k)O_k(1-O_k)y_j η(dk−Ok)Ok(1−Ok)yj
Δ v j k \Delta v_{jk} Δvjk = η δ j y x r \eta \delta_j^y x_r ηδjyxr = η ( ∑ k = 1 l δ k 0 W j k ) y j ( 1 − y j ) x r \eta(\sum_{k=1}^l \delta_k^0 W_{jk})y_j(1-y_j)x_r η(∑k=1lδk0Wjk)yj(1−yj)xr (15)
2.3 局部最优与全局最优
要成为局部极小点,只要满足该点在参数空间中的梯度为零。局部极小可以有多个,而全局最小只有一个。全局最小一定是局部极小,但局部最小却不一定是全局最小。显然在很多机器学习算法中,都试图找到目标函数的全局最小。梯度下降法的主要思想就是沿着负梯度方向去搜索最优解,负梯度方向是函数值下降最快的方向,若迭代到某处的梯度为0,则表示达到一个局部最小,参数更新停止。因此在现实任务中,通常使用以下策略尽可能地去接近全局最小。
- 局部极小解:参数空间中的某个点,其邻域点的误差函数值均不小于该点的误差函数值。
- 全局最小解:参数空间中的某个点,所有其他点的误差函数值均不小于该点的误差函数值。
跳出局部最小的方法:
- 以多组不同参数值初始化多个神经网络,按标准方法训练,迭代停止后,取其中误差最小的解作为最终参数。
- 使用“模拟退火”技术
- 使用随机梯度下降,即在计算梯度时加入了随机因素,使得在局部最小时,计算的梯度仍可能不为0,从而迭代可以继续进行。
三、总结:
神经网络可以用作分类、聚类、预测等。神经网络需要有一定量的历史数据,通过历史数据的训练,网络可以学习到数据中隐含的知识。在你的问题中,首先要找到某些问题的一-些特征,以及对应的评价数据,用这些数据来训练神经网络。
虽然BP网络得到了广泛的应用,但自身也存在一- 些缺陷和不足,主要包括以下三个方面的问题。
-
首先,由于学习速率是固定的,因此网络的收敛速度慢,需要较长的训练时间。对于一-些复杂问题,BP算法需要的训练时间可能非常长,这主要是由于学习速率太小造成的,可采用变化的学习速率或自适应的学习速率加以改进。
-
其次,BP算法可以使权值收敛到某个值,但并不保证其为误差平面的全局最小值,这是因为采用梯度下降法可能产生-一个局部最小值。对于这个问题,可以采用附加动量法来解决。
-
再次,网络隐含层的层数和单元数的选择尚无理论上的指导,-般是根据经验或者通过反复实验确定。因此,网络往往存在很大的冗余性,在一定程度上也增加了网络学习的负担。
-
最后,网络的学习和记忆具有不稳定性。也就是说,如果增加了学习样本,训练好的网络就需要从头开始训练,对于以前的权值和阈值是没有记忆的。但是可以将预测、分类或聚类做的比较好的权值保存。
(1)BP神经网络训练。该过程主要利用原始数据集进行BP神经网络的训练,最终形成特定的具有预测功能的神经网络,训练完成后将神经网络保存为net;
该算法的具体流程(训练)如下:
(2)利用BP神经网络进行预测。该过程只需要将先前训练好的神经网络载入即可,然后同样对数据进行归一化等操作处理后,即可运行BP神经网络算法,产生一组概率向量。.
影响BP神经网络性能的参数主要有:隐含层节点的个数、激活函数的选择以及学习率的选择等。隐层神经元的个数越少,BP神经网络模拟的效果越差,隐层神经元个数越多模拟的效果越好,然而会使得训练较慢。激活函数对于识别率和收敛速度都有显著的影响,在逼近高次曲线时,S形函数精度比线性函数要高得多,但另一方面计算量也要大得多。学习率直接影响网络的收敛速度,以及网络是否能够收敛。学习率设置偏低虽然能够保证网络收敛,但是收敛速度会很慢,反之如果学习率设置偏高,可能直接导致网络无法收敛,进而降低识别率。
这篇文章就到这里了,欢迎大佬们多批评指正,也欢迎大家积极评论多多交流。
参考文章:
1 深入理解BP神经网络
2 机器学习——前馈神经网络
3 论文:链接:https://pan.baidu.com/s/1cmn_6GWGvQzBcsNamHA8kQ 提取码:vlix