神经网络的反向传播是什么

神经网络的反向传播,实际上就是逐层计算梯度下降所需要的$w$向量的“变化量”(代价函数$J(w1,b1,w2,b2,w3,b3...wn,bn)$对于$w,b$向量各个分量(w1,w2,w3,w4...)(b1,b2,b3...)的微分)。以便进行梯度下降算法更新参数优化模型。反向传播就是适用链式法则(如果学过矩阵论可以认为也用到了矩阵论的知识),将这个求微分过程可以通过迭代来进行完成。 本人在之前的学习机器学习系列课程中就对这段知识点懵懵懂懂,这次花费很多时间一举攻下,所以一定要做详细解释使得每一个读者,包括未来的自己对这部分知识一目了然。因为毕竟说白了不过是几个矩阵求个导数罢了。我向您保证,您只需要会简单求导,以及向量乘法,当然还有耐心,因为我举了大量由浅入深的例子和不厌其烦的细节重述,那么你就足够看懂本文,学会神经网络的反向传递

本部分内容,有意义,却又不尽只是满足一份好奇心,因为对于足够复杂的系统,对于其整体的把握远远比对于细节来得重要。很多时候复杂系统的细节,是我们硬要解释也解释不来的,请交给数学罢。

心得,思维与攻克方法

在我学习的过程中,我认为bp这是一块比较难克服的地方(几个公式花费了我近两天时间),总结主要有若干几点原因: 1)深度学习课程中的矩阵规模表达模糊。2)如$w,*$等在不同版本数学教材中含义混淆,而其未给予任何提示和声明,使得一一对应的复现较为困难。3)丝毫没有任何推导地给予公式,这对于小白可能是好事,但对于多大多数当今的好奇一代,这等于杀人。

所以我将对上述不足的地方给予额外的详细说明。

我尝试了并且建议大家可以通过两种思路理解其过程。

1)深入学习矩阵求导相关知识 这里推荐一本哈工大数学系一妹子推荐的参考书:《矩阵理论与应用》上海交通大学出版社,看完这本书的矩阵求导部分,应该就可以直接上手推导反向传播过程的公式。不会有什么障碍了。

2)从每层都只有一个神经元这种简单情况开始,逐渐扩展 这也就是我在本文中要介绍的方法。(就是有从求单个的到整合在一起的这么一个过程)您只需要会求导和矩阵乘法。

希望大家能够在看完本文之后,能够彻底读懂神经网络。

从一个简单的神经元讲起(形态1)

我们先引入一个简单的神经元,理清一些概念。 比如我上面举的例子,第一个球(第一层)x作为输入,经过一层前向传导$z=wx+b$,变成了$z$(第二个球,第二层),然后再经过$sigmoid(z)$传导到第三个球(第三层)。然后就没了,就很简单。 我们来看如何对于神经网络模型图的东西赋予意义加深理解记忆,实际上一个球就是一个变量,当我们将其放在特定的情况下进行传播时,每一个球就是一个确定的数字罢了而每一条线,就相当于一个神经元(球)传递的权重,如果想象力够好大可以将每条线的粗细和其数值大小对应上脑补出来。(我们在这里面只关注左边的线,右边的线相当于一个一一对应的激活函数,在实际使用中是将后两个球粘合在一起的,不外露的,我们便不讨论它) 这时候的反向传播很简单,假设我们设置了一个代价函数$J$,并且得到了其对于$sigmoid(z)$的导数,那么我们可以使用链式法则一层层续链子,将链子延展到每一个需要修正的变量,在本例就是一步步向左传递得出$z,b,w,x$的导数。 具体操作就是我们先对于sigmoid求z的导数 那么$frac{d J}{d z}$=$frac{d J}{d sigmoid(z)}$×$frac{d sigmoid (z)}{d z}$。那么以后为了简单起见,我们和吴老师一样,把这个意思的函数写成微分形式,即$dz$=$d ~sigmoid(z)×sigmoid ~'(z)$,那么这“层”(实际意义上这不算做一层)就完事了,我们就可以继续往前搞下一层。我们继续求b的导数,那很简单,即$db=dz$,我们尝试在这里塑造一个直观的理解,为了以后在更复杂的时候也能理解,即事实上,b的修正变化和z的变化是同步的,$db=dz$;再求w的导数,$dw=dz×x$,我们尝试在这里塑造一个直观的理解,即w的修正,和线段的另一端其传递过来的x是成正相关的,那一边的x占有重要地位,那么你修正的力度也就要更大;然后是x本身,求导易得$dx=dz×w$,直观理解就是,对于线粗的另一端的$x$,我们的修正要更加猛烈一些。

我们先在将x变化成为一个多神经元输入(多变量),变化成向量X(形态2)

现在我们将x扩充成一个X向量,看看需要补充什么样的说明。 首先我们要说明一下,我们定义的$w$,和吴恩达深度学习的课程一样,是行向量,(在不同教材中可能也是列向量,这和在不同教材中b的所属位置不同是一样的,因地制宜地看就好了) 我们将本例子中的$w$指定为[$w$~1~,$w$~2~,$w$~3~],将$X$指定为[$x$~1~,$x$~2~,$x$~3~].很显然这里暗含着一种线(权重)和球(神经元)之间的对应关系。正向传播依旧是$z=wx+b,output=sigmoid(z)$。反向传播,最右侧源头输入,$sigmoid$第一次链乘照旧,得到$dz$。 然后,我们来聚焦于刚刚变化的部分,首先是$db$,很显然b的变化只和z相关,仍然是$db=dz$

再来看$dw$,我们将这左侧的三条线(权重)一条条看(依次计算$dw$),(因为他们变化都是从中间的球变化得出的,而且之间不存在联系),我们使用之前的结论(有式子,但是用直觉更好:原有的x数值越大,惩罚越大,谁让你那么支持的,这锅肯定要背的)得到$dw$~1~=$dz$×$dx$~1~,$dw$~2~=$dz$×$dx$~2~,$dw$~3~=$dz$×$dx$~3~,用向量化的角度思考就是$dw$..(1,3)=$dz$...(1,1)×$x$^T^...(3,1)-->(1,3)。简要写下来就是$dw=dz×x$^T^ 这里我要吐槽几点,第一点就是我一开始不理解莫名奇妙有一个转置导致想了很多时间,实际上就是忘记了$w$在这一部分是一个行向量,这个事太诡异了,因为我们太熟悉$y=w$^T^$x+b$,很容易转不过来弯直接脑补。 第二点,吴专门挑一堂课梳理规模,然而那时候我已经乱了,整理我也听不懂了有木有!!咱能稍微放一起讲不要卖关子,让大家一次行动好不好!!所以这也时刻提醒我在重复记录下来的时候,要备注矩阵的规模。。 好,我们继续,接下来是$dx$,我们继续一条条看,根据之前简单情况推好了的式子可以得到,(直觉上的解释是线越粗,我们对于x的惩罚也就要越大,谁让你乱顶了,这锅肯定要背的),那么和$w$那部分一样,我们整理一下并且向量化,便可以得到$dx=w$^T^$×dz$

从“星崩”到正经的神经网络(形态3)

其实,前面的都是铺垫于排雷,现在开始要集中精神哟。

当我们将神经元扩展为3,2的两层时,权重$w...(2,3)$,和$b...(2,1)$也发生了变化。这时候我们首先将修改一下符号满足相关的标准,左侧$a$^(i)^,中间为$z$^(i+1)^,右侧$a$^(i+1)^。我们每一次的正向传递也就是从$a$^(i)^到$z$^(i+1)^,再从$z$^(i+1)^到$a$^(i+1)^。由于第二步是一个一一对应过程,我们之后在的概念图中可以将其合并。 首先一件很重要的事情对于这时的$w$建立一个直观理解。这时的$w$,是一个权重矩阵,其每一行都是一个原来的$w$,相当于在正向传播时,每一行都可以将之前所有的神经元加权加和下一层给一个神经元赋值。有多少列,就会向下一层传递多少个数值,也就是说$w$矩阵的行列是和上下两层的神经元对应的,在脑子里要脑补充这个对应

之后来谈其反向传播过程,还是拆成一部分一部分看。我们不妨,先抽出上半部分。

很显然,其符合我们的形态2的结论。可以直接得到由于权重,也就是线的粗细,只与$z$^i+1^~1~,$z$^i+1^~2~这两个中层神经元有关,进而$dw$对于这些先来讲也只由其对应的dz~1~(单个的)和$a$^(i)^(在这里面是3×1矩阵)共同确定(还记得直观吧,x越大dw越大,那么结论是$dw=dz×x$^T^),而对于整体的$w$矩阵,我们要求其(在这里面是2×3矩阵)的$dw$,那么我们要拆成若干行形态2来看的话,很快就可以理解出来,实际上我们是要得到两个形态2的(3×1)矩阵放到两行上。这时就还是$dw=dz×x$^T^,只不过现在的dz是一个2×1列向量,x也变成了$a$^(i)^,那么也就是$dw=dz×a$^(i)T^。理解的话在脑子脑补一下矩阵乘法的原理,我们要把$dz$的第一个数(变化量)乘上$a$^(i)^行向量放在$dw$的第一行,再把$dz$的第二个数(变化量)乘上$a$^(i)^行向量,以此类推。其实就是一样的啦。 然后我们来看这时候的$dx$是怎么变化的。我们也还是将神经网络先拆成两个形态2,那么我们就可以想到,因为我们要修改的是每一个x,而反向过程中一个x会被多个线段所指向,那么不同的权重也会影响我们的修改,实际上我们得到的da^i^(在本例子中是一个3×1的列向量),是一个“多列累加的结果”,即反向传播过来的每一个形态2,都会造成一个da^i^,由w的某一列决定,而我们要将其列加dz的权重之后加到一起。

上面的图希望能够帮助大家直观理解。那么实际上使用$dx=w$^T^×$dz$就是矩阵的公式体现。图画的很明白了,这里面就不赘述了。 至于$db$,不加解释,过于显然的是其一定恒等于dz。

补充说明一下符号$*$

在吴课程中,$$的意思是内积(e.g.(1,2,3)$$(4,5,6)=(4,10,18))。他只有在需要说明内积的时候才用$*$。比如我们每一次反向传播,实际上第一个过程走的是从$a$向量到$z$向量。那么这时候由于是一个一一映射,那么微分的传递实际上是一个内积。就每一项对应位置相乘。

训练集升级之后的向量化

我们之前讨论的情况都是对于一个数据的输入的正向传播和反向传播,对于整个训练集,我们对于X进行相应的列方向上的扩充。这一部分的向量化我们在这里就不讲了,使用本文的方法很快可以推导出来。

现在再看这些公式,是不是就很显然了呢?

吴恩达,深度学习课程第一课 上海交通大学,矩阵理论与应用 3blue1brown,神经网络相关可视化视频

反向传播算法(过程及公式推导)_一文讲透神经网络的反向传播,要点介绍与公式推导...相关推荐

  1. 10自带sftp服务器_一文讲透FTP和SFTP的区别

    阅读本文约需要10分钟,您可以先关注我们或收藏本文,避免下次无法找到. FTP和SFTP都是文件传输协议,我们知道FTP使用的是20和21端口,SFTP使用的是22端口.另外,SFTP前面的S应该是S ...

  2. 双线macd指标参数最佳设置_一文讲透双线MACD指标及其实战运用

    原标题:一文讲透双线MACD指标及其实战运用 船长的舍得交易体系技术理论模型中,我们要用到两大指标,分别是均线系统和双线MACD指标. 很多小伙伴都喜欢用双线MACD这个指标,但是90%的人都不知道其 ...

  3. cstring只获取到第一个数_一文讲透 Dubbo 负载均衡之最小活跃数算法

    (给ImportNew加星标,提高Java技能) 作者:why技术(本文来自作者投稿) 本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版 ...

  4. 梯度下降参数不收敛_一文讲透梯度下降

    本文始发于个人公众号:TechFlow,原创不易,求个关注 在之前的文章当中,我们一起推导了线性回归的公式,今天我们继续来学习上次没有结束的内容. 上次我们推导完了公式的时候,曾经说过由于有许多的问题 ...

  5. python 多线程和协程结合_一文讲透 “进程、线程、协程”

    本文从操作系统原理出发结合代码实践讲解了以下内容: 什么是进程,线程和协程? 它们之间的关系是什么? 为什么说Python中的多线程是伪多线程? 不同的应用场景该如何选择技术方案? ... 什么是进程 ...

  6. ubuntu linux开机启动自动加载ko驱动程序_一文讲透 CentOS 开机流程

    一.Linux开机流程: BIOS: (Basic Input Output System)基本输入输出系统,它是一组固化到计算机内主板上一个ROM芯片 上的程序,保存着计算机最重要的基本输入输出的程 ...

  7. python selenium自动化框架_一文讲透!实现一个Python+Selenium的自动化测试框架如此简单!...

    首先你得知道什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium I ...

  8. itstime后面跟什么_一文讲透什么是引流

    这个问题老生常谈,都快腻了,还是有人时不时问老马.究其原因,很多人从想做引流.到动手操作,整个流程都是懵逼的状态. 引流不难,难的是一直卡在某个阶段,或者一直停留在那里.这样,你做再多次引流,还是患得 ...

  9. 三菱四节传送带控制梯形图_一文讲透FX5U PLC程序控制指令及步进梯形图编程

    三菱PLC在80年代进入中国市场,已有30多年历史.由于三菱PLC编程易学,功能强大,深受中国用户喜爱.随着时间推移,市场上已经淘汰掉二代产品,关系图如下: 说明 90年代老型号 2000年代老型号 ...

最新文章

  1. ECMAScript 6 未来前景
  2. php imagefill,PHP 图像填充 imagefill、imagefilledarc 与 imagefilledrectangle() 函数
  3. Java:Java编程实现导出二维码
  4. linux加密格式化吗,linux环境下给文件加密/解密的方法
  5. 基于NIOS II的液晶显示设计——自定义图形库
  6. 【LeetCode】【HOT】39. 组合总和(回溯)
  7. fonts.googleapis.com加载过慢导致的项目启动过慢的问题
  8. Python--网络编程-----通过socket收发文件软件开发--面向对象开发
  9. 预备作业03 20162311张之睿
  10. c++ 虚函数实现原理
  11. editplus 打开大文件_CorelDRAW文件损坏的几种解决方法
  12. Android开发布局 案例二
  13. e531网卡驱动linux,联想e531网卡驱动下载-联想e531笔记本无线网卡驱动v6.30.223.201 官方版 - 极光下载站...
  14. Java小开发(车辆信息管理系统)
  15. C++创建Windows系统服务
  16. http上传文件服务器限制大小,修改Nginx与Apache配置参数解决http状态码:413上传文件大小限制问题...
  17. 微信支付--网页版-V3-(1)
  18. leetcode 89
  19. mqtt publish 中文
  20. springboot驾校报名系统 微信小程序

热门文章

  1. 西安理工大学 计算机考研不分专硕学硕吗,2021年西安理工大学计算机科学与工程学院考研专业目录_研究生考试范围 - 学途吧...
  2. 《c语言从入门到精通》看书笔记——第6章 选择结构程序设计
  3. java 生产者消费者_基于JAVA的生产者消费者问题
  4. java中的分层概念_Java分层概念
  5. linux如何切换到光盘,怎么刻录cd光盘-Linux切换目录之cd命令详解
  6. hash redis springboot_Redis常见的工作场景使用实战,Redisson分布式锁的实现
  7. big sur删除snapshot_法国Labarthe-Sur-Lèze公立中学 | LCR Architectes
  8. 浏览器打开出现证书错误_PADI 电子潜水证书更新啦!
  9. vue-cli搭建的项目打包之后报“资源路径错误资源文件找不到“
  10. django 函数装饰器 变为 类装饰器