最近在看神经网络中的前向传播算法(FP)和反向传播算法(BP),特地进行总结一下,方便以后理解。

1.基本概念

  上图是一张自己画的神经网络的图。假设每一层都添加了偏度单元(即值为1的神经元),用来表示阀值(因为阀值通常是一个常数)。

  上图中{x1,x2,x3}{x1,x2,x3}\{x_1,x_2,x_3\}表示输入(假设其中添加了偏度单元,后面不再重复),wij(k)wij(k)wij(k)表示联结权重,其中iii表示每次输入中的第i" role="presentation">iii个元素,jjj表示经过联结权重处理之后的输出中的第j" role="presentation">jjj个元素,kkk指明是第k" role="presentation">kkk层到第(k+1)(k+1)(k+1)层之间的联结权重。aijaija_{ij}表示经过联结权重处理后的输出,其中iii表示第i" role="presentation">iii层,j表示第jjj个输出;H(x)" role="presentation">H(x)H(x)H(x)表示激活函数,ZijZijZ_{ij}表示aijaija_ij经过激活函数处理之后的输出,即Zij=H(aij)Zij=H(aij)Z_{ij}=H(a_{ij})。{y1,y2,y3}{y1,y2,y3}\{y_1,y_2,y_3\}表示经过神经网络处理之后最终的输出。

  其中

aij=∑k=1Nwkj(i−1)z(i−1)kaij=∑k=1Nwkj(i−1)z(i−1)k

a_{ij}=\sum_{k=1}^Nw_{kj(i-1)}z_{(i-1)k}
其中 iii表示第i" role="presentation">iii层, jjj表示第j" role="presentation">jjj个元素, NNN表示总输入个数,z" role="presentation">zzz表示输入,对于输入层 {x1,x2,x3}{x1,x2,x3}\{x_1,x_2,x_3\}可以表示为 {z11,z12,z13}{z11,z12,z13}\{z_{11},z_{12},z_{13}\}。例如上图中有:
     a31=w11(2)∗z21+w21(2)∗z22+w31(2)∗z23a31=w11(2)∗z21+w21(2)∗z22+w31(2)∗z23a_{31}=w_{11}(2)*z_{21}+w_{21}(2)*z_{22}+w_{31}(2)*z_{23}

2.前向传播算法

  前向传播算法,顾名思义,是由前往后进行的一个算法。最开始,我们会初始化一组www的取值,并且选定一个激活函数,为了后面的方便,我们假设选定sigmoid" role="presentation">sigmoidsigmoidsigmoid函数作为函数,其函数形式为:

H(x)=ginmoid(x)=11+e−xH(x)=ginmoid(x)=11+e−x

H(x)=ginmoid(x)=\frac{1}{1+e^{-x}}
并且它的导数为 H′(x)=H(x)(1−H(x))H′(x)=H(x)(1−H(x))H^{\prime}(x)=H(x)(1-H(x))。

  有了联结权重www和激活函数H(x)" role="presentation">H(x)H(x)H(x)之后,就可以由前往后计算,依次算出所有的aaa值,z" role="presentation">zzz\;值,最终算出输出层的yyy值。这就是前向传播算法。

3.反向传播算法

  前面用初始化的联结权重计算的输出层值和实际值肯定会有很大的偏差,我们需要对连接权重进行优化,此时就需要使用反向传播算法。

  现在假设经过前向传播算法计算的某个输出值为yk" role="presentation">ykyky_k,表示输出层的第kkk个输出,而其实际的值为tk" role="presentation">tktkt_k(训练样本的标签值是已知的,不然怎么训练)。那么误差函数定义如下:

E=12∑k(yk−tk)2E=12∑k(yk−tk)2

E=\frac{1}{2}\sum_{k}(y_k-t_k)^2
后向传播算法是通过梯度下降的方法对联结权重进行优化,所以需要计算误差函数对联结权重的偏导数。

  对于和输出层直接关联的连接权重,即上图中的wij(3)wij(3)w_{ij}(3),简称为w(3)w(3)w(3),对其求偏导有:

∂E∂w(3)=∂E∂yk∗∂yk∂a4d∗∂a4d∂w(3)=(yk−tk)∗H′(a4d)∗z3∂E∂w(3)=∂E∂yk∗∂yk∂a4d∗∂a4d∂w(3)=(yk−tk)∗H′(a4d)∗z3

\frac{\partial E}{\partial w(3)}=\frac{\partial E}{\partial y_k}*\frac{\partial y_k}{\partial a_{4d}}*\frac{\partial a_{4d}}{\partial w(3)}=(y_k-t_k)*H^{\prime}(a_{4d})*z_{3}
例如图中,假设仅仅计算 y1y1y_1的输出偏差对 w11(3)w11(3)w_{11}(3)的偏导数:

∂E∂w11(3)=∂E∂y1∗∂y1∂a41∗∂a41∂w11(3)=(y1−t1)∗H′(a41)∗z31∂E∂w11(3)=∂E∂y1∗∂y1∂a41∗∂a41∂w11(3)=(y1−t1)∗H′(a41)∗z31

\frac{\partial E}{\partial w_{11}(3)}=\frac{\partial E}{\partial y_1}*\frac{\partial y_1}{\partial a_{41}}*\frac{\partial a_{41}}{\partial w_{11}(3)}=(y_1-t_1)*H^{\prime}(a_{41})*z_{31}
其中因为 a41=w11(3)∗z31+w21(3)∗z32+w31(3)∗z33a41=w11(3)∗z31+w21(3)∗z32+w31(3)∗z33a_{41}=w_{11}(3)*z_{31}+w_{21}(3)*z_{32}+w_{31}(3)*z_{33},当 aaa对w" role="presentation">www求偏导数时,仅仅有一项 zzz和对应的w" role="presentation">www相乘得到 aaa,所以求导结果便是某个z" role="presentation">zzz,请结合上面例子理解。

  1.对于和输出层直连的wij(k)wij(k)w_{ij}(k)有:

∂E∂wij(k)=∂E∂a(k+1)j∗∂a(k+1)j∂wij(k)∂E∂wij(k)=∂E∂a(k+1)j∗∂a(k+1)j∂wij(k)

\frac{\partial E}{\partial w_{ij}(k)}=\frac{\partial E}{\partial a_{(k+1)j}}*\frac{\partial a_{(k+1)j}}{\partial w_{ij}(k)}
我们假设 ∂E∂a(k+1)j≡δk+1∂E∂a(k+1)j≡δk+1\frac{\partial E}{\partial a_{(k+1)j}}\equiv\delta^{k+1},并且有 ∂a(k+1)j∂wij(k)=zkj∂a(k+1)j∂wij(k)=zkj\frac{\partial a_{(k+1)j}}{\partial w_{ij}(k)}=z_{kj},那么有:

∂E∂wij(k)=δk+1∗zkj(公式3.1)∂E∂wij(k)=δk+1∗zkj(公式3.1)

\frac{\partial E}{\partial w_{ij}(k)}=\delta^{k+1}*z_{kj}\quad\quad(公式3.1)
由于 zkjzkjz_{kj}在前向传播算法中就已经可以求得,所以重点是求解各层的 δδ\delta\;,以便获得对 www的偏导,用于梯度下降过程中w" role="presentation">www的更新。

  2.对于隐藏层的wij(k)wij(k)w_{ij}(k),我们无法直接知道该层该层的损失为多少,需要由后面传播过来,这就是反向传播的原理。这里假设输出层(第k+1层)共有jjj个神经元,第k层有i" role="presentation">iii个神经元,第(k-1)层有lll个神经元;与输出层相连的w" role="presentation">www为wij(k)wij(k)w_{ij}(k),和输出层最近的隐藏层的www为wli(k−1)" role="presentation">wli(k−1)wli(k−1)w_{li}(k-1),表示该层(k−1k−1k-1层)共有lll个神经元。则输出误差对该层w" role="presentation">www的偏导数为:

∂E∂wli(k−1)=∂E∂aki∗∂aki∂wli(k−1)=δk∗z(k−1)i(公式3.2)∂E∂wli(k−1)=∂E∂aki∗∂aki∂wli(k−1)=δk∗z(k−1)i(公式3.2)

\frac{\partial E}{\partial w_{li}(k-1)}=\frac{\partial E}{\partial a_{ki}}*\frac{\partial a_{ki}}{\partial w_{li}(k-1)}=\delta^{k}*z_{(k-1)i} \quad\quad(公式3.2)
又:

∂E∂wli(k−1)=∑j∂E∂a(k+1)j∗∂a(k+1)j∂zki∗∂zki∂aki∗∂aki∂wli(k−1)∂E∂wli(k−1)=∑j∂E∂a(k+1)j∗∂a(k+1)j∂zki∗∂zki∂aki∗∂aki∂wli(k−1)

\frac{\partial E}{\partial w_{li}(k-1)}=\sum_j\frac{\partial E}{\partial a_{(k+1)j}}*\frac{\partial a_{(k+1)j}}{\partial z_{ki}}*\frac{\partial z_{ki}}{\partial a_{ki}}*\frac{\partial a_{ki}}{\partial w_{li}(k-1)}
即=:

∂E∂wli(k−1)=∑jδk+1∗wij(k)∗H′(a(k+1)j)∗z(k−1)i(公式3.3)∂E∂wli(k−1)=∑jδk+1∗wij(k)∗H′(a(k+1)j)∗z(k−1)i(公式3.3)

\frac{\partial E}{\partial w_{li}(k-1)}=\sum_j\delta^{k+1}*w_{ij}(k)*H^{\prime}(a_{(k+1)j})*z_{(k-1)i}\quad\quad(公式3.3)
将公式3.2和公式3.3进行对比,可以发现:

δk=H′(a(k+1)j)∗∑jδk+1∗wij(k)(公式3.4)δk=H′(a(k+1)j)∗∑jδk+1∗wij(k)(公式3.4)

\delta^{k}=H^{\prime}(a_{(k+1)j})*\sum_j\delta^{k+1}*w_{ij}(k)\quad\quad(公式3.4)
所以就可以由后面的 δδ\delta推出前面的 δδ\delta,即用 δk+1δk+1\delta^{k+1}推出 δkδk\delta^{k},依次类推,就可以求出每一层对应的 δδ\delta,又根据公式3.1,就可以求解出误差对每一层联结权重 w(k)w(k)w(k)的偏导数,再利用如下公式利用梯度下降法更新权重:

wm+1=wm+α∂E∂wwm+1=wm+α∂E∂w

w_{m+1}=w_m+\alpha\frac{\partial E}{\partial w}
其中m表示第m轮迭代,(m+1)表示第(m+1)轮迭代。

  所以反向传播算法就是,先根据输出层的误差,计算出输出层对应的δδ\delta,然后再依次反向往前推出隐藏层的δδ\delta。看公式3.4你会发现,其实第kkk层的某个δk" role="presentation">δkδk\delta^k,相当于从第k+1层的δk+1k+1层的δk+1k+1层的\delta^{k+1}中分配了一部分误差过来,而这个分配的权重,就是前向传播算法中使用的连接权重www,所以这类似于一个反复的过程。以下图中的w11(2)" role="presentation">w11(2)w11(2)w_{11}(2)为例,误差对它的偏导数为:

∂E∂w11(2)=∂E∂a31∗∂a31∂w11(2)=δk1∗z21∂E∂w11(2)=∂E∂a31∗∂a31∂w11(2)=δ1k∗z21

\frac{\partial E}{\partial w_{11}(2)}=\frac{\partial E}{\partial a_{31}}*\frac{\partial a_{31}}{\partial w_{11}(2)}=\delta_{1}^{k}*z_{21}
又:

δk1=H′(a31)∗∑j=13δk+1j∗w1j(k)δ1k=H′(a31)∗∑j=13δjk+1∗w1j(k)

\delta_{1}^{k}=H^{\prime}(a_{31})*\sum_{j=1}^3\delta_j^{k+1}*w_{1j}(k)
可以看出w11(2)w11(2)w_{11}(2)影响了a31a31a_31,进而影响了z31z31z_31,而z31z31z_{31}对后面的输出{a41,a42,a43}{a41,a42,a43}\{a_{41},a_{42},a_{43}\}都有影响,并且是通过连接权重w1j(3)w1j(3)w_{1j}(3)来实现的;所以当有错误发生时,误差也是通过相应的联结权重w1j(3)w1j(3)w_{1j}(3)反向回去,分配错误。

所以反向传播算法的完整过程如下:
1.初始化联结权重wijwijw_{ij}.
2.对于输入的训练样本,求取每个节点输出和最终输出层的输出值.
3.对输出层求取δk=(yk−tk)∗H′(ak)δk=(yk−tk)∗H′(ak)\delta_{k}=(y_k-t_k)*H^{\prime}(a_k)
4.对于隐藏层求取δj=H′(ak)∗∑kδk∗wjkδj=H′(ak)∗∑kδk∗wjk\delta_{j}=H^{\prime}(a_{k})*\sum_{k}\delta_k*w_{jk}
5.求取输出误差对于每个权重的梯度:∂En∂wji=δj∗zi∂En∂wji=δj∗zi\frac{\partial E_n}{\partial w_{ji}}=\delta_j*z_{i}
6.更新权重:wm+1=wm+α∂E∂wwm+1=wm+α∂E∂ww^{m+1}=w^m+\alpha\frac{\partial E}{\partial w}

前向传播算法和反向传播算法相关推荐

  1. 深度学习(四):卷积神经网络(CNN)模型结构,前向传播算法和反向传播算法介绍。

    在前面我们讲述了DNN的模型与前向反向传播算法.而在DNN大类中,卷积神经网络(Convolutional Neural Networks,以下简称CNN)是最为成功的DNN特例之一.CNN广泛的应用 ...

  2. 温故知新——前向传播算法和反向传播算法(BP算法)及其推导

    1. 前向传播算法 所谓的前向传播算法就是:将上一层的输出作为下一层的输入,并计算下一层的输出,一直到运算到输出层为止. 从上面可以看出,使用代数法一个个的表示输出比较复杂,而如果使用矩阵法则比较的简 ...

  3. BP算法的反向传播和权值修正(1)

    BP神经网络典型结构: (1)信号的前向传播过程: 隐含层第i个节点的输入neti: 隐含层第i个节点的输出yi: 输出层第k个节点的输入netk,k=1: 输出层第k个节点的输出ok ,k=1: ( ...

  4. 508任务:对BP算法(反向传播算法 )理解与5.13式推导

    误差逆传播算法是如今最成功,应用广泛的针对多层网络的学习算法,如今的许多学习算法都是它的变体与优化.不过初学很难理解,我也是学了不少时间才慢慢理解. 推荐大家观看3Blue1Brown的3个关于深度学 ...

  5. 深度学习之前馈神经网络(前向传播和误差反向传播)

    转自:https://www.cnblogs.com/Luv-GEM/p/10694471.html 这篇文章主要整理三部分内容,一是常见的三种神经网络结构:前馈神经网络.反馈神经网络和图网络:二是整 ...

  6. 神经网络正向传播步骤和反向传播

    神经网络的训练的过程中通常有个正向过程(forward pass)或者叫做正向传播步骤(forward propagation step)接着会有个反向步骤(backward pass)也叫反向传播步 ...

  7. cnn 反向传播推导_反向传播算法推导过程(非常详细)

    1. 前向传播 假设 为 的矩阵(其中, 为样本个数(batch size), 为特征维数): 与 的维数为 为 的矩阵, 与 的维数为 为 的矩阵, 与 的维数为 为 的矩阵, 前向算法: 假设输出 ...

  8. 反向传播算法_反向传播算法:定义,概念,可视化

    定义 向前传播 通常,当我们使用神经网络时,我们输入某个向量x,然后网络产生一个输出y,这个输入向量通过每一层隐含层,直到输出层.这个方向的流动叫做正向传播. 在训练阶段,输入最后可以计算出一个代价标 ...

  9. 神经网络前向传播过程,神经网络反向传播

    正向传播反向传播是什么? 题主问的应该是神经网络中的问题.正向传播是指数据从X传入到神经网络,经过各个隐藏层得到最终损失的过程. 反向传播主要是针对神经网络优化的过程中进行,在L端计算总的损失函数,然 ...

最新文章

  1. MAX2606调频发射芯片
  2. Android TextView 高亮字体并添加点击事件
  3. 打印user在指定时间段内做过的personalization detail
  4. HDU 1003 Maxsum
  5. springcloud -zuul(2-执行流程及源码)
  6. django系列8.3--django中间件实现登录验证(1)
  7. LNMP详解(十)——Nginx负载分担实战
  8. 高校学生竞赛信息管理系统介绍
  9. 怎么打小广告html,【制作】7个技巧教你如何完成一条低成本广告制作
  10. 努比亚 Z17s (Nubia NX595J) 解锁BootLoader 并刷入recovery ROOT
  11. oracle全量增量_数据上云,应该选择全量抽取还是增量抽取?
  12. 散点图矩阵 pd.plotting.scatter_matrix
  13. 【PA2011】Kangaroos
  14. pandas读取数据时,报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid contin
  15. android开发apk捆绑,[原创]ApkAssist(Apk一键捆绑工具)
  16. 电脑是怎么把代码转换成可执行程序的?
  17. 关于revision 的cover letter
  18. riak mysql_Riak安装
  19. 'org.apache.ibatis.session.defaults.DefaultSqlSessionFactory' to requir
  20. 读书忘却时间——灵魂的沉淀

热门文章

  1. Linux学习笔记十三——文件压缩、解压缩和归档
  2. XBMC不能看搜狐电视剧
  3. (转)JDK 1.5中的ENUM用法
  4. MySQL8.0内存相关参数介绍
  5. WPF之XAML语法
  6. jQuery+CSS3实现404背景动画特效【转】
  7. php 自制建议神马收录查询工具
  8. 【JAVA 第三章 流程控制语句】课后习题 温度转换
  9. 【Recat 应用】之 React 脚手架
  10. Error: .eslintrc.js » eslint-config-standard: Environment key “es2021“ is unknown 版本兼容问题