当前位置:首页|资讯

北太天元科普: 神经网络的反向传播算法

作者:北太天元卢朓发布时间:2024-10-05

神经网络的backpropation,即反向传播(Back Propagation,简称BP)算法,是神经网络中用于训练模型的核心算法之一。以下是对BP算法的详细解释:

一、基本概念

  • 神经网络:一种模仿动物神经网络行为特征,通过调整内部大量节点之间相互连接的关系来进行信息处理的数学模型。

  • BP神经网络:是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络之一。它由输入层、隐含层(也称中间层)和输出层构成,其中隐含层可以有一层或者多层。

二、BP算法的核心步骤

BP算法主要分为两个过程:

  1. 前向传播:数据(信息、信号)从输入端输入后,沿着网络的指向,乘以对应的权重后再加和,再将结果作为输入在激活函数中计算,将计算的结果作为输入传递给下一个节点。依次计算,直到得到最终结果。

  2. 反向传播:将输出的结果与期望的输出结果进行比较,将比较产生的误差利用网络进行反向传播。这是一个“负反馈”的过程,通过多次迭代,不断地对网络上的各个节点间的权重进行调整(更新),以减小误差。权重的调整(更新)通常采用梯度下降法。

三、BP算法的数学原理

  1. 链式法则:在神经网络中,链式法则(也称为反向传播算法)用于计算复合函数的梯度。这个复合函数是由多个简单函数(如线性变换和激活函数(可以是非线性的))复合而成的。为了计算整个复合函数的梯度,我们需要使用链式法则将梯度从输出层逐层传递回输入层。

  2. 梯度下降:梯度下降法是求解优化问题的常用方法,在深度学习中被广泛应用于训练神经网络和线性分类器等模型。对于多元函数,梯度是由所有偏导数组成的矢量,它提供了函数在当前点处各个方向上的变化信息,指向函数增加最快的方向或减少最快的方向。在深度学习中,我们通常关注减少最快的方向,即梯度的相反方向,因为我们的目标是最小化损失函数。梯度下降法的步骤包括初始化参数、计算梯度、使用梯度信息更新参数以及重复这些步骤直到满足停止条件。通过不断迭代更新参数,我们可以使损失函数逐渐减小,从而提高模型的性能。

举例


我们按照上图给出的具体神经网络结构,详细推导损失函数的梯度,并将其与输出层误差、隐含层误差等概念联系起来。

神经网络结构

  1. 输入层

    • x%20%3D%20%5Cbegin%7Bbmatrix%7D%20x_1%20%5C%5C%20x_2%20%5C%5C%20x_3%20%5Cend%7Bbmatrix%7D

  2. 隐含层

    • z_%7B1%2C1%7D 和  z_%7B1%2C2%7D

    • 输出:
       z_%7B1%2C1%7D%20%3D%20%5Csigma(w_%7B1%2C1%2C1%7Dx_1%20%2B%20w_%7B1%2C1%2C2%7Dx_2%20%2B%20w_%7B1%2C1%2C3%7Dx_3%20%2B%20b_%7B1%2C1%7D)z_%7B1%2C2%7D%20%3D%20%5Csigma(w_%7B1%2C2%2C1%7Dx_1%20%2B%20w_%7B1%2C2%2C2%7Dx_2%20%2B%20w_%7B1%2C2%2C3%7Dx_3%20%2B%20b_%7B1%2C2%7D)

    • 其中,σ 是Sigmoid激活函数,%5Csigma(x)%20%3D%20%5Cfrac%7B1%7D%7B1%20%2B%20e%5E%7B-x%7D%7D

  3. 输出层

    • z_%7B2%2C1%7D

    • z_%7B2%2C1%7D%20%3D%20%5Csigma(w_%7B2%2C1%2C1%7Dz_%7B1%2C1%7D%20%2B%20w_%7B2%2C1%2C2%7Dz_%7B1%2C2%7D%20%2B%20b_%7B2%2C1%7D)

    • y%20%3D%20z_%7B2%2C1%7D

  4. 损失函数

    • L%20%3D%20%5Cfrac%7B1%7D%7B2%7D%20*%20(y%20-%20y_%7Btrue%7D)%5E2

复合函数求导

首先,我们需要计算损失函数 L 对最终输出 y 的导数,即  %5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20y%7D 

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20y%7D%20%3D%20%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20y%7D%20%5Cleft(%20%5Cfrac%7B1%7D%7B2%7D%20(y%20-%20y_%7Btrue%7D)%5E2%20%5Cright)%20%3D%20y%20-%20y_%7Btrue%7D 

这个导数表示了预测值与真实值之间的差异,即输出层误差

把 y 对 w_{2,1,1} , w_{2,1,2}, b_{2,1} 的依赖是用复合函数写出来(重写抄写在下面)

z_%7B2%2C1%7D%20%3D%20%5Csigma(w_%7B2%2C1%2C1%7Dz_%7B1%2C1%7D%20%2B%20w_%7B2%2C1%2C2%7Dz_%7B1%2C2%7D%20%2B%20b_%7B2%2C1%7D)

y%20%3D%20z_%7B2%2C1%7D

L%20%3D%20%5Cfrac%7B1%7D%7B2%7D%20*%20(y%20-%20y_%7Btrue%7D)%5E2

看上面的三个公式表达的 L 是 w_{2,1,1}, w_{2,1,2}, b_{2,1} 的函数,用链式法则求 

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B2%2C1%2C1%7D%7D%20     的详细过程是

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B2%2C1%2C1%7D%7D%20%20%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20y%7D%20%20%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20z_%7B2%2C1%7D%7D%5Cfrac%7B%5Cpartial%20z_%7B2%2C1%7D%7D%7B%5Cpartial%20w_%7B2%2C1%2C1%7D%20%7D     

a_%7B2%2C1%7D%20%3D%20w_%7B2%2C1%2C1%7Dz_%7B1%2C1%7D%20%2B%20w_%7B2%2C1%2C2%7Dz_%7B1%2C2%7D%20%2B%20b_%7B2%2C1%7D  那么

z_%7B2%2C1%7D%20%3D%20%5Csigma(a_%7B2%2C1%7D)

从而我们可以利用求导的链式法则得到

%5Cfrac%7B%5Cpartial%20z_%7B2%2C1%7D%7D%7B%5Cpartial%20w_%7B2%2C1%2C1%7D%20%7D%20%3D%20%5Csigma'(a_%7B2%2C1%7D)%20z_%7B1%2C1%7D     

%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20z_%7B2%2C1%7D%7D%20%3D%201%20     , 代入到 %5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B2%2C1%2C1%7D%7D%20%20%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20y%7D%20%20%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20z_%7B2%2C1%7D%7D%5Cfrac%7B%5Cpartial%20z_%7B2%2C1%7D%7D%7B%5Cpartial%20w_%7B2%2C1%2C1%7D%20%7D     得到

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B2%2C1%2C1%7D%7D%20%20%3D%20(y-y_%7Btrue%7D)%20%5Csigma'(a_%7B2%2C1%7D)%20z_%7B1%2C1%7D     

a_%7B2%2C1%7D%20%3D%20w_%7B2%2C1%2C1%7Dz_%7B1%2C1%7D%20%2B%20w_%7B2%2C1%2C2%7Dz_%7B1%2C2%7D%20%2B%20b_%7B2%2C1%7D 。 

同理可以得到

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B2%2C1%2C2%7D%7D%20%20%3D%20(y-y_%7Btrue%7D)%20%5Csigma'(a_%7B2%2C1%7D)%20z_%7B1%2C2%7D     

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20b_%7B2%2C1%7D%7D%20%20%3D%20(y-y_%7Btrue%7D)%20%5Csigma'(a_%7B2%2C1%7D)      

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B1%2C1%2C1%7D%7D%2C%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B1%2C1%2C2%7D%7D%2C%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B1%2C1%2C3%7D%7D%20%2C%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20b_%7B1%2C1%7D%7D%20%2C%20...     这些loss function 对输入层的权重和偏置的导数的时候, 我们还是利用链式法则。 先把函数列出来如下

L%20%3D%20%5Cfrac%7B1%7D%7B2%7D%20*%20(y%20-%20y_%7Btrue%7D)%5E2

y%20%3D%20z_%7B2%2C1%7D

z_%7B2%2C1%7D%20%3D%20%5Csigma(w_%7B2%2C1%2C1%7Dz_%7B1%2C1%7D%20%2B%20w_%7B2%2C1%2C2%7Dz_%7B1%2C2%7D%20%2B%20b_%7B2%2C1%7D)

z_%7B1%2C1%7D%20%3D%20%5Csigma(w_%7B1%2C1%2C1%7Dx_1%20%2B%20w_%7B1%2C1%2C2%7Dx_2%20%2B%20w_%7B1%2C1%2C3%7Dx_3%20%2B%20b_%7B1%2C1%7D)z_%7B1%2C2%7D%20%3D%20%5Csigma(w_%7B1%2C2%2C1%7Dx_1%20%2B%20w_%7B1%2C2%2C2%7Dx_2%20%2B%20w_%7B1%2C2%2C3%7Dx_3%20%2B%20b_%7B1%2C2%7D)

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B1%2C1%2C1%7D%7D  ,  利用链式法则

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B1%2C1%2C1%7D%7D%20%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20y%7D%20%20%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20z_%7B2%2C1%7D%7D%20%20%5Cfrac%7B%5Cpartial%20z_%7B2%2C1%7D%7D%20%20%7B%5Cpartial%20z_%7B1%2C1%7D%7D%20%5Cfrac%7B%5Cpartial%20z_%7B1%2C1%7D%7D%7B%5Cpartial%20w_%7B1%2C1%2C1%7D%7D

%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20y%7D%20%20%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20z_%7B2%2C1%7D%7D%20%20%5Cfrac%7B%5Cpartial%20z_%7B2%2C1%7D%7D%20%20%7B%5Cpartial%20z_%7B1%2C1%7D%7D%20%20 就是  %20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20z_%7B1%2C1%7D%7D%20%20  ,我们就把这个称为对隐含层神经元 z_%7B1%2C1%7D 的误差, 记作 %5Cdelta_%7B1%2C1%7D%20

x%20%5Cin%20%5Cmathbb%7BR%7D%5E%7B3%5Ctimes%201%7D

a_%7B2%2C1%7D%20%3D%20w_%7B2%2C1%2C1%7Dz_%7B1%2C1%7D%20%2B%20w_%7B2%2C1%2C2%7Dz_%7B1%2C2%7D%20%2B%20b_%7B2%2C1%7D 是输出层神经元的输入, %5Csigma'(a_%7B2%2C1%7D)  是Sigmoid函数在 a_%7B2%2C1%7D 处的导数。

类似地,对于隐含层神经元 z_{1,2},其误差  %5Cdelta_%7B1%2C2%7D%20 可以表示为:

%5Cdelta_%7B1%2C2%7D%20%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20z_%7B1%2C2%7D%7D%20%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20y%7D%20*%20%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20z_%7B1%2C2%7D%7D%20%3D%20(y%20-%20y_%7Btrue%7D)%20*%20%5Csigma'(a_%7B2%2C1%7D)%20*%20w_%7B2%2C1%2C2%7D 

现在,我们已经计算出了隐含层每个神经元的误差,接下来我们需要计算loss function 对隐含层权重和偏置的偏导数。

w_%7B1%2C1%2C1%7D ,其偏导数可以表示为:

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B1%2C1%2C1%7D%7D%20%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20z_%7B1%2C1%7D%7D%20*%20%5Cfrac%7B%5Cpartial%20z_%7B1%2C1%7D%7D%7B%5Cpartial%20w_%7B1%2C1%2C1%7D%7D%20%3D%20%5Cdelta_%7B1%2C1%7D%20*%20%5Csigma'(a_%7B1%2C1%7D)%20*%20x_1

a_%7B1%2C1%7D%20%3D%20w_%7B1%2C1%2C1%7Dx_1%20%2B%20w_%7B1%2C1%2C2%7Dx_2%20%2B%20w_%7B1%2C1%2C3%7Dx_3%20%2B%20b_%7B1%2C1%7D  是隐含层神经元 z_{1,1} 的输入。

类似地,我们可以计算出其他权重和偏置的偏导数:

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_%7B1%2Cj%2Ck%7D%7D%20%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20z_%7B1%2Cj%7D%7D%20*%20%5Cfrac%7B%5Cpartial%20z_%7B1%2Cj%7D%7D%7B%5Cpartial%20w_%7B1%2Cj%2Ck%7D%7D%20%3D%20%5Cdelta_%7B1%2Cj%7D%20*%20%5Csigma'(a_%7B1%2Cj%7D)%20*%20x_k%20%2C%20%5Cquad%20j%20%3D%201%2C2%20%3B%20%20k%20%3D%201%2C2%2C3

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20b_%7B1%2Cj%7D%7D%20%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20z_%7B1%2Cj%7D%7D%20*%20%5Cfrac%7B%5Cpartial%20z_%7B1%2Cj%7D%7D%7B%5Cpartial%20b_%7B1%2Cj%7D%7D%20%3D%20%5Cdelta_%7B1%2Cj%7D%20*%20%5Csigma'(a_%7B1%2Cj%7D)%20%20%2C%20%5Cquad%20j%20%3D%201%2C2%20

a_%7B1%2Cj%7D%20%3D%20w_%7B1%2Cj%2C1%7Dx_1%20%2B%20w_%7B1%2Cj%2C2%7Dx_2%20%2B%20w_%7B1%2Cj%2C3%7Dx_3%20%2B%20b_%7B1%2Cj%7D  是隐含层神经元 z_{1,j} 的输入。


以下是用北太天元实现上述神经网络的前向传播和反向传播的代码。

上面的代码实现了一个简单的两层人工神经网络的前向传播和反向传播过程,并且使用了sigmoid激活函数。这个代码利用矩阵向量的形式, 因此我们用矩阵向量的形式重新描述反向传播算法。

矩阵向量的形式描述反向传播算法

x%20%5Cin%20%5Cmathbb%7BR%7D%5E%7B3%20%5Ctimes%201%7D%20  ,两层神经网络的权重矩阵$W_1$和$W_2$,偏置向量$b_1$和$b_2$,以及激活函数$\sigma$和其导数$\sigma'$。

 前向传播

1. 计算隐含层的输入和输出:

%20%20a_1%20%3D%20W_1%20x%20%2B%20b_1%2C%20%5Cquad%20z_1%20%3D%20%5Csigma(a_1) 

a_%7B1%7D%20%3D%20%5Cmathbb%7BR%7D%5E%7B2%5Ctimes%201%7D%20    ,  W_%7B1%7D%20%3D%20%5Cmathbb%7BR%7D%5E%7B2%5Ctimes%203%7D%20

 2. 计算输出层的输入和输出:

%20%20%20a_2%20%3D%20W_2%20z_1%20%2B%20b_2%2C%20%5Cquad%20y%20%3D%20%5Csigma(a_2)

a_%7B2%7D%20%3D%20%5Cmathbb%7BR%7D%5E%7B1%5Ctimes%201%7D%20    ,  W_%7B2%7D%20%3D%20%5Cmathbb%7BR%7D%5E%7B1%5Ctimes%202%7D%20

反向传播

1. 计算输出层误差:

%20%20%20%5Cdelta_2%20%3D%20y%20-%20y_%7Btrue%7D

   输出层参数的梯度:

%20%20%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20%20W_2%7D%20%3D%20%5Cdelta_2%20%20%5Csigma'(a_2)%20%20z_1%5E%5Ctop%2C%20%5Cquad%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20b_2%7D%20%20b_2%20%3D%20%5Cdelta_2%20%20%5Csigma'(a_2)%0A%0A

%E8%BF%99%E9%87%8C%E7%94%A8%E4%BA%86%E8%BD%AC%E7%BD%AE%EF%BC%8C%20%E6%98%AF%E4%B8%BA%E4%BA%86%E8%8E%B7%E5%BE%97%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20W_2%7D%20%E5%92%8C%20W_2%20%E7%9A%84%E5%A4%A7%E5%B0%8F%E9%83%BD%E6%98%AF%201%20%5Ctimes%202   

2. 计算隐含层误差:

%20%20%20%5Cdelta_1%20%3D%20(W_2%5E%5Ctop%20%5Cdelta_2)%20%20%5Csigma'(a_2)

这里得到的 \delta_{1} 是 2x1 的矩阵

   隐含层参数的梯度:

%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20%20W_1%7D%20%3D%20%5Cdelta_1%20.*%20%5Csigma(a_1)%20.*%20%20x%5E%5Ctop%2C%20%5Cquad%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20%20b_1%7D%3D%20%5Cdelta_1%20.*%20%5Csigma(a_1)

%20%5Cdelta_1%20.*%20%5Csigma(a_1)%20%20  做逐元素乘积的两边都是2x1 的矩阵, 得到的结果还是2x1的矩阵, 

(%20%20%5Cdelta_1%20.*%20%5Csigma(a_1)%20)%20%20.*%20x%20%5E%5Ctop 的左边是2x1的矩阵, 右边是 1x3的矩阵, 从而得到一个2x3的矩阵。 这里的乘法不是普通的线性代数的乘法,而是北太天元和MATLAB 规定的逐元素的乘法

北太天元演示 .* 乘法  

   3. 更新权重和偏置(假设学习率为$\eta$):

W_1%20%5Cleftarrow%20%20W_1%20-%20%5Ceta%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20%20W_1%7D%2C%20%5Cquad%20W_2%20%5Cleftarrow%20%20W_2%20-%20%5Ceta%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20%20W_2%7D


四、BP算法的应用与优化

BP算法被广泛应用于多个研究领域,如环境、生物、医学、气象、天文、地理、经济学、管理学、工业、统计学、计算机、移动通信、航天、信息技术、自动化、能源、新材料、海洋等领域。其主要应用方面包括预测,如电力运行负荷、血红蛋白浓度、房价、股市、水资源需求、风速、地质灾害等。

为了优化BP算法的性能,可以采取多种策略,如引入动量项、采用变步长法、使用正则化方法防止过拟合等。

综上所述,BP算法是神经网络中至关重要的训练算法,它通过前向传播和反向传播两个过程,利用链式法则和梯度下降法,不断优化网络参数,提高模型的预测性能。



北太天元计算结果截图如下: 



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1