BP(反向传播)算法推导带图片详解


 我会尽量用数学公式和图解的方式来详细地推导BP算法。

BP(反向传播)算法推导带图片详解

标记规定

θjkl\mathop \theta \nolimits_{jk}^l:代表连接第l层第k个神经元和第l+1层第j个神经元的权重参数。
zjl\mathop z\nolimits_j^l: 代表第l层第j个神经元的输入。
ajl\mathop a\nolimits_j^l: 代表第l层第j个神经元的输出。
σ\sigma :代表**函数。
δjl\mathop \delta \nolimits_j^l :代表第l层第j个神经元产生的错误。
L:代表神经网络的层数(这里可以理解为3)。
c :代表代价函数(不太明白的话可以就直接理解为关于输出层a的函数)。
这里的规定标记不熟悉的话可以看一下吴恩达大佬的机器学习课程。

公式一(反向传播最后一层的错误)

 我们不采用向量的形式来推导,这里仅是涉及到标量的计算。
根据定义:δjl\mathop \delta \nolimits_j^l = δCδzjl\frac{{\delta {\rm{C}}}}{{\delta \mathop z\nolimits_j^l }}(学过微积分的同学肯定很好理解,这里的错误就是反应了这个神经元对代价函数的影响有多大)。
由链式法则可以得到:
δjL\mathop \delta \nolimits_j^L = δCδajL\frac{{\delta {\rm{C}}}}{{\delta \mathop a\nolimits_j^L }} * δajLδzjL\frac{{\delta {\rm{ \mathop a\nolimits_j^L}}}}{{\delta \mathop z\nolimits_j^L }}。这两个式子就很容易算出来,第一个在已知C的时候很容易就求出来了,第二个的话因为ajl\mathop a\nolimits_j^l = σ\sigma(zjL\mathop z\nolimits_j^L),所以也很容易求出来(但是这里特别要注意的是因为我们反向传播的时候是只是知道ajL\mathop a\nolimits_j^L的值,所以需要用ajL\mathop a\nolimits_j^L来计算σ\sigma '(zjL\mathop z\nolimits_j^L)的值)。
 然后,我们用向量的形式来计算:
δL\mathop \delta \nolimits^L = δCδaL\frac{{\delta {\rm{C}}}}{{\delta \mathop a\nolimits^L}} .* δaLδzL\frac{{\delta {\rm{ \mathop a\nolimits^L}}}}{{\delta \mathop z\nolimits^L }}。(这个.*就是对应元素相乘)。就这里的网络结构来看δL\mathop \delta \nolimits^L算出来就是一个2×1的向量。

公式二(每一层的误差计算)

 同样还是从标量的形式来看:
δjl\mathop \delta \nolimits_j^l = δCδzjl\frac{{\delta {\rm{C}}}}{{\delta \mathop z\nolimits_j^l }}(这里可以把l看做2)。则由链式法则可得:
δjl\mathop \delta \nolimits_j^l = kδCδzkl+1×δzkl+1δajl×δajlδzjl\sum\nolimits_k {\frac{{\delta C}}{{\delta \mathop z\nolimits_k^{l + 1} }}} {\rm{ \times }}\frac{{\delta \mathop z\nolimits_k^{l + 1} }}{{\delta \mathop a\nolimits_j^l }}{\rm{ \times }}\frac{{\delta \mathop a\nolimits_j^l }}{{\delta \mathop z\nolimits_j^l }}。我解释一下为什么要做这个k的累和,首先我们来看这样一张图(就是这里第一层映射到第二层的图):
BP(反向传播)算法推导带图片详解
从这个矩阵乘法就可以看出来每一个aj1\mathop a\nolimits_j^1zk2\mathop z\nolimits_k^2都有贡献,所以这里需要求和才能算出δjl\mathop \delta \nolimits_j^l
所以:
δjl\mathop \delta \nolimits_j^l = kδjl+1×θkjl×σ(zjl)\sum\nolimits_k{\mathop \delta \nolimits_j^{l+1}×\mathop \theta \nolimits_{kj}^l×\sigma'(\mathop z\nolimits_j^l)}
 然后我们再来看看矩阵形式的表示(如果熟悉矩阵求导的话就可以不用看了),同样还是先看一张图:
BP(反向传播)算法推导带图片详解
这个图就是刚刚向量方式计算出来的错误的矩阵计算形式,这里可以看出来θ是要转置的,于是我们便得出了δl\mathop \delta \nolimits^l 的矩阵表示形式。
δl\mathop \delta \nolimits^l = (θl.Tδl+1).σ(zjl)(\mathop \theta \nolimits^l.T * \mathop \delta \nolimits^{l+1}) .* \sigma'(\mathop z\nolimits_j^l)

公式三(权重θ的梯度)

 BP算法的最终目的便是要求出来权重的梯度以便于更新权重,所以接下来我们看看权重的梯度是如何计算的。
 同样先是看看在标量之下如何计算:
δCδθjkl=δCδzjl+1×δzjl+1δθjkl=δjl+1×akl\frac{{\delta C}}{{\delta \mathop \theta \nolimits_{jk}^l }}{\rm{ = }}\frac{{\delta {\rm{C}}}}{{\delta \mathop z\nolimits_j^{l + 1} }}{\rm{ \times }}\frac{{\delta \mathop z\nolimits_j^{l + 1} }}{{\delta \mathop \theta \nolimits_{jk}^l }} = \mathop \delta \nolimits_j^{l + 1} {\rm{ \times }}\mathop a\nolimits_k^l
 然后用矩阵进行表示,还是先看一张图,注意:这里右边那个是θ梯度矩阵,不是θ的矩阵(主要是博主比较懒,不想画了):
BP(反向传播)算法推导带图片详解
以上就是BP算法的推导,如果熟悉矩阵求导的话就可以跳过那些图片啦,博主主要是想用一种更直观的方式来介绍BP算法。当然还有偏置bias的求导,大家可以自己这样推一推。