看了很多BP的推导,都不够简洁直观,这里总结一下。多层Perceptron就是全连接的网络,定义第l层的输入为x(l)x^{(l)}x(l),那么全连接的线性输出z(l)=W(l)x(l)+b(l)z^{(l)}=W^{(l)}x^{(l)}+b^{(l)}z(l)=W(l)x(l)+b(l)

上面的(l)都表示第l层,如果到了第l+1层,当然要过一个激活函数f,那么
z(l+1)=W(l+1)x(l+1)+b(l+1)z^{(l+1)}=W^{(l+1)}x^{(l+1)}+b^{(l+1)}z(l+1)=W(l+1)x(l+1)+b(l+1)

如果把上面这个公式展开,考虑到x(l+1)x^{(l+1)}x(l+1)和z(l)z^{(l)}z(l)的关系,那就变成了
zj(l+1)=∑iWji(l+1)f(zi(l))+bj(l+1)z_j^{(l+1)}=\sum_iW_{ji}^{(l+1)}f(z_i^{(l)})+b_j^{(l+1)} zj(l+1)​=i∑​Wji(l+1)​f(zi(l)​)+bj(l+1)​

假设第l+1层就输出了,那么整理代价函数就是
J(W,b)=L[f(z(l+1)),y]+Ω(W)J(W,b)=L[f(z^{(l+1)}),y] + \Omega(W)J(W,b)=L[f(z(l+1)),y]+Ω(W)

Back Propagation就是想求每一层每个节点(第i层)的两个偏导∂J(W,b)∂W(i)\frac{\partial J(W,b)}{\partial W^{(i)}}∂W(i)∂J(W,b)​和∂J(W,b)∂b(i)\frac{\partial J(W,b)}{\partial b^{(i)}}∂b(i)∂J(W,b)​,好证明参数可以传递,不至于传着传着没货了,下面求导开始前,把刚才不严谨的公式画的更清楚一些,还是假设第l+1层后过了激活函数f就去算Loss了,同时定义第l层有SlS_lSl​个节点,第l+1层有Sl+1S_{l+1}Sl+1​个节点,对于第l层的第i个节点和loss J(W,b)J(W,b)J(W,b)可以得到如下图里的关系:

接下来开始求针对第l层参数的偏导,其中zi(l+1)z_i^{(l+1)}zi(l+1)​表示第l+1层的第i个节点的线性输出,Wij(l+1)W_{ij}^{(l+1)}Wij(l+1)​表示第l+1层第i个节点从前一层第j个节点过sigmoid后乘以的参数:
∂J(W,b)∂Wij(l+1)=∂J(W,b)∂zi(l+1)∂zi(l+1)∂Wij(l+1)=∂J(W,b)∂zi(l+1)xi(l+1)\frac{\partial J(W,b)}{\partial W_{ij}^{(l+1)}}=\frac{\partial J(W,b)}{\partial z_i^{(l+1)}}\frac{\partial z_i^{(l+1)}}{\partial W_{ij}^{(l+1)}} \\ = \frac{\partial J(W,b)}{\partial z_i^{(l+1)}} x_i^{(l+1)} ∂Wij(l+1)​∂J(W,b)​=∂zi(l+1)​∂J(W,b)​∂Wij(l+1)​∂zi(l+1)​​=∂zi(l+1)​∂J(W,b)​xi(l+1)​

∂J(W,b)∂zi(l+1)\frac{\partial J(W,b)}{\partial z_i^{(l+1)}}∂zi(l+1)​∂J(W,b)​和J的具体表达式有关系,所以定义
δil+1=∂J(W,b)∂zi(l+1)\delta_i^{l+1}=\frac{\partial J(W,b)}{\partial z_i^{(l+1)}}δil+1​=∂zi(l+1)​∂J(W,b)​

那么
∂J(W,b)∂Wij(l+1)=∂J(W,b)∂zi(l+1)∂zi(l+1)∂Wij(l+1)=δil+1xi(l+1)\frac{\partial J(W,b)}{\partial W_{ij}^{(l+1)}}=\frac{\partial J(W,b)}{\partial z_i^{(l+1)}}\frac{\partial z_i^{(l+1)}}{\partial W_{ij}^{(l+1)}} \\ = \delta_i^{l+1} x_i^{(l+1)} ∂Wij(l+1)​∂J(W,b)​=∂zi(l+1)​∂J(W,b)​∂Wij(l+1)​∂zi(l+1)​​=δil+1​xi(l+1)​

∂J(W,b)∂bi(l+1)=∂J(W,b)∂zi(l+1)∂zi(l+1)∂b(l+1)=δil+1\frac{\partial J(W,b)}{\partial b_i^{(l+1)}}=\frac{\partial J(W,b)}{\partial z_i^{(l+1)}}\frac{\partial z_i^{(l+1)}}{\partial b^{(l+1)}} \\ = \delta_i^{l+1} ∂bi(l+1)​∂J(W,b)​=∂zi(l+1)​∂J(W,b)​∂b(l+1)∂zi(l+1)​​=δil+1​
有了这俩,还想知道再向前一层是啥,比如针对W的:
∂J(W,b)∂Wij(l)=∂J(W,b)∂zi(l)∂zi(l)∂Wij(l)=δilxi(l)\frac{\partial J(W,b)}{\partial W_{ij}^{(l)}}=\frac{\partial J(W,b)}{\partial z_i^{(l)}}\frac{\partial z_i^{(l)}}{\partial W_{ij}^{(l)}} \\ = \delta_i^{l} x_i^{(l)} ∂Wij(l)​∂J(W,b)​=∂zi(l)​∂J(W,b)​∂Wij(l)​∂zi(l)​​=δil​xi(l)​
剩下的焦点问题就是δi(l)\delta_i^{(l)}δi(l)​怎么求了,刚才那个图就用上了,这东西可以看成损失函数在第l层第i个节点产生的残差量,刚才那个图一目了然:
δi(l)=∂J(W,b)∂zi(l)=∑j=1Sl+1[∂J(W,b)∂zj(l+1)∂zj(l+1)∂zi(l)]=∑j=1Sl+1[δj(l+1)Wji(l+1)f′(zi(l))]\delta_i^{(l)}=\frac{\partial J(W,b)}{\partial z_i^{(l)}} \\ =\sum_{j=1}^{S_{l+1}}[\frac{\partial J(W,b)}{\partial z_j^{(l+1)}}\frac{\partial z_j^{(l+1)}}{\partial z_i^{(l)}}] \\ =\sum_{j=1}^{S_{l+1}}[\delta_j^{(l+1)}W_{ji}^{(l+1)}f'(z_i^{(l)})] δi(l)​=∂zi(l)​∂J(W,b)​=j=1∑Sl+1​​[∂zj(l+1)​∂J(W,b)​∂zi(l)​∂zj(l+1)​​]=j=1∑Sl+1​​[δj(l+1)​Wji(l+1)​f′(zi(l)​)]

δi(l)\delta_i^{(l)}δi(l)​就是整个BP的精髓,说明了参数可以传递,其实就是递推表达式。后面补充几个很重要的问题:

  1. 可以看到δi(l)\delta_i^{(l)}δi(l)​再展开一层会带来一堆连乘,导致误差膨胀或者消失,ResNet的改进思路就是如此,把上一层的残差短接到下一层,收获了很好的效果

  2. 激活函数可以选sigmoid或者relu,最后L可以选平方误差损失或者交叉熵。一般来说平方损失函数输出为连续,交叉熵损失函数更适合二分类问题。但是注意平方损失函数最后一层不能含有Sigmoid或者softmax激活函数!!!原因就是假设用sigmoid,下面表达式中含有sigmoid的导数,这个值非常小,导致学习非常慢
    δil+1=∂J(W,b)∂zj(l+1)\delta_i^{l+1}=\frac{\partial J(W,b)}{\partial z_j^{(l+1)}} δil+1​=∂zj(l+1)​∂J(W,b)​
    写更加具体一些,如果二分类的话用MSE的话:
    J(W,b)=(σ(zj(l+1))−y)22∂J(W,b)∂zj(l+1)=(σ(zj(l+1))−y)σ(zj(l+1))(1−σ(zj(l+1)))J(W,b)=\frac{(\sigma(z_j^{(l+1)})-y)^2}{2}\\ \frac{\partial J(W,b)}{\partial z_j^{(l+1)}}=(\sigma(z_j^{(l+1)})-y)\sigma(z_j^{(l+1)})(1-\sigma(z_j^{(l+1)})) J(W,b)=2(σ(zj(l+1)​)−y)2​∂zj(l+1)​∂J(W,b)​=(σ(zj(l+1)​)−y)σ(zj(l+1)​)(1−σ(zj(l+1)​))
    但是如果是交叉熵的话,假设分为k类,k类中只有某一类为1,其他为0:
    J(W,b)=−∑k=1myklnσ(zj(l+1))∂J(W,b)∂zj(l+1)=yk(σ(zj(l+1)−1)J(W,b)=-\sum_{k=1}^my_kln\sigma(z_j^{(l+1)})\\ \frac{\partial J(W,b)}{\partial z_j^{(l+1)}}=y_k(\sigma(z_j^{(l+1)}-1)J(W,b)=−k=1∑m​yk​lnσ(zj(l+1)​)∂zj(l+1)​∂J(W,b)​=yk​(σ(zj(l+1)​−1)
    显然交叉熵下降会更快一些

  3. 最后写一下完整的J(W,b),用二元交叉熵损失函数来写吧:
    J(W,b)=L[f(z(l+1)),y]+Ω(W)=−1m∑i=1m[yilnoi+(1−yi)ln(1−oi))]+λ2∑l=1N−1∑i=1Sl∑j=1Sl+1(Wij(l))2J(W,b)=L[f(z^{(l+1)}),y] + \Omega(W) \\ = {{-\frac{1}{m}\sum_{i=1}^m[y_ilno_i+(1-y_i)ln(1-o_i))] }}+ \\ \frac{\lambda}{2}\sum_{l=1}^{N-1}\sum_{i=1}^{S_l}\sum_{j=1}^{S_{l+1}}(W_{ij}^{(l)})^2 J(W,b)=L[f(z(l+1)),y]+Ω(W)=−m1​i=1∑m​[yi​lnoi​+(1−yi​)ln(1−oi​))]+2λ​l=1∑N−1​i=1∑Sl​​j=1∑Sl+1​​(Wij(l)​)2

英文博客可以参考: http://neuralnetworksanddeeplearning.com/chap2.html

多层感知机Perceptron反向传播BP算法推导(Back Propagation)相关推荐

  1. 《基于eigen3多层感知机的反向传播算法实现》

    <基于eigen3多层感知机的反向传播算法实现> Deep learning 现在有四大范式 MLP.CNN.RNN.Attention,一般feature extractor会是CNN. ...

  2. 深度学习图像处理目标检测图像分割计算机视觉 04--神经网络与误差反向传播BP算法

    深度学习图像处理目标检测图像分割计算机视觉 04--神经网络与误差反向传播BP算法 摘要 一.神经元 二.前馈网络 2.1 Delta学习规则 2.2 目标函数J(w) 三.误差反向传播算法(BP算法 ...

  3. 神经网络——反向传播BP算法应用案例

    案例应用(一)--20个样本的两层(单隐藏层)神经网络 知识点: 1.tolist() 链接:http://blog.csdn.net/akagi_/article/details/76382918 ...

  4. 反向传播BP 算法之一种直观的解释

    0. 前言 之前上模式识别课程的时候,老师也讲过 MLP 的 BP 算法, 但是 ppt 过得太快,只有一个大概印象.后来课下自己也尝试看了一下 stanford deep learning 的 wi ...

  5. 神经网络反向传播BP算法举例说明

    0. 前言 上篇博客对BP算法的大致步骤进行了总结,本篇博客将通过一个具体的例子来模拟一下这个算法的实现过程 ! 1. BP算法例子说明 1.1 网络结构 1.2 权重及偏移 w = ( 0.1 , ...

  6. 反向传播BP思路梳理

    反向传播BP思路梳理 学了用了好多神经网络,我却一直没有搞明白神经网络里的反向传播BP是怎么回事.其实具体的公式推导网上有很多资料,都很详细,但是对于数学差劲的我来说每次得看半天才能懂个大概,而且过段 ...

  7. Back-Propagation Neural Network BP反向传播网络算法

    01 网络描述 BP网络由大量简单处理单元广泛互联而成,是一种对非线性函数进行权值训练的多层映射网络.具有优良的非线性映射能力,理论上它能够以任意精度逼近任意非线性函数.本文采用BP神经网络解决下列函 ...

  8. BP算法推导(python实现)

    这里默认了解前向传播,所以不在重述这块,如果对梯度下降有疑惑的,不知道原理的可以看我这篇博客 http://blog.csdn.net/sxf1061926959/article/details/66 ...

  9. 机器学习必刷题-手撕推导篇(2):BP算法推导

    本系列文章对常见的机器学习面试题进行了搜集.分类和整理,主要包括"手撕推导篇"."模型比较篇"."工程经验篇"以及"基础概念篇&q ...

最新文章

  1. 查看自己的Android studio 版本
  2. 【研究院】低调务实的网易人工智能,你熟悉吗?
  3. python 笔记 之 requests获取网络数据
  4. 无盘服务器怎么修改ip,怎么进入无盘服务器修改IP地址呢
  5. 基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档(上篇)
  6. 用Vue.js开发微信小程序:开源框架mpvue解析
  7. 这个大部分CNS都会用到的技术分析流程大放送......
  8. dlp型3d打印机_【论文新萃】光聚合成型3D打印技术复制印章研究
  9. 浅谈云网融合与SD-WAN
  10. shell与shell脚本
  11. Cocos2d-x v3.2笔记——总结Cocos2d-x 3.x版本的一些变化
  12. 【leetcode】数组的度-两个map关联初探
  13. 面向对象程序设计之封装性、继承性、多态性
  14. MySql卸载不干净怎么办?
  15. 变色龙引导启动看不到Mac分区盘符的解决办法
  16. Python解析xml文件详解
  17. OpenSSL之自签名证书认证
  18. java 代码块 构造函数_Java学习笔记之------构造函数,静态关键字,静态代码块,构造代...
  19. [MAE]Masked Autoencoders掩膜自编码器
  20. 【计算机硬件系统设计(华科)——存储器设计(Logisim 实现)】

热门文章

  1. css进阶:精灵图的使用、实现用精灵图拼出名字
  2. pid与计算机相关,计算机中的pid是什么意思
  3. 万国觉醒迁服务器显示该王国还未开放,万国觉醒无法迁城怎么办 王国迁城条件及详细步骤...
  4. 成功来源于勤奋的观点是相当错误的
  5. 佳能相机 C# 编程
  6. redis的ZIP下载
  7. 浅谈工厂和建造者模式
  8. 打开光伏广阔市场的钥匙何在?
  9. gulp 安装步骤 及实现雪碧图(例子)
  10. 兼容IE8实现页面添加水印