购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2.5 误差反向传播

2.1.2小节给出了单层感知器的参数更新公式为式(2.2)和式(2.3)。在多层神经网络中,上一层的输出是下一层的输入,要在网络中的每一层计算损失函数的梯度会非常复杂。为了解决这个问题,以McClelland和Rumelhart为首的科学家小组提出一种解决方法,这种方法被称为误差反向传播算法(Back Propagation,BP算法)。BP算法解决了多层神经网络的学习问题,极大地促进了神经网络的发展。BP神经网络也是整个人工神经网络体系中的精华,广泛应用于分类识别、逼近、回归、压缩等领域。在实际应用中,大约80%的神经网络模型都采取了BP网络或BP网络的变化形式。

误差反向传播算法更新参数过程如下:

1)将训练集数据输入神经网络的输入层,经过隐藏层,最后达到输出层并输出结果,这就是前向传播过程。

2)由于神经网络的输出结果与实际结果有误差,因此需计算估计值与实际值之间的误差(交叉熵损失函数值或最小二乘法值),并将该误差从输出层向隐藏层反向传播,直至传播到输入层。

3)在反向传播的过程中,根据误差调整权重参数和偏置参数,使得总损失函数减小。

4)迭代上述三个步骤(即对数据进行反复训练),直到满足停止准则。

误差反向传播算法实际上是一种在神经网络训练过程中用来计算梯度的方法,它能够计算损失函数对网络中所有模型参数的梯度,这个梯度会反馈给某种学习算法,例如梯度下降法,用来更新权重和偏置,最小化损失函数。这里梯度下降法才是学习算法,除了梯度下降法,也可以采用其他的学习算法。另外,误差反向传播法并不仅仅适应于多层神经网络,原则上它可以计算任何函数的导数。

误差反向传播的原理是基于链式法则(chain rule)。链式法则是微积分中的一种重要规则,它可以用于求解复合函数的导数。在数学中,复合函数是由多个函数组合而成的函数,例如 f g x )),其中 g x )和 f x )都是函数。链式法则描述了如何计算复合函数的导数,它可以帮助更好地理解函数之间的关系,从而解决复杂问题。

具体来说,链式法则可以表示为:

y = f u ), u = g x )则有:

式(2.9)表明,对于复合函数 y = f g x )),它的导数可以通过先求出 y u 的导数,再求 u x 的导数,最后将两个导数相乘得到。这个过程相当于将复合函数分解成两个简单函数的导数的乘积。在神经网络中,每个节点都可以看作是一个复合函数,它的输出值只与其输入值有关。因此,可以使用链式法则来计算神经网络中每个节点的梯度,从而实现神经网络的训练和优化。

接下来以一个简单的全连接神经网络为例演示BP算法更新权重参数过程。如图2.11所示,该神经网络输入层两个信息为 i 1 i 2 ;有一个隐藏层,该隐藏层有两个神经元 h 1 h 2 ;输出层有两个神经元,分别为 o 1 o 2 。由于是全连接神经网络,图中有8条连接线,因此有8个权重参数,另外还有隐藏层的偏置 b 1 和输出层的偏置为 b 2 两个参数。

要求根据给出的输入数据训练模型更新权重和偏置参数,使得输出尽可能与期望的输出接近,采用的激活函数为sigmoid函数。

本实例中输入信息 i 1 =0.02, i 2 =0.7;输出信息 o 1 =0, o 2 =1。假定初始化权重参数和偏置参数为 w 1 =0.1, w 2 =0.2, w 3 =0.3, w 4 =0.4, w 5 =0.2, w 6 =0.3, w 7 =0.1, w 8 =0.2, b 1 =0.3, b 2 =0.2。参数更新求解过程如图2.12所示,下面按照框图中的三大步来讲述误差反向传播参数更新计算过程。

图2.11 BP算法实例

图2.12 参数更新求解过程框图

步骤如下所述。

1.信号前向传播(激活函数为sigmoid)

(1)输入层→隐藏层

输入层两个信息 i 1 i 2 ,传播到隐藏层 h 1 神经元的净活值为net h 1

通过激活函数激活得到隐藏层 h 1 神经元的激活值out h 1

用同样的方法可以得到隐藏层 h 2 神经元的激活值out h 2 的值:

(2)隐藏层→输出层

隐藏层两个神经元的输出out h 1 和out h 2 ,传播到输出层 o 1 神经元的净活值为net o1

通过激活函数激活得到输出层 o 1 神经元的激活值out o 1

用同样的方法可以得到输出层 o 2 神经元的输出激活值out o 2 的值:

经过神经网络第一轮正向传播完成后,输出值为[0.62586,0.59613],与实际值[0,1]相差大。第二步将通过误差反向传播来更新参数。

2.误差反向传播

(1)计算总误差

采用平方误差作为衡量标准,总误差 E total 为输出层第一个神经元的平方误差 E o 1 与第二个神经元的平方误差 E o 2 之和。计算 E o 1

计算 E o 2

计算总误差 E total

(2)隐藏层→输出层的权重更新

误差 E total 与所有权重参数之间是有函数关系的,以权重参数 w 5 为例,如图2.13所示, E total E o 1 存在函数关系, E o 1 与out o 1 存在函数关系,out o 1 与net o 1 存在函数关系,而net o 1 w 5 存在函数关系,因此 E total w 5 存在函数关系。通过梯度下降法更新权重参数 w 5 ,需要求出总误差 E total 对于 w 5 的偏导, E total 对于 w 5 的偏导求解为

图2.13 总误差与权重参数 w 5 关系图

这实际是一个“链式求导”过程,分别求出后面三项,就可以求出 E total 对于 w 5 的偏导。下面分别求解这三项。

1)计算 :前面已经说明,总误差采用平方误差方法,总误差 E total 为输出层两个神经元误差之和:

总误差对输出层第一个神经元的输出out o 1 求偏导为

2)计算 :输出层第一个神经元的输出out o 1 与净活值net o 1 是激活函数关系,激活函数采用sigmoid函数:

out o 1 对net o 1 求偏导值为

3)计算 :输出层第一个神经元的净活值net o 1 与权重参数 w 5 的关系为

求net o 1 w 5 的偏导值为

综合式(2.20)~式(2.23)和式(2.25),可以求总误差 E total w 5 的偏导:

然后利用梯度下降法更新 w 5 的值为

用同样的方法可更新 w 6 w 7 w 8 的值。需要注意的是,在求每个参数更新值的时候,其他参数在这一轮中仍然用更新前的值,比如求 w 6 的更新值时,前面计算公式中如有 w 5 的值,要用原来的值,也就是各权重参数要同步更新。

(3)输入层→隐藏层的权重更新

以权重参数 w 1 为例,采用梯度下降法更新 w 1 的值,需要求出总误差 E total 对于 w 1 的偏导值。如式(2.20)所示,总误差 E total E o 1 E o 2 之和,从前面信号正向传播分析可知, i 1 w 1 传播到 h 1 h 1 的输出会分别传播到 o 1 o 1 ,可知 E o 1 E o 2 都是 w 1 的函数。虽然由图2.14可知 w 1 离最后得到的总误差 E total 更远,但 E total w 1 是存在函数关系的,根据链式法则得到 E total w 1 的偏导为

图2.14 总误差与权重参数 w 1 关系图

对式(2.28)右边三项分别计算。

1)计算 :总误差 E total 对隐藏层第一个神经元的输出out h 1 的偏导为

同样根据链式法则, E o 1 对out h 1 的偏导为

E o 2 对out h 1 的偏导为

综合式(2.30)和式(2.31),可得到总误差 E total 对out h 1 偏导为

2)计算 :隐藏层第一个神经元的输出out h 1 和隐藏层第一个神经元的净活值net h 1 是通过Sigmoid函数激活得到的,所以其关系为

由此可以推导得到out h 1 对net h 1 的偏导值为

3)计算 :隐藏层第一个神经元的净活值net h 1 w 1 是线性关系:

可以推导得到net h 1 w 1 的偏导为

综合式(2.32)、式(2.34)和式(2.36),可得到总误差 E total 对于 w 1 的偏导值为

最后,更新 w 1 权重为

需要注意,更新 w 1 时,其他权重参数都用原来的值,也就是要求各参数都要同步更新。用同样的方法可更新权重参数和 w 2 w 3 w 4 。偏置参数 b 1 b 2 用同样的方法可更新。

3.迭代计算

第一轮误差反向传播完成后,总误差 E total 由0.27741下降至0.26537。把更新的权重重新计算,迭代10000次后,总误差为0.000063612,输出为[0.00793003941675692,0.9919789331998798](原输入为[0,1])。 pyN2Jfk1qQD+pd3bqSHeg9BNzuiJegjXB8b1MKpo1KNI5SWY+Rf4DW06XlTbpwqB

点击中间区域
呼出菜单
上一章
目录
下一章
×