神经网络反向传播,反向传播神经网络基本原理

  神经网络反向传播,反向传播神经网络基本原理

  作者来自知乎、DarkZero

  丠3359与环岛局域网相连。智Hu.com/p/25202034

  编辑集集城的平台

  本文仅供学术分享。如有侵权,请联系后台删除。

  我相信所有刚进入神经网络(现在叫深度学习)的同学都会因为反向传播的梯度求导而痛苦半天。在各种机器学习课程中明确,神经网络只需要计算一次损失,计算回每个参数的梯度,大家就可以根据梯度进行更新。问题是如何找到斜率。课堂上很容易举出标量的例子。如果你做了功课,你会发现一切都是矢量化的,一个一个排成一行。大多数人不习惯微分运算,很多人通过梯度的求导直接选择了死亡。我曾经也是其中一员,作业1中的一些简单导数,成就了CS231n,让我怀疑自己的人生。

  我想很多人都看过很多资料,比如CS231n的讲师Karpathy推荐的http://cs 231 n.Stanford.edu/vecderivs.pdf,《黑客帝国指南》。经过几天的折磨,用神经网络精确计算出这里的斜率其实很简单。只要掌握以下两个原则。这两个原则最适合不熟悉矩阵微分的同学。虽然看起来不严格,但是很有效。

  1.用好量纲分析,不要直接用神经网络求梯度。第一个原则是,如果你不熟悉矩阵微分,你不会直接计算一个矩阵对另一个矩阵的导数。在神经网络中,很快发现,利用间接法求标量导数的知识,可以简单地得到所有矩阵对矩阵的导数。求这个间接导数的方法是量纲分析法。我觉得维度分析是神经网络中最常用的寻找梯度的技术,没有。有了好的量纲分析,就不需要逐个分析矩阵的每个元素,它对谁有什么样的指导作用。很好用,比如各种求和后是左乘还是右乘,是不是不能替换。这个技能在卡帕西的课程笔记上也有所涉及。

  什么是量纲分析?举个最简单的例子。假设某层的正向路径是一个x为NxD,w为DxC,b为1xC的矩阵,那么分数就是一个NxC的矩阵。现在高层已经告诉我L对score的导数是多少了。我们找到了L对W和b的导数。

  我知道我们已经在NxC的行列了。(因为Loss是标量,当score的所有元素发生变化时,Loss也会发生变化。)

  这里有一个问题。分数是一个矩阵。w也在排队。寻求母体的指引。如何乞讨?如果你对矩阵微分不熟悉,那你就太无知了。所以很多同学看了推演过程后觉得恶心,然后从头放弃,提前结束了从深度学习到深度学习的整个过程。

  其实不需要直接求score对W的导数,可以用另外两个导数间接计算。首先,我们来看看它有多大。我们知道一定不是DxC的(和W一样大),而是NxC的)。啊你很快意识到是DxN的)DxN) x) NxC))。然后,我还注意到,你手里写的公式右边的两项,写的方向相反。我们应该这样做。

  是的,我知道是DxN,所以很顺利。既然score=XW b,如果都是标量,那么score向W本身寻求指导就是X,X就是NxD。我要DxN,转过去。所以我们出来了:

  结束了。

  你看,我们不是用这些分支的每一个元素直接推导,而是用我们熟悉的标量求导的知识来引导这个矩阵进行计算。这才是在神经网络中求导数的正确态度。

  为什么这种方法总是有效?重要的是,损耗是标量,标量导出矩阵总是与矩阵大小相同。那么,在神经网络中,你就可以一直执行这个“知二而求一”的过程。其中“二”是两个损失对参数的导数,另一个是矩阵对矩阵的导数你不求。先计算不能直接计算的矩阵的导数大小,再用熟悉的标量看导数的长度,最后收集目标大小的矩阵。

  那又怎样?看一看。我是NxC。1xC .看起来像1。我觉得聪明的其实是1xN的那种。因为(1xN) x(nxc )=) 1xC)。实际上,这相当于直接对d_score的第一维求和,将n降为1。

  此外,这个总数是如何得出的?其实原因在于所谓的“广播”机制。可以看出,XW是NxC的矩阵,而B只是1xC的矩阵。从理论上讲,这两个人体矩阵形状不同,不能相加。但是,实际上,我们想做的是在XW的每条线上加上B。也就是说,我们把B的第一维复制了n份,强行换成NxC的矩阵,加到XW(当然numpy其实也是这么做的)。那么完美月饼回来求梯度的时候,既然每个B都参与了N行的运算,那么每个梯度都要加起来求和。因为我在追求

  导数定律告诉我们,如果一个变量参与多个运算,那么它的导数就要加起来。这里借用一下@午后阳光的图。我相信你能看得更清楚。

  总之,不要试图在神经网络中直接求矩阵的导数,而是用量纲分析间接求,可以省去你很多不必要的麻烦。

  2.利用好链式法则,不要一步到位。我曾经认为链式法则只是把简单的问题复杂化了。这种东西我们在高考求复合函数导数的时候都会知道,还需要一步一步的拆吗?比如我一眼就能看出来。我需要先把它想成一个中间函数吗?

  可惜,在神经网络里,你会发现事情并没有那么容易。上述推导只在标量下成立。如果w,x,B都是矩阵,我们会很容易觉得写不出来。拿上面的例子来说,假设我们问,那么我们可以直接写。

  L对H的导数是上层在反向传播中会告诉你的,但问题是如何求H对W的导数?

  如果你学了刚才的量纲分析法,那么你可能会认为它是一个DxN矩阵。然后你会发现你无能为力。其实卡壳的原因是它根本不是矩阵,而是四维张量。新手做不了这种傻事。准确的说也可以表示为矩阵,但是大小不是DxN,求和运算也不是简单的矩阵乘法,还会有向量化等等。感兴趣的同学可以参考这篇文章。有一个例子说明如何直接求这个导数:矩阵求导(第二部分)(https://zhuan LAN . zhi Hu . com/p/24863977)。

  这是一个刚学反向传播的初学者很容易踩到的陷阱:试图不设置中间变量,直接找到目标参数的梯度。如果这样做,中间很容易遇到这种非矩阵结构,因为从理论上讲,矩阵导出的矩阵是4维张量,而不是大家熟悉的2维矩阵。除非你已经完全掌握了上面参考中的数学技巧,否则你就只能发呆了。

  但如果不直接计算w的导数,而是把它作为中间变量,事情就简单多了。如果每一步求导都只是简单的二元运算,那么即使矩阵取矩阵间的导数,它仍然是一个矩阵,这样我们就可以进行量纲分析。

  集,有

  利用量纲分析:dS是NxC,dH是NxC,考虑到很容易想到NxC,即它是元素式乘法;所以;

  还是那句话,用上一部分的方法很容易得到,就这样完了。

  有了这些结果,我们不妨回头看看开头的公式:如果你误以为是DxN矩阵,继续计算:

  我们已经知道,这两个矩阵一个是NxC的,一个是DxN的,无论怎么相乘,都得不到DxN的矩阵。矛盾在于H对W的导数其实不是矩阵。但是如果使用链式法则运算,就可以避开这个复杂的张量,只使用矩阵运算和标量导数就可以得到神经网络中的梯度导数。

  在这两种技术的帮助下,计算任何复杂图层的梯度就足够了。先练一个:求Softmax图层的渐变。

  Max层通常是输出层,其正向传递公式为:

  ,

  假设输入X是NxD,一共有C类,那么W显然应该是DxC,B应该是1xC。其中是第I个样本预测的正确类别的概率。这里就不多说softmax了。我们来求损失关于W,X,b的导数,为了简单起见,下面所有的d_xxx都是指损失对xxx的导数。

  首先,我们重写Loss,把P代入其中:

  不要一次做完。我们来分别看一下前面部分和后面部分。设,rowsum是每一行的得分指数之和,所以是Nx1,则有

  先看d_score。它的大小和score一样,是NxC的。你会发现,把前面的1/N扔掉不看,d_score其实是一堆0,然后在每一行正确的类里都是-1;用python代码写的是

  d _ score=NP . zeros _ like(score)d _ score[range(n),y]-=1然后看d_rowsum,其实,很简单。

  现在,我们很担心。我们需要注意的是,不要直接要求什么。两者都是矩阵,很难要求什么。相反,我们要求多少?我们会发现上面计算了一个d_score,这里又计算了一个d_score,说明score的矩阵参与了两个运算,符合这里损失的定义。导数定律告诉我们,当一个变量参与两部分运算时,将两部分的导数相加就足够了。

  d_score的这一部分很容易要求:

  ,左边是NxC的,右边已知是Nx1的,所以剩下的可能是1xC的或者NxC的。这是分析的时候了。我们会发现右边应该是NxC的,因为每个分数只影响rowsum的一个元素,所以不应该求和。NxC的矩阵就是它本身,所以我们很容易得到:

  #实际上d_rowsum往往是一个长度为N的一位数组,所以我们先用np.newaxis把它的形从N提升到Nx1,#这样就可以用广播机制(Nx1 * NxC)#然后用乘号做元素式乘法。D _ score=d _ rowsum [:NP . new axis]*(NP . exp(score))d _ score/=N #然后补上那个1/N这样我们就完成了score的求导,然后W,X,b按score求导。我相信你也会的。

  当然,如果你留心的话,你会发现第二部分的公式其实就是P矩阵。然而,如果你没有注意到这一点,也没关系。你也可以用这个方法找出d_score是什么。

  用同样的方法,现在看看卡住无数人的批量归一化图层的梯度求导。你觉得难度小了吗?

  希望这篇文章能为刚入门神经网络的同学提供一些帮助。请指出任何错误或遗漏。

  下载1:OpenCV-Contrib扩展模块中文版教程

  在“小白学视觉”微信官方账号后台,回复:扩展模块中文教程下载全网首个中文版OpenCV扩展模块教程,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等20多个章节。

  下载2:Python视觉实战项目52讲

  在“小白学视觉”微信官方账号后台,回复:Python视觉实战项目下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别在内的31个视觉实用项目,帮助快校计算机视觉。

  下载3:OpenCV实战项目20讲

  在“小白学视觉”微信官方账号后台,回复:OpenCV实战项目20讲,可以基于20下载20个OpenCV,实现OpenCV的高级学习。

  交换组

  欢迎加入读者微信官方账号,与同行交流。目前有SLAM、3D视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群。(以后会逐步细分)。请扫描以下微信号加群,并注明:“昵称学校/公司的研究方向”,例如:“活泼茉莉上海交大视觉SLAM”。请按格式备注,否则不能通过。添加成功后,会根据研究方向邀请你进入相关微信群。实战项目在群里发广告,不然就请你出群。谢谢理解~

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • python 残差,残差神经网络是cnn
  • python 残差,残差神经网络是cnn,Python深度学习神经网络残差块
  • 卷积神经网络的基本结构,卷积神经网络的结构
  • 基于图神经网络,dqn神经网络
  • 神经网络心得体会,简单循环神经网络
  • 深度卷积神经网络与卷积神经网络的区别,卷积神经网络简单理解
  • 基于空间的图卷积神经网络,卷积神经网络每一层通过数据变换实现图像的
  • java神经网络框架,神经网络模型有哪几种,java神经网络框架,神经网络模型有哪几种形式
  • 人工神经网络算法与机器算法,人工神经网络算法的应用
  • 怎样做神经网络分类器检测,神经网络 分类器
  • 卷积神经网络是一种常用来处理,卷积神经网络的基本概念
  • 社交网络分析模型,python建立神经网络模型
  • 卷积神经网络lenet-5详解,卷积神经网络alexnet
  • 神经网络 dnn,神经网络的梯度
  • bp网络神经预测模型,bp神经网络实例分析
  • 留言与评论(共有 条评论)
       
    验证码: