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


 适合不熟悉矩阵求导的人,我会尽量用数学公式和图解的方式来详细地推导BP算法。

在这里插入图片描述

标记规定

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

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

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

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

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

公式三(权重θ的梯度)

 BP算法的最终目的便是要求出来权重的梯度以便于更新权重,所以接下来我们看看权重的梯度是如何计算的。
 同样先是看看在标量之下如何计算:
δ C δ θ j k l = δ C δ z j l + 1 × δ z j l + 1 δ θ j k l = δ j l + 1 × a k l \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 δθjklδC=δzjl+1δC×δθjklδzjl+1=δjl+1×akl
 然后用矩阵进行表示,还是先看一张图,注意:这里右边那个是θ梯度矩阵,不是θ的矩阵(主要是博主比较懒,不想画了):
在这里插入图片描述
以上就是BP算法的推导,如果熟悉矩阵求导的话就可以跳过那些图片啦,博主主要是想用一种更直观的方式来介绍BP算法。当然还有偏置bias的求导,大家可以自己这样推一推。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值