反向传播算法(BP神经网络)

是谁在耳边,说“信号正向传播,误差反向传播” ?

梦回遥远大三的计算智能课,三年前我可想不到居然有朝一日会重新"预习"它......

每一堂课、一本书,当时只道是寻常,如今不经意想起,忽怀念这些瞬间。所谓成长,正是这些乏味却又鲜活的琐碎;所谓时光,正是这些不经意却弥足深刻的只言片语吧。


目录

一. 相关概念

​二. 神经网络通用表示

1. 一个神经元模型

2. 全连接神经网络

三. 前向传播算法

四. 反向传播算法

1. 采用批量梯度下降法获得参数w和b的更新公式

2. 通过链式法则和残差δ的定义求解代价函数的偏导

(1)对于输出层(L层)的权重参数w的偏导

(2)对于隐藏层(l层)的权重参数w的偏导

(3)对输出层和隐藏层的偏置参数b的偏导

(4)公式总结

3.对N个训练样本集用BP算法更新参数的步骤


一. 相关概念

后向传播学习的前馈型神经网络(Back Propagation Feed-forward Neural Network)简称BPNN,不严谨地说BP一般就是BPNN。后向传播是一种学习方法、规则,体现网络的训练过程;前馈型网络是一种结构,体现网络架构。

后向传播\neq反馈型网络。常见学习规则除了后向传播还有梯度下降等。

  • 前(正)向传播网络
  • 后(反)向传播网络:反向传播是指通过比较输出层的实际输出和预期的结果,得到误差,然后通过相关的误差方程式调整最后一个隐含层到输出层之间的网络权重,之后从最后一个隐含层向倒数第二隐含层进行误差反馈,调整它们之间的网络权重,以此类推,直到输人层与第一隐含层之间的网络权重调整为止。
  • 前馈型网络:各神经元从输入层开始单向传播,只接收前一级输入,并输出到下一级,直至输出层。整个网络中无反馈,可用一个有向无环图表示。

反向传播算法(BP神经网络)_第1张图片

  • 反馈型网络:输出层中存在着一个反馈回路到输入层作为输入层的一个输入,也可以自己到自己,可以理解为自控系统方框图中的反馈回路,可用有向循环图或者无向图表示。

反向传播算法(BP神经网络)_第2张图片

​二. 神经网络通用表示

1. 一个神经元模型

上图x1,x2,⋯,xi,⋯,xn​表示神经元的n个输入,w1,w2,⋯,wi,⋯,wn​表示对应输入的权重参数(链接权重),神经元对输入x权重w进行加权求和得到加权输入z,也就是神经元的状态。随后将z传递给激活函数f(⋅),得到激活值,对于单个神经元,也就是其输出值y。其中激活函数f(⋅)可以为多种激活函数,且激活函数均为非线性函数。

2. 全连接神经网络

反向传播算法(BP神经网络)_第3张图片

  • 在第 l 层神经元,用 n_{l} 表示这层神经元的个数,i\in \{1,2,...,n_{l}\}
  • x_{1}...x_{n_{l}}为输入,即\tiny (x_{1}^{(1)},x_{2}^{(1)},...,x_{i}^{(1)},...,x_{n_{l}}^{(1)})^{T}x_{i}表示第 i 个输入。
  • y_{1}...y_{n_{l}}为期望输出,即\tiny (y_{1}^{(l)},y_{2}^{(l)},...,y_{i}^{(l)},...,y_{n_{l}}^{(l)})^{T}y_{i}表示第 i 个期望输出。
  • \tiny z^{(l)}=\left( z_{1}^{(l)}, z_{2}^{(l)}, \cdots,z{_{i}}^{(l)},\cdots, z_{n_{l}}^{(l)}\right) ^{T}表示第 l 层的加权输出或神经元状态,z{_{i}}^{(l)}表示第 l 层的第 i 个神经元的加权输出。
  • a^{(l)}=\left( a_{1}^{(l)}, a_{2}^{(l)}, \cdots,a{_{i}}^{(l)},\cdots, a_{n_{l}}^{(l)}\right) ^{T}表示第 l 层的激活输出(实际输出),a{_{i}}^{(l)}表示第 l 层的第 i 个神经元的激活输出(实际输出)。
  • w{_{ij}}^{(l)}是权重矩阵W^{(l)}中的元素,表示前一层 l-1 层第j个神经元的第i个加权
  • 表示从上一层到当前层 l 层的偏置。b{_{i}}^{(l)}表示当前层第 l 层第i个神经元的偏置。

三. 前向传播算法

第2层第1个加权输出 z{_{1}}^{(2)}=\omega {_{11}}^{(2)}x_{1}+\omega {_{12}}^{(2)}x_{2}+\omega {_{13}}^{(2)}x_{3}+b{_{1}}^{(2)}

第2层第1个激活值    a{_{1}}^{(2)}=f(z{_{1}}^{(2)})

⋯⋯

可总结出,第 l 层神经元的状态及激活值为(z,a,b都是向量形式):

\begin{aligned} \boldsymbol{z}^{(l)} &=W^{(l)} \boldsymbol{a}^{(l-1)}+\boldsymbol{b}^{(l)} \\ \boldsymbol{a}^{(l)} &=f\left(\boldsymbol{z}^{(l)}\right) \end{aligned}

对于 L 层网络,正向传播的前馈型神经网络传递过程如下:

\tiny [\boldsymbol{x}=\boldsymbol{a}^{(1)} ]\rightarrow [\boldsymbol{a}^{(2)}=f(\boldsymbol{z}^{(2)}) ]\rightarrow \cdots \rightarrow [\boldsymbol{a}^{(l)}=f(\boldsymbol{z}^{(l)}) ]\rightarrow \cdots \rightarrow [\boldsymbol{a}^{(L)}=f(\boldsymbol{z}^{(L)})=\boldsymbol{y}]

前向传播算法用于计算模型最终的输出结果;后向传播算法用于减小模型输出结果与实际结果之前的误差,通过调整参数权重来优化模型。因此,神经网络,就是通过前向传播与后向传播算法的循环迭代来训练模型,进而进行预测或者分类。

四. 反向传播算法

1. 采用批量梯度下降法获得参数\tiny w{_{ij}}^{(l)}\tiny b{_{i}}^{(l)}的更新公式

训练方式为梯度下降法,目的是求使代价函数最小的参数值。具体方法为,一步步地循环重复将参数值更新为:上一次参数 - 代价函数对上一次参数值的导数。每一步更新都用到所有的训练样本叫做批量梯度下降。

  • 用右上标 (k) 表示第 k 个训练的训练集,不表示网络层数,那么N个训练集表示为\left\{\left(\boldsymbol{x}^{(1)}, \boldsymbol{y}^{(1)}\right),\left(\boldsymbol{x}^{(2)}, \boldsymbol{y}^{(2)}\right), \cdots,\left(\boldsymbol{x}^{(k)}, \boldsymbol{y}^{(k)}\right), \cdots,\left(\boldsymbol{x}^{(N)}, \boldsymbol{y}^{(N)}\right)\right\},每个 \small \boldsymbol{x}\small \boldsymbol{y} 都是向量表示。其中\tiny k\in \{1,...,N\}
  • 对于第 k 个训练样本集的输入,在第 l 层,用下标 i 表示第 i 个输出 \small o_{i} 或期望输出\small y_{i},其中 \tiny i\in \{1,...,N_{l}\}N_{l}维实际输出\boldsymbol{o}^{(k)}=(o_{1}^{(k)},o_{2}^{(k)},...,o_{i}^{(k)},...,o_{N_{l}}^{(k)})^{T}\tiny N_{l} 维期望的输出\tiny \boldsymbol{y}^{(k)}=(y_{1}^{(k)},y_{2}^{(k)},...,y_{i}^{(k)},...,y_{N_{l}}^{(k)})^{T}

对于第 k 个训练数据\left(\boldsymbol{x}^{(k)}, \boldsymbol{y}^{(k)}\right),训练的误差定义为,这一次的每个期望输出 \small y_{i} 减去实际输出 \small a_{i},再将这 \small N_{l} 个项求平方和。也就是说,单个训练样本的代价函数为:

\tiny E^{(k)}=\frac{1}{2}\left \|\boldsymbol{y}^{(k)}-\boldsymbol{o}^{(k)} \right \| =\frac{1}{2} \sum_{i=1}^{N_{l}}(y{_{i}}^{(k)}-a{_{i}}^{(k)})^{2}

N个样本训练完成之后,得到所有训练样本的总体(平均)代价为:

E_{total}=\frac{1}{N}\sum_{k=1}^{N}E^{(k)}

上标表示又回到第四节之前,\boldsymbol{W}^{(l)}\boldsymbol{b}^{(l)}右上标(l)表示表示网络层数,E^{(k)}仍表示为第 k 个训练集。采用批量梯度下降算法,l 层的参数\boldsymbol{W}^{(l)}\boldsymbol{b}^{(l)}的更新公式为如下形式:

\tiny \begin{aligned} & \boldsymbol{W}^{(l)} =\boldsymbol{W}^{(l)}-\mu \frac{\partial E_{t o t a l}}{\partial \boldsymbol{W}^{(l)}} =\boldsymbol{W}^{(l)}-\frac{\mu}{N} \sum_{k=1}^{N} \frac{\partial E^{(k)}}{\partial \boldsymbol{W}^{(l)}} \\ &\boldsymbol{b}^{(l)} =\boldsymbol{b}^{(l)}-\mu \frac{\partial E_{t o t a l}}{\partial \boldsymbol{b}^{(l)}} =\boldsymbol{b}^{(l)}-\frac{\mu}{N} \sum_{k=1}^{N} \frac{\partial E^{(k)}}{\partial \boldsymbol{b}^{(l)}} \end{aligned}

只需通过BP算法求出每个训练集的代价函数E^{(k)}\boldsymbol{W}^{(l)}\boldsymbol{b}^{(l)}的偏导数即可得到\boldsymbol{W}^{(l)}\boldsymbol{b}^{(l)}的迭代更新公式。

2. 通过链式法则和残差 \tiny \boldsymbol{\delta}^{l} 的定义求解代价函数的偏导

反向传播算法(BP神经网络)_第4张图片

右上标(l)表示表示网络层数,并且去掉第四-1节第k个训练数据集误差E^{(k)}的上标,直接记为EE是单个训练数据集的误差。

将E展开到 Layer2,有:

\tiny \begin{aligned} E &=\frac{1}{2}\|\boldsymbol{y}-\boldsymbol{o}\| \\ &=\frac{1}{2}\left\|\boldsymbol{y}-\boldsymbol{a}^{(3)}\right\| \\ &=\frac{1}{2}\left(\left(y_{1}-a_{1}^{(3)}\right)^{2}+\left(y_{2}-a_{2}^{(3)}\right)^{2}\right) \end{aligned}

其中 \tiny a_{1}^{(3)}=f(z_{1}^{(3)})=f(w_{11}^{(3)} a_{1}^{(2)}+w_{12}^{(3)} a_{2}^{(2)}+w_{13}^{(3)} a_{3}^{(2)}+b_{1}^{(3)})

(1)对于输出层(L层)的权重参数w的偏导 \tiny \frac{\partial E^{(k)}}{\partial \boldsymbol{W}^{(L)}}

E 对\tiny w_{11}^{(3)}求导,由链式法则形式1 \tiny \frac{d}{d x} f(g(x))=f^{\prime}(g(x)) g^{\prime}(x),有:

\tiny \begin{aligned} \frac{\partial E}{\partial w_{11}^{(3)}} &=\frac{1}{2} \cdot 2\left(y_{1}-a_{1}^{(3)}\right)\left(\frac{\partial y_{1}}{\partial w_{11}^{(3)}}-\frac{\partial a_{1}^{(3)}}{\partial w_{11}^{(3)}}\right) \\& =\frac{1}{2} \cdot 2\left(y_{1}-a_{1}^{(3)}\right)\left(-\frac{\partial a_{1}^{(3)}}{\partial w_{11}^{(3)}}\right) \\ &=\left(y_{1}-a_{1}^{(3)}\right) f^{\prime}\left(z_{1}^{(3)}\right) \left ( - \frac{\partial z_{1}^{(3)}}{\partial w_{11}^{(3)}} \right ) \\ &=-\left(y_{1}-a_{1}^{(3)}\right) f^{\prime}\left(z_{1}^{(3)}\right) a_{1}^{(2)} \quad \quad\quad\quad\cdots[1] \end{aligned}

E 对\tiny w_{11}^{(3)}求导,由链式法则形式2 \tiny \frac{d u}{d x}=\frac{d u}{d y} \cdot \frac{d y}{d x},又有:

\tiny \frac{ \partial E }{\partial \omega {_{ij}}^{(l)}} = \frac{\partial E}{\partial z_{i}^{(l)}} \ast \frac{\partial z_{i}^{(l)}}{\partial \omega {_{ij}}^{(l)}} =\frac{ \partial E}{\partial z_{i}^{(l)}}a{_{j}}^{(l-1)},即

\tiny \begin{aligned} \frac{\partial E}{\partial w_{11}^{(3)}} =\frac{\partial E}{\partial z_{1}^{(3)}} \frac{\partial z_{1}^{(3)}}{\partial w_{11}^{(3)}} =\delta_{1}^{(3)} a_{1}^{(2)} \quad \quad\quad\quad\quad\quad\cdots[2] \end{aligned}

其中,定义:\tiny \delta_{1}^{(3)}\equiv \frac{\partial E}{\partial z_{1}^{(3)}}

那么,由 \tiny [1]\tiny [2],得:

\tiny \delta_{1}^{(3)}=\frac{\partial E}{\partial z_{1}^{(3)}}=-\left(y_{1}-a_{1}^{(3)}\right) f^{\prime}\left(z_{1}^{(3)}\right)

推广到一般情况,设网络层数为 L,有:

\tiny \begin{aligned} &\frac{\partial E}{\partial w_{i j}^{(L)}}=\delta_{i}^{(L)} a_{j}^{(L-1)} & & \left(1 \leq i \leq n_{L},1 \leq j \leq n_{L-1}\right) \\& {\color{Red} \delta_{i}^{(L)}=-\left(y_{i}-a_{i}^{(L)}\right) f^{\prime}\left(z_{i}^{(L)}\right) } & & \left(1 \leq i \leq n_{L}\right) \quad\quad\quad\quad\quad\quad\quad\quad {\color{Red} \cdots[BP-1]} \end{aligned}

上两式对应矩阵(向量形式)为:

\begin{aligned} & \frac{\partial E}{\partial \boldsymbol{W}^{(L)}}=\nabla_{\boldsymbol{W}^{(L)}} E =\boldsymbol{\delta}^{(L)}\left(\boldsymbol{a}^{(L-1)}\right)^{\top}\\& {\color{Red}\boldsymbol{\delta}^{(L)} =-\left(\boldsymbol{y}-\boldsymbol{a}^{(L)}\right) \odot f^{\prime}\left(\boldsymbol{z}^{(L)}\right) \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad \cdots[BP-1]} \end{aligned}

其中矩阵哈德马乘积\tiny \bigodot是对应位置元素分别相乘。

(2)对于隐藏层(\large \boldsymbol{l}层)的权重参数w的偏导 \tiny \frac{\partial E^{(k)}}{\partial \boldsymbol{W}^{(l)}}

由上一节,得:

\tiny {\color{Red} \frac{\partial E}{\partial w_{i j}^{(l)}}=\delta_{i}^{(l)} a_{j}^{(l-1)}}\quad(2 \leq l \leq L-1) {\color{Red}\quad\quad\quad\quad\quad \cdots[BP-3]}

向量形式为:

{\color{Red} \frac{\partial E}{\partial \boldsymbol{W}^{(l)}}=\nabla_{\boldsymbol{W}^{(l)}} E =\boldsymbol{\delta}^{(l)}\left(\boldsymbol{a}^{(l-1)}\right)^{\top}} {\color{Red}\quad\quad\quad\quad\quad \cdots[BP-3]}

而由:

  \small \begin{aligned} \frac{\partial E}{\partial z_{i}^{(l)}} &=\frac{\partial E}{\partial z_{1}^{(l+1)}} \frac{\partial z_{1}^{(l+1)}}{\partial z_{i}^{(l)}}+\frac{\partial E}{\partial z_{2}^{(l+1)}} \frac{\partial z_{2}^{(l+1)}}{\partial z_{i}^{(l)}}+\cdots+\frac{\partial E}{\partial z_{n_{l+1}}^{(l+1)}} \frac{\partial z_{n_{l+1}}^{(l+1)}}{\partial z_{i}^{(l)}} =\sum_{j=1}^{n_{l+1}} \frac{\partial E}{\partial z_{j}^{(l+1)}} \frac{\partial z_{j}^{(l+1)}}{\partial z_{i}^{(l)}} \end{aligned}

\tiny l+1层的神经元每个\tiny z_{j}^{(l+1)}都与\tiny z_{j}^{(l)}有联接,\tiny z_{j}^{(l)}出现了\tiny n_{l+1}次,每一次对应一个\tiny z_{j}^{(l+1)}, 1 \leq j \leq n_{l+1}

故:

\tiny \begin{aligned} \delta_{i}^{(l)} & \equiv \frac{\partial E}{\partial z_{i}^{(l)}} \\ &=\sum_{j=1}^{n_{l+1}} \frac{\partial E}{\partial z_{j}^{(l+1)}} \frac{\partial z_{j}^{(l+1)}}{\partial z_{i}^{(l)}} \\ &=\sum_{j=1}^{n_{l+1}} \delta_{j}^{(l+1)} \frac{\partial z_{j}^{(l+1)}}{\partial z_{i}^{(l)}} \end{aligned}

又因为其中 \tiny z_{j}^{(l+1)}=\sum_{i=1}^{n_{l}} w_{j i}^{(l+1)} a_{i}^{(l)}+b_{j}^{(l+1)}=\sum_{i=1}^{n_{l}} w_{j i}^{(l+1)} f\left(z_{i}^{(l)}\right)+b_{j}^{(l+1)}

从而\small \frac{\partial z_{j}^{(l+1)}}{\partial z_{i}^{(l)}}=\frac{\partial z_{j}^{(l+1)}}{\partial a_{i}^{(l)}} \frac{\partial a_{i}^{(l)}}{\partial z_{i}^{(l)}}=w_{j i}^{(l+1)} f^{\prime}\left(z_{i}^{(l)}\right),带入\tiny \delta_{i}^{(l)},得:

\tiny \begin{aligned} {\color{Red}\delta_{i}^{(l)}} & =\sum_{j=1}^{n_{l+1}} \delta_{j}^{(l+1)} w_{j i}^{(l+1)} f^{\prime}\left(z_{i}^{(l)}\right) \\ & {\color{Red} =\left(\sum_{j=1}^{n_{l+1}} \delta_{j}^{(l+1)} w_{j i}^{(l+1)}\right) f^{\prime}\left(z_{i}^{(l)}\right)} \quad\quad\quad\quad {\color{Red} \cdots[BP-2]} \end{aligned}

向量形式:

\tiny {\color{Red} \boldsymbol{\delta}^{(l)}=\left(\left(\boldsymbol{W}^{(l+1)}\right)^{\top} \boldsymbol{\delta}^{(l+1)}\right) \odot f^{\prime}\left(\boldsymbol{z}^{(l)}\right)} \quad\quad\quad\quad {\color{Red} \cdots[BP-2]}

即利用\tiny l+1层的\tiny \delta_{j}^{(l+1)}来计算 \small l 层的\tiny \delta_{j}^{(l)},称为误差反向传播。

(3)对输出层和隐藏层的偏置参数b的偏导\tiny \frac{\partial E^{(k)}}{\partial \boldsymbol{b}^{(L)}}\tiny \frac{\partial E^{(k)}}{\partial \boldsymbol{b}^{(l)}}

\tiny \begin{aligned} {\color{Red} \frac{\partial E}{\partial b_{i}^{(l)}}} &=\frac{\partial E}{\partial z_{i}^{(l)}} \frac{\partial z_{i}^{(l)}}{b_{i}^{(l)}} \\ &{\color{Red} =\delta_{i}^{(l)}}\quad\quad\quad\quad\quad\quad\quad {\color{Red} \cdots[BP-4]} \end{aligned}

向量形式:

\tiny {\color{Red} \frac{\partial E}{\partial \boldsymbol{b}^{(l)}}=\nabla_{\boldsymbol{b}^{(l)}} E={\boldsymbol{\delta}}^{l}}\quad\quad\quad {\color{Red} \cdots[BP-4]}

(4)公式总结

\tiny \begin{array}{l}{\delta_{i}^{(L)}=-\left(y_{i}-a_{i}^{(L)}\right) f^{\prime}\left(z_{i}^{(L)}\right)} \quad\quad\quad\quad\cdots[BP-1] \\ {\delta_{i}^{(l)}=\left(\sum_{j=1}^{n_{l+1}} \delta_{j}^{(l+1)} w_{j i}^{(l+1)}\right) f^{\prime}\left(z_{i}^{(l)}\right)} \quad\cdots[BP-2] \\ {\frac{\partial E}{\partial w_{i j}^{(l)}}=\delta_{i}^{(l)} a_{j}^{(l-1)}}\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\cdots[BP-3] \\ {\frac{\partial E}{\partial b_{i}^{(l)}}=\delta_{i}^{(l)}}\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\cdots[BP-4] \end{array}

(其中 \dpi{300} \tiny \delta_{i}^{(l)}\equiv \frac{\partial E}{\partial z_{i}^{(l)}}

向量形式:

\tiny \begin{array}{l}{\boldsymbol{\delta}^{(L)}=-\left(\boldsymbol{y}-\boldsymbol{a}^{(L)}\right) \odot f^{\prime}\left(\boldsymbol{z}^{(L)}\right)}\quad\quad\quad\cdots[BP-1] \\ {\boldsymbol{\delta}^{(l)}=\left(\left(\boldsymbol{W}^{(l+1)}\right)^{\top} \boldsymbol{\delta}^{(l+1)}\right) \odot f^{\prime}\left(\boldsymbol{z}^{(l)}\right)} \cdots[BP-2] \\ {\nabla_{\boldsymbol{W}^{(l)}} E=\frac{\partial E}{\partial \boldsymbol{W}^{(l)}}=\boldsymbol{\delta}^{(l)}\left(\boldsymbol{a}^{(l-1)}\right)^{\top}}\quad\quad\cdots[BP-3] \\ \nabla_{ \boldsymbol{b}^{(l)}} E={\frac{\partial E}{\partial \boldsymbol{b}^{(l)}}=\boldsymbol{\delta}^{l}}\quad\quad\quad\quad\quad\quad\quad\quad\quad\cdots[BP-4]\end{array}

3.对N个训练样本集用BP算法更新参数的步骤

初始化参数\boldsymbol{W}\tiny \boldsymbol{b}

Step1. 根据样本集的某个输入样本\left(\boldsymbol{x}^{(k)}, \boldsymbol{y}^{(k)}\right),利用前向传播算法算出每个神经元的输出z和a,直到输出层

\tiny \begin{aligned} \boldsymbol{z}^{(l)} &=W^{(l)} \boldsymbol{a}^{(l-1)}+\boldsymbol{b}^{(l)} \\ \boldsymbol{a}^{(l)} &=f\left(\boldsymbol{z}^{(l)}\right) \end{aligned}

Step2. 由BP算法4个公式求E对参数的偏导数

  1. 计算出输出层的\tiny \boldsymbol{\delta}^{(L)}(由[BP-1]),再依次计算隐藏层的\tiny \boldsymbol{\delta}^{(l)}(由[BP-2])
  2. 然后:

  反向传播算法(BP神经网络)_第5张图片

Step3. 更新网络权重和偏置

\tiny \begin{aligned} \boldsymbol{W}^{(l)} &=\boldsymbol{W}^{(l)}-\frac{\mu}{N} \sum_{k=1}^{N} \frac{\partial E^{(k)}}{\partial \boldsymbol{W}^{(l)}} \\ \boldsymbol{b}^{(l)} &=\boldsymbol{b}^{(l)}-\frac{\mu}{N} \sum_{k=1}^{N} \frac{\partial E^{(k)}}{\boldsymbol{b}^{(l)}} \end{aligned}

Step4. 判断结束

对于一定的判断结束的准则,比如每个样本的最终输出误差小于可接受的范围或迭代次数达到一定阈值。若不满足,迭代执行Step2、Step3继续对当前样本进行训练,直到当前样本满足条件训练结束。否则,当前样本训练完毕,选取下一样本,转到Step1继续进行训练。

如下图所示:

反向传播算法(BP神经网络)_第6张图片

 

 

参考:https://blog.csdn.net/qq_32865355/article/details/80260212

你可能感兴趣的:(深度学习,反向传播算法,BP神经网络,BP算法)