深度学习之BP算法

作为深度学习领域的破冰之作,BP神经网络重新燃起了人们对深度学习的热情.它解决了DNN中的隐层传递中的权重值的计算问题.那么,BP算法思想是什么?它又是如何实现的呢?这就是本节的研究内容.

一.BP算法的提出及其算法思想
神经网络主要是由三个部分组成的,分别是:1) 网络架构 2) 激活函数 3) 找出最优权重值的参数学习算法.

BP算法就是目前使用较为广泛的一种参数学习算法.

BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络。

既然我们无法直接得到隐层的权值,能否先通过输出层得到输出结果和期望输出的误差来间接调整隐层的权值呢?BP算法就是采用这样的思想设计出来的算法,它的基本思想:学习过程由信号的正向传播(求损失)与误差的反向传播(误差回传)两个过程组成。如图1所示为BP算法模型示意图.

 

图1 BP算法模型示意图

二.BP算法
2.1 BP算法的一般流程
根据BP算法的基本思想,可以得到BP算法的一般过程:

1) 正向传播FP(求损失).在这个过程中,我们根据输入的样本,给定的初始化权重值W和偏置项的值b, 计算最终输出值以及输出值与实际值之间的损失值.如果损失值不在给定的范围内则进行反向传播的过程; 否则停止W,b的更新.

2) 反向传播BP(回传误差).将输出以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。

由于BP算法是通过传递误差值δ进行更新求解权重值W和偏置项的值b, 所以BP算法也常常被叫做δ算法.

下面我们将以三层感知器结构为例,来说明BP算法的一般计算方法(假设个隐层和输出层的激活函数为f).

 

图2 三层感知器结构

BP算法网络结构的示意图如图3所示.

 

图3 BP算法网络结构

2.2 BP算法的各层误差计算
各部分输入输出如图3所示, 下面进行各层误差计算.

1) 输出层的误差(平方和误差,前面的1/2是为了后面的计算方便)

(1)

2) 展开至隐层的误差(,是前面的WY的输出值,带入可以得到下面的式子)

(2)

3) 输入层误差(和前面一样,将VX带入f(netj))

(3)

观察上式, 我们很容易看出只有(3)式和输入x有关.E有了,那么就很简单可以看出可以使用常用的随机梯度下降法(SGD)求解.也就是求解式子中的W和V,使得误差E最小.

2.3 BP算法的示例
已知如图4所示的网络结构.

 

图4 网络结构图

设初始权重值w和偏置项b为:

w=(0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65)

b = (0.35,0.65)-->这里为了便于计算,假设从输入层到隐层之间, 隐层到输出层之间的偏置项b恒定.

1) FP计算过程

① 从输入层到隐层(其实这里的b可以看成一个特征)

h1 = w1*l1 +w2*l2 +b1*1 = 0.1*5+0.15*10+0.35*1 = 2.35

h2 = w3*l1 +w4*l2 +b1*1 = 0.2*5+0.25*10+0.35*1 = 3.85

h3 = w5*l1 +w6*l2 +b1*1 = 0.3*5+0.35*10+0.35*1 = 5.35

则各个回归值经过激活函数变换后的值为:

 

 

 

② 隐层到输出层

neto1 = outh1*w7 +outh2*w9 +outh3*w11+ b2*1= 2.35*0.4 + 3.85*0.5 +5.35 *0.6+0.65 = 2.10192

neto2 = outh1*w8 +outh2*w10 +outh3*w12 +b2*1= 2.35*0.45 + 3.85*0.55 +5.35 *0.65 +0.65= 2.24629

则经过激活函数变换得到:

outo1 = 0.89109 (真实值0.01) , outo2 = 0.90433 (真实值0.99)

此时的平方和误差为:

 

与真实值不符,需要进行BP反馈计算.

2) BP计算过程

这里的BP计算我们分为两个部分. ①隐层到输出层的参数W的更新 ②从输入层到隐层的参数W的更新.

**在这里,我们主要讲述第一部分隐层到输出层的参数W的更新.

 

图5 从隐层到输出层的网络结构图

如图5所示为从隐层到输出层的网络结构图.

首先,运用梯度下降法求解W7的值.

目标函数: ,由于此时求解W7,所以只与有关,则此时的损失函数为:

可以看出, 为凸函数(开口向上), 有最小值且最小值在导数为0的点上.

又有 neto1 = outh1*w7 +outh2*w9 +outh3*w11+ b2*1, outo1 = f(o1)

则对W7求偏导数得到:

(4)

又有W的更新公式为:

(5)

这样将上式带入W的更新公式(5)就可以求得更新后的W值.

最后,得到了W7的更新值为:

 

同理可以求得W9,W11,b2的更新值,这里就不在一一叙述了.

***对于从输入层到隐层的参数W的更新,其实和从隐层到输出层的几乎一样,唯一不同的就是链式求导过程中的Etotal和outo1,outo2都有关系.这里就不展开解释了.

参考文献

[1]https://www.cnblogs.com/jhding/p/5687549.html
————————————————
版权声明:本文为CSDN博主「笨拙的石头」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_32241189/article/details/80305566

posted @ 2021-11-13 23:30  编程coding小白  阅读(546)  评论(0编辑  收藏  举报