美文网首页
手撕反向传播算法

手撕反向传播算法

作者: 葛城巧 | 来源:发表于2018-08-31 22:11 被阅读0次

最近找工作需要,因此看看梯度下降法和反向传播算法,顺手来个手撕笔记。

首先来个图:

图1. 简单的神经网络

好吧,定义一下这个图
其中:

  • a_{j}^{l}表示第l层第j个输出
  • z_{j}^{l}表示第l层第j个输入
  • z_{j}^{l}a_{j}^{l}中间的竖线表示激活函数,用\sigma(z)来表示
  • w_{jk}^{l}表示第l层第j个神经元与l-1层第k个神经元的权重
  • b_{j}^{l}表示第l层第j个神经元的偏置
  • 1表示的当然是数字1

前向传播

有了以上定义后,可以描述前向传递过程。前向传播公式描述:
z_{j}^{l+1}=\Sigma_{k}w_{jk}^{l+1}a_{k}^{l}+b_{j}^{l+1}

a_{j}^{l+1}=\sigma(z_{j}^{l+1})
这个公式应该特别好理解,直观意义就是上一层的每个输出乘以对应权重得到下一层输入,然后由激活函数进行非线性变换,得到下一层的输出。前向传播过程如图2所示:

图2. 前向传播过程

反向传播

前向传播的过程比较简单,一般难的是在后面反向传播和梯度更新的部分。
1. 输出层的梯度更新过程
首先看输出层的传播过程,图3展示了输出层的传播过程:

图3. 输出层的反向传播
定义:
图4. 任意层的反向传播

现在来看任意第l层的情况,假设第l层就和输出层相连,如图4的情况,首先来求\delta_{j}^{l},简化来看,输出层就两个神经元,于是有:

\delta_{j}^{l}=(\frac{\partial{C}}{\partial{c_j}}\frac{\mathrm{d}{c_j}}{\mathrm{d}{a_j^{l+1}}}\sigma'(z_j^{l+1})\frac{\partial{z_j^{l+1}}}{\partial{a_{j}^{l}}}+\frac{\partial{C}}{\partial{c_{j+1}}}\frac{\mathrm{d}{c_{j+1}}}{\mathrm{d}{a_{j+1}^{l+1}}}\sigma'(z_{j+1}^{l+1})\frac{\partial{z_{j+1}^{l+1}}}{\partial{a_{j}^{l}}})\sigma'(z_{j}^{l})
实际上,折腾一大圈,这个不就是总代价Cz_{j}^{l}就梯度吗?
即:
\delta_{j}^{l}=\frac{\partial{C}}{\partial{z_{j}^{l}}}
好吧,这是两个神经元的情况,那如果是多个神经元咋办?其实你观察下那条很长的式子就可以得到:
\delta_{j}^{l}=\sigma'(z_{j}^{l})\Sigma_{j}(\frac{\partial{C}}{\partial{c_j}}\frac{\mathrm{d}{c_j}}{\mathrm{d}{a_j^{l+1}}}\sigma'(z_j^{l+1})\frac{\partial{z_j^{l+1}}}{\partial{a_{j}^{l}}})
这还是一个套路嘛,即还是:
\delta_{j}^{l}=\frac{\partial{C}}{\partial{z_{j}^{l}}}
既然第l层的误差都有了,权重和偏置的梯度是不是就有了?
\frac{\partial{C}}{\partial{w_{jk}^l}}=\delta_{j}^{l}\frac{\partial{z_j^l}}{\partial{w_{jk}^l}}=\delta_{j}^{l}a_{j}^{l-1}
同样地:
\frac{\partial{C}}{\partial{b_{j}^l}}=\delta_{j}^{l}\frac{\partial{z_j^l}}{\partial{b_{j}^l}}=\delta_{j}^{l}
有人会觉得这是因为第l层和输出层就隔着,所以才能得到这样的结论,其实不管第l层在哪,这个结论都是一样的,读者可以自行验证啦。

权重更新同样用梯度下降法更新即可:
w^+=w-\eta\frac{\partial{C}}{\partial{w_{jk}^l}}

b^+=b-\eta\frac{\partial{C}}{\partial{b_{j}^l}}
3. 误差传递的层间关系
先整理一下上面重要的式子
反向传递到任意层任意一个神经元的误差公式:
\delta_{j}^{l}=\frac{\partial{C}}{\partial{z_{j}^{l}}}
损失函数对任意一个权重和偏置的梯度:
\frac{\partial{C}}{\partial{w_{jk}^l}}=\delta_{j}^{l}a_{j}^{l-1}

\frac{\partial{C}}{\partial{b_{j}^l}}=\delta_{j}^{l}
有人就会想,第l层的误差得一层层从后往前求梯度,这么麻烦,如果我知道l+1层的误差的话,是否会容易些呢?于是便来探讨\delta_{j}^{l}\delta_{j}^{l+1}之间的关系。
首先要引入l+1层:
\delta_{j}^{l}=\frac{\partial{C}}{\partial{z_{j}^{l}}}=\Sigma_{k}\frac{\partial{C}}{\partial{z_{k}^{l+1}}}\frac{\partial{z_{k}^{l+1}}}{\partial{z_{j}^{l}}}=\Sigma_{k}\delta_{k}^{l+1}\frac{\partial{z_{k}^{l+1}}}{\partial{z_{j}^{l}}}
注意:
z_{k}^{l+1}=\Sigma_{j}w_{kj}^{l+1}a_{j}^{l}+b_k^{l+1}=\Sigma_{j}w_{kj}^{l+1}\sigma(z_{j}^{l})+b_k^{l+1}
因此:
\frac{\partial{z_{k}^{l+1}}}{\partial{z_{j}^{l}}}=w_{kj}^{l+1}\sigma'(z_{j}^{l})
故误差传播的层间关系式为:
\delta_{j}^{l}=\sigma'(z_{j}^{l})\Sigma_{k}\delta_{k}^{l+1}w_{kj}^{l+1}
必须注意的是,这里是w_{kj}^{l+1}而不是w_{jk}^{l+1},如果不清楚的话看看图4或者自己画个图看看就明白了。
所以最后的式子便是误差传播的层间关系式,整理前面3个式子以及层间关系式,便可以得到描述反向传播的4个重要式子,也就图5的4个式子:

图5. 反向传播重要公式

到这里,反向传播算法基本就结束了。如果有写的不好,不对的地方请猛喷!哈哈哈!

参考文献:
  1. https://blog.csdn.net/mao_xiao_feng/article/details/53048213
  2. https://www.jianshu.com/p/964345dddb70
  3. https://blog.csdn.net/xierhacker/article/details/53431207

相关文章

  • 手撕反向传播算法

    最近找工作需要,因此看看梯度下降法和反向传播算法,顺手来个手撕笔记。 首先来个图: 好吧,定义一下这个图其中: 表...

  • 手推CNN,DNN算法流程和反向传播

    DNN 反向传播 DNN算法流程 卷积层反向传播 池化层反向传播 C NN算法流程

  • 神经网络之反向传播(BP)算法代码实现

    反向传播算法实战 本次的反向传播算法是基于上篇文章神经网络之反向传播算法(BP)详细公式推导实现的,如果对反向传播...

  • TensorFlow系列专题(五):BP算法原理

    一.反向传播算法 反向传播算法[1](Backpropagation Algorithm,简称BP算法)是深度学习...

  • 神经网络的反向传播算法

    1. 前言 本文为学习反向传播算法时的总结。 2. 反向传播算法 2.1 示例及初始数据 举例说明反向传播算法的计...

  • task1

    线性回归 反向传播算法 什么叫反向传播,有没有直观理解? 如何直观地解释 backpropagation 算法? ...

  • 反向传播算法之要点(Backpropagation)

    反向传播算法之要点(Backpropagation Algorithm) Introduction 反向传播是一个...

  • 神经网络之反向传播算法(BP)详细公式推导

    反向传播算法详细推导 反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种...

  • 2反向传播

    正向传播算法要初始化赋值,反向传播算法更新权重w。参考文档:一文弄懂神经网络中的反向传播法

  • BP算法

    BP算法:误差反向传播算法。通过比较输出值与标记值,将误差反向由输出层向输入层传播,利用梯度下降算法进行参数调整。...

网友评论

      本文标题:手撕反向传播算法

      本文链接:https://www.haomeiwen.com/subject/lrcewftx.html