BP神经网络原理

BP神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络(摘自百度百科)。

结构与原理

神经网络由三部分组成,分别是输入层、隐藏层和输出层,三层指的是三类而不是三个,其中输入层与输出层只有一层,而隐藏层则可以是多层的。每一层都有一定数量的神经元,不同层之间的神经元用线连接起来,每条线都有一定的权重,除了权重,没层还可能会有对应的偏置。

BP神经网络的学习过程由信号的正向传播和误差的反向传播两个过程组成。正向传播时,输入样本由输入层传入,经过隐藏层处理后,传入输出层,输出层计算输出预测的结果,正向传播过程到此结束。当预测的结果与期望存在误差时,则会将误差进行反向传播,通过计算出的误差来反向依次调整隐藏层到输出层的权重和偏置、输入层到隐藏侧的权重和偏置。如此循环两个过程,直至满足停止条件,如权重的更新低于某个域值,预测的错误率低于某个域值,达到一定的迭代次数等。

 如图第一层为输入层,最后一层为输出层,第的2到l层都为隐藏层,图中只画了一层隐藏层。其中的+1,为偏置。x_{1}x_{2}...x_{n}为输入单个样本的输入。w_{ij}^{l}表示从第l-1层的第i个神经元指向第l层的第j个神经元的线的权重。b_{j}^{l}表示第l层第j个神经元的偏置。z_{j}^{l}表示第l-1层神经元到第l层的第j个神经元的加权和。a_{j}^{l}表示第l层的第j个神经元的加权和z_{j}^{l}经过激活函数计算后得到该神经元的输出值。除了输入层,其他层的神经元都会有一个前一层神经元的加权和z做为激活函数的输入,然后得到输出a

1.正向传播

对于第l层的第j个神经元,它的输入z_{j}^{l}为:

z_{j}^{l}=(\sum_{i=1}^{n}w_{ij}^{l}a_{i}^{l-1} )+b_{j}^{l}

假设\phi为激活函数,则第l层的第j个神经元,它的输出a_{j}^{l}为:

a_{j}^{l}=\phi (z_{j}^{l})

而对于整个第l层权重矩阵w^{l}为:

w^{l}=\begin{bmatrix} w_{11}^{l} & w_{21}^{l} & \cdots & w_{n1}^{l} \\ w_{12}^{l} & w_{22}^{l} & \cdots & w_{n2}^{l} \\ \vdots & \vdots & \ddots &\vdots \\ w_{1j}^{l} & w_{2j}^{l} & \cdots & w_{nj}^{l} \end{bmatrix} ,  w^{l}\in \mathbb{R}^{j\times n}j为第l层神经元数量,n为第l-1层神经元数量。第n列即为第l-1层的第n个神经元到第l层各神经元的连线的权重。

l层偏置矩阵b^{l}为:

b^{l}=\begin{bmatrix} b_{1}^{l}\\ b_{2}^{l}\\ \vdots\\ b_{j}^{l} \end{bmatrix}

l层神经元的输入矩阵Z^{l}即为:

z^{l}=\begin{bmatrix} w_{11}^{l} & w_{21}^{l} & \cdots & w_{n1}^{l} \\ w_{12}^{l} & w_{22}^{l} & \cdots & w_{n2}^{l} \\ \vdots & \vdots & \ddots &\vdots \\ w_{1j}^{l} & w_{2j}^{l} & \cdots & w_{nj}^{l} \end{bmatrix} \cdot\begin{bmatrix} a_{1}^{l-1}\\ a_{2}^{l-1}\\ \vdots\\ a_{n}^{l-1} \end{bmatrix}+\begin{bmatrix} b_{1}^{l}\\ b_{2}^{l}\\ \vdots\\ b_{j}^{l} \end{bmatrix}=\begin{bmatrix} w_{11}^{l}a_{1}^{l-1}+w_{21}^{l}a_{2}^{l-1}+\cdots+w_{n1}^{l}a_{n}^{l-1}+b_{1}^{l}\\ w_{12}^{l}a_{1}^{l-1}+w_{22}^{l}a_{2}^{l-1}+\cdots+w_{n2}^{l}a_{n}^{l-1}+b_{2}^{l}\\ \vdots\\ w_{1j}^{l}a_{1}^{l-1}+w_{2j}^{l}a_{2}^{l-1}+\cdots+w_{nj}^{l}a_{n}^{l-1}+b_{j}^{l} \end{bmatrix}

l层的输出矩阵a^{l}即可表示为:

a^{l}=\phi (z^{l})=\phi (w^{l}a^{l-1}+b^{l})

若是多个样本,则a^{l}z^{l}为多列,每一列代表一个样本。

l为2时,a^{1}=x,即样本的值。

2.反向传播

对于单个样本(x^{m},y^{m}),假设样本正向传播的输出\widehat{y}^{m}为:

\widehat{y}^{m}=\begin{bmatrix} \widehat{y}_{1}^{m}\\ \widehat{y}_{2}^{m}\\ \vdots\\ \widehat{y}_{k}^{m} \end{bmatrix}=a^{l+1}=\phi (z^{l+1})

定义单个样本的误差L^{m}为:

L^{m}=L(\widehat{y}^{m}-y^{m})

其中L是损失函数,具体是什么根据需要选择,如平方损失函数、交叉熵损失函数等。

反向传播的目的为了让L^{m}的值尽可能的小。而对于一个样本输出值\widehat{y}^{m}是由输出层的输入z^{l+1}决定的,而z^{l+1}则是受隐藏层到输出层的神经元的线权重w^{l+1}和偏置b^{l+1}影响的。所以通过调整权重w^{l+1}和偏置b^{l+1}就可以先影响输出层的输入z^{l+1},再影响到输出\widehat{y}^{m},最后影响到L^{m}。由于梯度表示函数在某一点处沿着梯度的方向增长最快,沿着梯度的方向可以取得函数的最大值。而我们要求的是函数的最小值,所以要沿着与梯度相反的方向调整参数来最小化L^{m}。问题就转化为了对误差函数L^{m}wb的偏导。

根据链式法则,对于单个样本m从隐藏层l层第j个神经元到输出层(l+1层)第k个神经元的线权重w_{jk}^{l+1}的偏导\bigtriangledown_{w_{jk}^{l+1}}为:

\bigtriangledown_{w_{jk}^{l+1}}=\frac{\partial L_{k}^{m}}{\partial\widehat{y}_{k}^{m}}\cdot\frac{\partial\widehat{y}_{k}^{m}}{\partial z_{k}^{l+1}}\cdot\frac{\partial z_{k}^{l+1}}{\partial w_{jk}^{l+1}}={L}'(\widehat{y}_{k}^{m})\cdot{\phi }'(z_{k}^{l+1})\cdot a_{j}^{l}

同理偏置b_{k}^{l+1}的偏导\triangledown b_{k}^{l+1}为:

\bigtriangledown_{b_{k}^{l+1}}=\frac{\partial L_{k}^{m}}{\partial\widehat{y}_{k}^{m}}\cdot\frac{\partial\widehat{y}_{k}^{m}}{\partial z_{k}^{l+1}}\cdot\frac{\partial z_{k}^{l+1}}{\partial b_{k}^{l+1}}={L}'(\widehat{y}_{k}^{m})\cdot{\phi }'(z_{k}^{l+1})\cdot 1={L}'(\widehat{y}_{k}^{m})\cdot{\phi }'(z_{k}^{l+1})

由此整个隐藏层l层到输出层的神经元的偏置矩阵的偏导\triangledown b^{l+1}为:

\bigtriangledown b^{l+1}=\bigtriangledown _{a^{l+1}}L\odot {\phi}'(z^{l+1})

线权重矩阵的偏导\bigtriangledown_{w^{l+1}}为:

\bigtriangledown w^{l+1}=\bigtriangledown b^{l+1}{a^{l}}^{T}

若是多个样本, 则a^{l+1}a^{l}z^{l}为多列,每一列代表一个样本。

 

对于单个样本m从隐藏l-1层第n个神经元到隐藏层l层第j个神经元的线权重w_{nj}^{l}的偏导\bigtriangledown w_{nj}^{l}为:

\bigtriangledown w_{nj}^{l}=\frac{\partial a_{j}^{l}}{\partial z_{j}^{l}}\cdot\frac{\partial z_{j}^{l}}{\partial w_{nj}^{l}}={\phi }'(z_{j}^{l})\cdot a_{n}^{l-1}

偏置b_{j}^{l}的偏导\triangledown b_{j}^{l}为:

\triangledown b_{j}^{l}= \frac{\partial a_{j}^{l}}{\partial z_{j}^{l}}\cdot \frac{\partial z_{j}^{l}}{\partial b_{j}^{l}}= \frac{\partial a_{j}^{l}}{\partial z_{j}^{l}}\cdot 1={\phi}'(z_{j}^{l})

由此整个隐藏层l-1层到隐藏层l层的偏置矩阵的偏导\triangledown b^{l}为:

\triangledown b^{l}={\phi}'(z^{l})

线权重矩阵的偏导\bigtriangledown w^{l}为:

\bigtriangledown w^{l}=\triangledown b^{l}\cdot {a^{l-1}}^{T}

若是多个样本, 则 z^{l}a^{l-1}为多列,每一列代表一个样本。当l为2时,a^{1}=x,即样本的值,此时\bigtriangledown w^{l}即为输入层到隐藏层的线权重矩阵的偏导。

设学习率为\mu,则权重矩阵与偏置矩阵的更新公式为:

w^{l}=w^{l}-\mu \triangledown w^{l}

b^{l}=b^{l}-\mu \triangledown b^{l}

如此从输出层到输入层的一次反向传播就完成了对权重与偏置的更新。然后重复上面的两个过程直至达到迭代终止条件,如权重的更新量低于某个域值,预测值的误差低于某个域值、达到最大迭代次数等。

公式中的\bigtriangledown _{a^{l+1}}L{\phi}'(z^{l})要根据具体选择的函数展开求导,如损失函数L常见的有平方损失函数、交叉熵损失函数等。激活函数\phi常见的有Sigmoid、Tanh、ReLU等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值