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

前面讲了神经网络的前向传播算法,下面再对反向传播算法进行总结。

反向传播算法也称为误差逆传播(error BackPropagation),是指基于梯度下降对神经网络的损失函数进行迭代优化求极小值的过程,它不仅可应用于前馈神经网络,还可以用于其他类型的神经网络。需要注意的是,大家提及到的“BP网络”,通常是指用BP算法训练的前馈神经网络。

神经网络反向传播工作原理

首先,定义神经网络的损失函数。神经网络的损失函数有很多,这里采用平方误差来度量。对于单个样品输出层的参数,损失函数可表示为:

$J(W, b, x,y)=\frac{1}{2}||h_{(W,b)}(x)-y||^2=\frac{1}{2}||a^{({nl})}-y||^2=\frac{1}{2}||f(z^{(nl)})-y||^2=\frac{1}{2}||f(W^{({nl}-1)}a^{({nl}-1)}+b^{({nl}-1)})-y||^2$ 其中,$L_{nl}$表示输出层

假设我们有m个样品,则总体的损失函数为:

$J(W, b)=\frac{1}{m}||\sum \limits_{i=1}^{m} J(W, b, x^{(i)},y^{(i)})||^2 + \frac{\lambda}{2}||W^{(nl-1)}||_2=\frac {1}{2m}\sum \limits_{i=1}^{m}||h_{(W,b)}(x^{(i)})-y^{(i)}||^2+ \frac{\lambda}{2}||W^{(nl-1)}||_2 $     公式1-1,其中,第二项为应用于参数$W$的正则项

接下来,求参数$W$和$b$,使上述损失函数取极小值。分别对$W$和$b$求偏导就可以啦!

$\frac{\partial J(W,b)}{\partial W^{(nl-1)}}=\frac{1}{m}\sum \limits_{i=1}^{m}(a^{(nl)}-y)⋅f'(z^{(nl)})a^{(nl-1)}+\lambda W^{(nl-1)}$    公式1-2

$\frac{\partial J(W,b)}{\partial b^{(nl-1)}}=\frac{1}{m}\sum \limits_{i=1}^{m}(a^{(nl)}-y)⋅f'(z^{(nl)})$      公式1-3

从上面两个偏导数公式中,可看到求参数$W$和$b$时,均需要求解$\frac{\partial J(W,b)}{\partial z^{(nl)}}=(a^{(nl)}-y)f'(z^{(nl)})$。

对于输出层$L_{nl}$,我们可以令$\delta ^{(nl)}=(a^{(nl)}-y)⋅f'(z^{(nl)})$

对于$l=nl−1,nl−2,nl−3,…,2$,则$\delta ^{(l)}=\frac{\partial J(W,b)}{\partial z^{(l)}}=\frac{\partial J(W,b)}{\partial z^{(nl)}}\frac{\partial z^{(nl)}}{\partial z^{(nl-1)}}...\frac{\partial z^{(l+1)}}{\partial z^{(l)}}=(W^{(l)})^T\delta ^{(l+1)}⋅f'(z^{(l)})$       公式1-4

$W^{(l-1)}$和$b^{(l-1)}$的梯度分别为:

$\frac{\partial J(W,b,x,y)}{\partial W^{(l-1)}}=\frac{\partial J(W,b,x,y)}{\partial z^{(l)}} \frac{\partial z^{(l)}}{\partial W^{(l-1)}}=\delta ^{(l)}(\alpha ^{(l-1)})^T$  公式1-5

$\frac{\partial J(W,b,x,y)}{\partial b^{(l-1)}}=\frac{\partial J(W,b,x,y)}{\partial z^{(l)}} \frac{\partial z^{(l)}}{\partial b^{(l-1)}}=\delta ^{(l)}$       公式1-6

将公式1-4、1-5和1-6结合起来,就可以求出来每层的参数$W$和$b$啦!

将反向传播算法的矩阵形式进行总结如下:

1. 执行前馈传递,分别计算$L_1$、$L_2$层一直到输出层$L_{nl}$的输出$a^{(l)}=f(z^{(l)})=f(W^{(l-1)}a^{(l-1)}+b^{(l-1)})$;

2. 对于输出层$L_{nl}$,令$\delta ^{(nl)}=(a^{(nl)}-y)⋅f'(z^{(nl)})$;

3. 对于$l=nl−1,nl−2,nl−3,…,2$,令$\delta ^{(l)}=(W^{(l)})^T\delta ^{(l+1)}⋅f'(z^{(l)})$

4. 对$W$和$b$求偏导,一次梯度下降迭代更新参数$W$,$b$为:

$W^{(l-1)}=W^{(l-1)}-\alpha \frac {\partial J(W,b,x,y)}{\partial W^{(l)}}=W^{(l-1)}-\alpha \delta ^{(l)}(\alpha ^{(l-1)})^T$

$b^{(l-1)}=b^{(l-1)}-\alpha \frac {\partial J(W,b,x,y)}{\partial b^{(l-1)}}=b^{(l-1)}-\alpha \delta ^{(l)}$

反向传播算法具体步骤

1)初始化各隐藏层与输出层的权重$w$和偏倚量$b$为接近0的随机值(设置的起始值不能完全相等);

2)for 样品$i = 1$ to $m$,

a.首先执行前馈传播,分别计算$L_2$层一直到输出层$L_{nl}$的输出$a^{(i,l)}=f(z^{(i,l)})=f(W^{(i,l-1)}a^{(i,l-1)}+b^{(i,l-1)})$

b.通过损失函数计算输出层$\delta ^{(i,nl)}$

c.对于$l=nl−1,nl−2,nl−3,…,2$,使用反向传播算法计算$\delta ^{(i,l)}=(W^{(i,l)})^T\delta ^{(i,l+1)}⋅f'(z^{(i,l)})$

3)分别对每一层的$W$和$b$进行更新迭代

4)如果所有的$W$和$b$均小于阈值,停止迭代,并输出$L_2$层一直到输出层$L_{nl}$对应的参数$W$和$b$

参考资料

1. Neural Networks and Deep Learning by By Michael Nielsen

2. 刘建平Pinard博客https://www.cnblogs.com/pinard/p/6422831.html 

3. 周志华《西瓜书》

4. UFLDL Tutorial

posted @ 2023-06-11 22:15  yayagogogo  阅读(93)  评论(0编辑  收藏  举报