几分钟弄明白 BP 反向传播算法

今天有朋友咨询我反向传播算法,我觉得不需要太复杂的推导,就可以解释清楚这个算法的原理。

假定神经网络采用下面的结构:
在这里插入图片描述

1. 最简单的神经网络模型

我们考虑最简单的情况:一个输入节点、一个输出节点、一个训练样本,网络结构如下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200217205704253.png

2. 损失函数

为了简化分析,我们假定只有一个训练样本 ( x , y ) (x,y) 。于是,损失函数简化为下面的形式:
E = 1 2 ( y a 5 ) 2 (3) \tag3 E = \frac12(y - a_5)^2
其中, ( x , y ) (x,y) 是训练样本、 a 1 = x a_1=x w i w_i 的初始值随机赋予,而 a 5 a_5 是网络模型输出的结果,在训练样本固定的条件下,它的值取决于权重系数 w i w_i ,通过调整权重系数,我们可以减少 a 5 a_5 与训练样本中的结果 y y 之间的差距。

3. 梯度计算

模型中的权重系数 w 2 , w 3 , w 4 , w 5 w_2,w_3,w_4,w_5 的变化影响损失函数的结果,为了利用梯度下降法使得这组权重参数从随机给出的初始值,逐步逼近到最优位置,需要求它们的偏导数。

w 5 w_5 里输出节点最近,因此求它的偏导数是最简单的,我们先进行计算。然后再依次计算前面的几个权重系数的偏导数。

注意下面这组计算非常有规律:
E w 5 = ( y a 5 ) a 5 w 5   E w 4 = ( y a 5 ) a 5 w 4   E w 3 = ( y a 5 ) a 5 w 3   E w 2 = ( y a 5 ) a 5 w 2 (4) \tag4 \frac{\partial E}{\partial w_5} = -(y-a_5)\frac{\partial a_5}{\partial w_5}\\ ~\\ \frac{\partial E}{\partial w_4} = -(y-a_5)\frac{\partial a_5}{\partial w_4}\\ ~\\ \frac{\partial E}{\partial w_3} = -(y-a_5)\frac{\partial a_5}{\partial w_3}\\ ~\\ \frac{\partial E}{\partial w_2} = -(y-a_5)\frac{\partial a_5}{\partial w_2}

4. 反向传播算法

既然越往前计算,算式越长,那么,能否借助 w i w_{i} 的计算结果增量式地计算 w i 1 w_{i-1} 的结果呢?

其实,这比较有意思。看看下面的计算过程,后面的计算,总是可以借助前面的计算结果,这样可以大大减少计算量:
a 5 w 5 = a 5 z 5 z 5 w 5 (5) \tag5 \frac{\partial a_5}{\partial w_5}={\bf\frac{\partial a_5}{\partial z_5}}\frac{\partial z_5}{\partial w_5}
a 5 w 4 = a 5 z 5 z 5 w 4 (6) \tag6 \frac{\partial a_5}{\partial w_4}={\bf\frac{\partial a_5}{\partial z_5}}\frac{\partial z_5} {\partial w_4}
注意(5)、(6)两个计算式中,粗体字部分是完全相同的计算。权重的位置越靠前,重合的部分就越多,再看看下面这两个式子:
a 5 w 3 = a 5 z 3 z 3 w 3 (7) \tag7 \frac{\partial a_5}{\partial w_3}={\bf\frac{\partial a_5}{\partial z_3}}\frac{{\partial z_3}}{\partial w_3}
a 5 w 2 = a 5 z 3 z 3 w 2 (8) \tag8 \frac{\partial a_5}{\partial w_2}={\bf\frac{\partial a_5}{\partial z_3}}\frac{{\partial z_3}}{\partial w_2}
计算式中的粗体字部分是相同的,为了简化起见,粗体字部分计算式没展开。展开后,就是下面(9)、(10) 式的情况。注意(10)式的第一个括号部分的内容,是复用的(9)式内容,第二个括号部分的内容,是增量部分,可以用于下一个算式的计算。

实际上,从(5)式开始,后面的计算式都可以在前面的基础上,增量式地补充一部分内容就可以了,大大提高了计算效率。这个计算方法称为反向传播算法

a 5 w 3 = ( a 5 z 5 z 5 a 4 a 4 z 3 ) z 3 w 3 (9) \tag9 \frac{\partial a_5}{\partial w_3}={\bf(\frac{\partial a_5}{\partial z_5}\frac{\partial z_5}{\partial a_4}\frac{\partial a_4}{\partial z_3})}\frac{\partial z_3}{\partial w_3}
a 5 w 2 = ( a 5 z 5 z 5 a 4 a 4 z 3 ) ( z 3 a 2 a 3 z 2 ) z 2 w 2 (10) \tag{10} \frac{\partial a_5}{\partial w_2}={\bf(\frac{\partial a_5}{\partial z_5}\frac{\partial z_5}{\partial a_4}\frac{\partial a_4}{\partial z_3})}(\frac{{\partial z_3}}{\partial a_2}\frac{{\partial a_3}}{\partial z_2})\frac{{\partial z_2}}{\partial w_2}

这里举的例子太简单了,对于多个输入、多个输出、多个中间层的一般性网络模型,反向传播算法是否奏效呢?这个问题我们另行讨论。下一篇文章我计划讨论的问题是:反向传播算必须基于神经网络模型吗?

发布了174 篇原创文章 · 获赞 80 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/quicmous/article/details/104354865
今日推荐