当前位置:   article > 正文

BP神经网络与反向传播算法_bp神经网络 反向

bp神经网络 反向

BP神经网络(Backpropagation Neural network),具有多层神经元,并且神经元的信号(输入输出)总是向前(由输入层指向输出层)传播,所以是多层向前网络。

BP神经网络的结构

在这里插入图片描述
设BP神经网络有m层。第一层是输入层,最后一层(第m层)是输出层,中间各层称为隐层。

除了输出层以外,每一层都可以加上一个偏置节点(又称偏置单元,如图标注“+1”的圆圈)。偏置单元没有输入(没有其他神经元指向它),它的输出总是1。(相当于把外部输入“+1”看作是某个神经元的输出)。
因为偏置节点与神经元存在差异,所以一般把神经元和偏执节点统称为节点

直觉上,偏置节点可以对下一层的神经元产生直接影响,而其他神经元因为经过了层层传递,对下一层的影响相对间接。

偏置单元并不是必需的,但它可以为每个隐藏层和输出层中的神经元提供一个可学习的常数偏移量,这个偏移量允许神经网络更好地拟合数据集并提高模型的表达能力。
并且偏置单元允许神经网络在输入为零时仍能有输出,在没有偏置单元的情况下,即使输入不为零,如果加权求和结果为零,那么神经元的输出也将为零(陷入得不到非零的有效输出,神经元无法激活的状况)。通过引入偏置项,即使输入为零,神经元也有可能激活,从而提高了网络的表达能力。

BP神经网络的输入输出关系

BP神经网络中,输入层作为数据的缓冲,不对数据做任何处理。也就是说,输入的数据直接作为输入层神经元的输出,则:
y i 1 = x i ( i = 1 , 2 , ⋯   , p 1 ) y_i^1=x_i\quad(i=1,2,\cdots,p_1)\\ yi1=xi(i=1,2,,p1)

隐层和输出层的神经元,需要把神经元的输入作为参数,传递给激活函数,得到的结果作为神经元的输出。实际需要解决的问题都有着复杂的非线性特征,所以激活函数都选择非线性函数

隐层 k k k与输出层各个神经元的非线性输入输出关系记为 f k ( k = 2 , ⋯   , m ) f_k(k=2,\cdots,m) fk(k=2,,m),由 k − 1 k-1 k1层的第 j j j个神经元到 k k k层的第 i i i个神经元的连接权值记为 w i j k w_{ij}^k wijk,第 k k k层中第 i i i个神经元的输入总和记为 u i k u_i^k uik,输出为 y i k y_i^k yik,则有:
y i k = f k ( u i k ) u i k = ∑ j w i j k y j k − 1 ( k = 2 , ⋯   , m ) y^k_i=f_k(u_i^k)\\ u_i^k=\sum_jw_{ij}^{k}y_j^{k-1}\quad(k=2,\cdots,m) yik=fk(uik)uik=jwijkyjk1(k=2,,m)
当从输入层输入数据 X = [ x 1 , x 2 , ⋯   , x p 1 ] T X=[x_1,x_2,\cdots,x_{p_1}]^T X=[x1,x2,,xp1]T(设第n层有 p n p_n pn个神经元,则输入层有 p 1 p_1 p1个神经元),得到输出层的输出为 Y = [ y 1 , y 2 , ⋯   , y p m ] T Y=[y_1,y_2,\cdots,y_{p_m}]^T Y=[y1,y2,,ypm]T(输出层有 p m p_m pm个神经元)。

计算机科学中,常用 [ x 1 , x 2 , ⋯   , x p 1 ] [x_1,x_2,\cdots,x_{p_1}] [x1,x2,,xp1]的形式表示一组序列,称为行向量(即水平方向的列表或者一维数组,向量是只有一个维度的矩阵)。而 T T T代表线性代数中的矩阵转置操作,所以 [ x 1 , x 2 , ⋯   , x p 1 ] T [x_1,x_2,\cdots,x_{p_1}]^T [x1,x2,,xp1]T代表一个列向量,其中的元素从上往下排列,与BP神经网络结构图中,纵向画出的神经元一一对应。
例如输入层第 n n n个节点的输入是 x n x_n xn,输出层第 n n n个节点的输出是 y n y_n yn

因此,可以把BP神经网络看成是一个从输入到输出的非线性映射,从 p 1 p_1 p1个输入映射成 p m p_m pm个输出。

BP定理

给定任意 ε \varepsilon ε>0,对于任意的连续函数 f f f,存在一个三层前向神经网络,可以在任意 ε \varepsilon ε平方误差精度内逼近 f f f

也就是说,只需要三层BP神经网络,就可以逼近任意一个连续的非线性函数,但是可能需要大量的隐层神经元个数,或者给BP神经网络添加更多的隐层数量。

如何最有效地确定BP神经网络的结构尚无定论,但通常默认,输入层的神经元个数,与样本的特征数一致,使每一个输入层神经元对应一种特征。输入层的神经元个数,与样本的类别数一致,使每一个输出层神经元对应一种分类。

BP神经网络的运作过程

Created with Raphaël 2.3.0 开始 初始化权值 输入:训练数据集与期望输出, 学习效率,容差,学习周期 正向传播,求隐层和输出层神经元的输出 求误差函数 误差函数是否小于容差? 学习周期数是否完成? 结束 反向传播,求输出层和隐层神经元的误差信号, 并计算误差梯度和权值修正量,更新权值 yes no yes no
  1. 初始化网络,确定各层的节点数量,然后设置初始权值
  2. 将数据归一化,然后从输入层输入训练数据集(包含输入与期望输出),开始学习。
  3. 前向(正向)传播:从输入层开始,逐层计算神经元的输入与输出,直到得出输出层的输出为止。
  4. 反向传播(学习):根据实际输出与期望输出,先计算输出层的总误差(损失函数)和输出层神经元的误差信号,然后逆向逐层计算所有神经元的误差信号和权值修正量,直到更新完所有神经元的误差信号和权值。
  5. 重复前向传播和反向传播,直到损失函数或者输出层神经元的误差信号足够小(与给出的容差进行对比),或者达到固定的学习次数(每一次学习意味着先后进行一次前向传播和反向传播),就停止学习。同时使用这两个判断条件,可以有效避免欠拟合与过拟合的情况。
  6. 学习完成后,输入测试数据集,得到输出结果,将其映射为样本的具体类型。

权值初始化

在BP神经网络中,权值初始化是一个非常重要的步骤,它可以影响网络的收敛速度和性能。
常用的初始化方法如下:

  1. 随机初始化
    w i j k = r a n d o m ( − a , a ) w_{ij}^k=random(-a,a) wijk=random(a,a)
    所有权值表现为(-a,a)上的随机分布。

  2. Xavier初始化

损失函数

损失函数,又称为代价函数,误差函数,在机器学习和统计建模中用于度量模型预测值与真实值之间的差异或损失程度,在BP神经网络中,表示输出层的实际输出与期望输出之间的总误差。
常用的损失函数 J J J如下:

  1. 均方误差
    J = 1 p m ∑ j = 1 p m ( y j m − y i ^ ) 2 J=\frac{1}{p_m}\sum_{j=1}^{p_m}(y_j^m-\hat{y_i})^2 J=pm1j=1pm(yjmyi^)2
    计算所有输出层神经元的输出与期望输出之间的差的平方和,最后求平均。
    由于最后不求平均也能反映误差水平,所以为了求导计算结果的美观,这里选择将其乘以 1 2 \frac{1}{2} 21,得到
    J = 1 2 ∑ j = 1 p m ( y j m − y i ^ ) 2 J=\frac{1}{2}\sum_{j=1}^{p_m}(y_j^m-\hat{y_i})^2 J=21j=1pm(yjmyi^)2
    下面将使用该式作为误差函数。
  2. 平均绝对误差
    J = 1 p m ∑ i = 1 n ∣ y i p m − y i ^ ∣ J=\frac{1}{p_m}\sum_{i=1}^n\lvert y_i^{p_m}-\hat{y_i}\rvert J=pm1i=1nyipmyi^

梯度下降法

BP算法的目标就是要通过反向学习,改变权值,使输出层的输出结果越来越接近期望输出。这个问题等价于,求误差函数的极小值,约束条件是上述的输入输出关系。

利用非线性规划中的“最快下降法(梯度下降法)”,使权值沿着误差函数的负梯度方向改变,得到神经网络权值的修正量为:
Δ w i j k − 1 = − ε ∂ J ∂ w i j k − 1 ( ε > 0 )

Δwijk1=εJwijk1(ε>0)
Δwijk1=εwijk1J(ε>0)
其中, ε \varepsilon ε为学习步长(又称为学习效率),它决定了每次对权值修正量的大小。
学习效率太大可能导致误差函数增大,难以或者无法收敛到最优解。学习效率太小,则会导致收敛缓慢,需要更多的学习次数和更多的计算,增加学习成本,还可能导致陷入局部最优解无法跳出。
一般学习效率小于0.5。

梯度下降法中有一个重要概念,即误差梯度。在BP神经网络中,误差梯度表示由误差函数对所有权值的偏导数构成的向量,即

Δ E = [ ∂ J ∂ w i j 2 , ∂ J ∂ w i j 3 , ∂ J ∂ w i j n , ∂ J ∂ w i j m ] ( n = 2 , 3 , ⋯   , m i = 1 , 2 , ⋯   , p n j = 1 , 2 , ⋯   , p n − 1 ) \Delta E= \left[\frac{\partial J}{\partial w_{ij}^2},\frac{\partial J}{\partial w_{ij}^3},\frac{\partial J}{\partial w_{ij}^n},\frac{\partial J}{\partial w_{ij}^m}\right]\quad \left(

n=2,3,,mi=1,2,,pnj=1,2,,pn1
\right) ΔE=[wij2J,wij3J,wijnJ,wijmJ] n=2,3,,mi=1,2,,pnj=1,2,,pn1
其中, p n p_n pn表示第n层神经元的个数。

可以看到, 权值的修正量 = − 学习效率 × 误差梯度元素 权值的修正量=-学习效率\times误差梯度元素 权值的修正量=学习效率×误差梯度元素
所以求所有权值的修正量,实际上就是求误差梯度。

对上式求偏导(由于本文章面向初学者,偏向应用,省略复杂计算),得
∂ J ∂ w i j k − 1 = ∂ J ∂ u i k y j k − 1 \frac{\partial J}{\partial w_{ij}^{k-1}}=\frac{\partial J}{\partial u_{i}^{k}}y_j^{k-1} wijk1J=uikJyjk1


d i k = ∂ J ∂ u i k

dik=Juik
dik=uikJ

Δ w i j k − 1 = − ε d i k y j k − 1 ( k = 2 , ⋯   , m ) \Delta w_{ij}^{k-1}=-\varepsilon d_i^ky_j^{k-1}\quad(k=2,\cdots,m) Δwijk1=εdikyjk1(k=2,,m)

对 (2) 式求偏导,得
d i k = ∂ J ∂ y i k f k ′ ( u i k )

dik=Jyikfk(uik)
dik=yikJfk(uik)
分两种情况求 (3) 式:

  1. 对输出层(第m层), k k k= m m m y i k = y i m y_i^k=y_i^m yik=yim,计算得
    d i m = ( y i m − y i ^ ) f m ′ ( u i m ) d_i^m=(y_i^m-\hat{y_i})f_m^{'}(u_i^m) dim=(yimyi^)fm(uim)
  2. 对于隐层 k k k,计算得
    d i k = f k ′ ( u i k ) ∑ l d l k + 1 w l i k + 1 d_i^k=f_k^{'}(u_i^k)\sum_ld_l^{k+1}w_{li}^{k+1} dik=fk(uik)ldlk+1wlik+1
    综上,BP学习算法可归纳为一般式
    Δ w i j k − 1 = − ε d i k y j k − 1 d i m = ( y i m − y i ^ ) f m ′ ( u i m ) d i k = f k ′ ( u i k ) ∑ l d l k + 1 w l i k + 1 ( k = m − 1 , ⋯   , 2 ) \Delta w_{ij}^{k-1}=-\varepsilon d_i^ky_j^{k-1}\\ d_i^m=(y_i^m-\hat{y_i})f_m^{'}(u_i^m)\\ d_i^k=f_k^{'}(u_i^k)\sum_ld_l^{k+1}w_{li}^{k+1}\quad(k=m-1,\cdots,2) Δwijk1=εdikyjk1dim=(yimyi^)fm(uim)dik=fk(uik)ldlk+1wlik+1(k=m1,,2)
    为了便于求导,取激活函数 f k f_k fk为Sigmoid函数,即
    y i k = f k ( u i k ) = 1 1 + e − u i k y_i^k=f_k(u_i^k)=\frac{1}{1+e^{-u_i^k}} yik=fk(uik)=1+euik1
    y i k y_i^k yik f k f_k fk代入一般式,则BP算法归纳为
    Δ w i j k − 1 = − ε d i k y j k − 1 d i m = y i m ( 1 − y i m ) ( y i m − y i ^ ) d i k = y i k ( 1 − y i k ) ∑ l d l k + 1 w l i k + 1 ( k = m − 1 , ⋯   , 2 ) \Delta w_{ij}^{k-1}=-\varepsilon d_i^ky_j^{k-1}\\ d_i^m=y_i^m(1-y_i^m)(y_i^m-\hat{y_i})\\ d_i^k=y_i^k(1-y_i^k)\sum_ld_l^{k+1}w_{li}^{k+1}\quad(k=m-1,\cdots,2) Δwijk1=εdikyjk1dim=yim(1yim)(yimyi^)dik=yik(1yik)ldlk+1wlik+1(k=m1,,2)

可以看出,要求第 k k k层节点的误差信号 d i k d_i^k dik,就要先求 ( k + 1 ) (k+1) (k+1)层的误差信号 d i k + 1 d_i^{k+1} dik+1。求所有节点的误差信号,求所有权值,求误差梯度,三者是同时进行的。

误差信号的求取是一个从输出层到输入层的反向传播的递归过程,所以称为反向传播(Backpropagation,BP)学习算法。

输入输出的编码

在实际问题中,样本特征和分类都是抽象的描述,而神经网络的输入只能接收数值类型,并且输出也是数值类型。所以需要对它们进行编码。

当然不是所有的样本特征都需要编码。比如以数列作为样本进行分类(如等比和等差数列等),其本身就是数值类型,所以无需编码,这个例子还有一个特殊的地方在于,数列的每一个单独的数值,都不能作为数列的特征,因为这些数值只有作为一个整体,才能表达数列的特征。

样本特征的编码

很多实际问题中的样本特征,都是难以量化的,为此,需要把这些特征映射为特征值,才能作为输入。
特征值通常取{0,1}或者{-1,1}。

例如,水果的分类问题:

10
外形椭圆
质地光滑粗糙
质量 ≤ \le 300g > > > 300g

任意一个水果,若特征值描述为 X = [ x 1 , x 2 , x 3 ] X=[x_1,x_2,x_3] X=[x1,x2,x3],其中, x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3分别对应外形、质地、质量三种特征。
则一个圆形,粗糙,质量小于300g的水果,其特征值为[1,0,1]。

分类的编码

在分类问题中,需要为每一个分类设定一种编码(可称为名义输出),也就是指定分类所对应的输出层神经元的输出

输入学习样本时,为了保证每一个样本数据对应一种分类,需要同时输入一个名义输出作为期望输出,和一个标签作为分类的名称。一般把所有样本数据的集合称为数据集,所有标签的集合称为标签集。数据集、期望输出列表和标签集,是一一对应的。

与特征值一样,名义输出值通常是整数,取{0,1}或者{-1,1}。

这样,神经网络在学习过程中,不断缩小实际输出与期望输出(名义输出)的差值,就是不断地强化神经网络对样本的分类准确度;当神经网络输出了某个设定的名义输出,就可以判定样本的分类。

由于一般输出层神经元数与分类数保持一致,所以可以让每一个神经元输出对应一种分类,只有一个输出可以取1,其他的只能取0,但输出1的神经元可以变化。例如在四分类问题中,四种名义输出分别为[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]。这样可以保证不同分类的输出,有两位是不同的1

如果输出层神经元数与分类数不一致,比如四分类问题中,输出层只有3个神经元,名义输出可以设置为[0,0,0],[0,1,1],[1,0,1],[1,1,0]。这种选值方式也是为了保证不同分类的输出,有两位不同,所以没有使用[0,0,1]等其他值。

直觉上,制造更大的区分度,更有利于神经网络对分类的判别。但这样的分类编码也存在一些问题,比如输出值可能与任何名义输出都不相同,则无法确定分类,这种情况也一定程度上反映了神经网络的学习效果不佳。

实际上存在其他的分类方法,可以避免无法确定分类的情况,即使用softmax函数处理输出,把输出层的输出转换成概率分布,每一个神经元的输出,对应一种分类的概率,总能够选出概率最大的分类。
softmax函数如下:
f i m = e y i ∑ n = 1 p m e y n ( i = 1 , 2 , ⋯   , p m ) f_i^m=\frac{e^{y_i}}{

n=1pmeyn
}\quad(i=1,2,\cdots,p_m) fim=n=1pmeyneyi(i=1,2,,pm)
其中 p m p_m pm为输出层神经元的个数, f i m f_i^m fim表示输出层的第 i i i个神经元输出转换成概率的结果。

输出到分类的映射

由于BP神经网络使用非线性激活函数,最终输出通常是小数的序列,而名义输出为整数序列,所以需要把输出层的输出映射成整数,通常使用非线性函数中的阶跃函数完成这种转换
f ( x i ) = { 0 x i < 0 1 x i ≥ 0 f(x_i)=\left\{

0xi<01xi0
\right. f(xi)={01xi<0xi0
f ( x i ) = { − 1 x i < 0 1 x i ≥ 0 f(x_i)=\left\{
1xi<01xi0
\right.
f(xi)={11xi<0xi0

针对不同的名义输出,选择恰当的阶跃函数,就解决了这个问题。


  1. 信息论中的海明距离,用于描述两个等长编码之间不同位的个数,这里可以说海明距离为2。 ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/999105
推荐阅读
相关标签
  

闽ICP备14008679号