本博客内容来源于网络以及其他书籍,结合自己学习的心得进行重编辑,因为看了很多文章不便一一标注引用,如图片文字等侵权,请告知删除。
传统2D计算机视觉学习笔记目录------->传送门
传统3D计算机视觉学习笔记目录------->传送门
深度学习学习笔记目录 ------------------->传送门
学习的前提
虽然自己也能基于pytorch 复现一些神经网络的论文,但是对于神经网络的基础反向传播算法一直还是模棱两可,理解的不深刻,所以特意看了一下,并记录下来。才发现这个目前各个神经网络离不开的算法,其实是那样的简洁朴素。只要高中毕业理解都不难,难的是将其放到神经网络里,就不是很好理解,所以本文先从数学上推导理解,此部分不涉及神经网络,然后再映射到神经网络。
如果您阅读本文,建议还是先了解一下神经网络的基本概念,本文只介绍反向传播的基本思想,例如梯度等其他的知识本文暂不拓展。
反向传播公式推导
我们先提出一个简单的数学问题,假设我们有公式:
我们知道当输入为 [x1,x2,x3] 时,w11,w12,w13,w21,w22,w23,b1,b2,b,v1,v2 为已知值,输出z 的梯度为δz ,现在请计算 w11,w12,w13,w21,w22,w23,v1,v2 的梯度?
先不管为什么会出一个如此奇怪的题目,我们先来解这个题目。
我们以 求w11 的梯度为例,可以将上述的三个公式看做在出w11以外的其他值都是已知值(事实也确实是已知的值),则就是z关于w11 的函数。
那么根据链式法则(洛必达法则),这里就不进行解释了,可以获得如下w11梯度的式子:
[站外图片上传中...(image-174602-1576316792218)]
其中dz/dy 我们根据公式3求得为v1 , dy1/dw11 可以根据公式2求得为x1,而w11的梯度与式子2并没有关系。通过这种方式,我们只需要计算出每个式子单独的关于某个变量的梯度,就可以在只获得结果的梯度上,非常简单的计算出所有变量的梯度。
其实反向传播的基础思想就是通过链式法则将梯度的求解进行了较大的简化。如果没有链式法则,我们需要将式子都整合在一起,看w11 前的系数是多少,就非常的复杂了。
现在我们能够比较简单的方式求得所有权重的梯度,既然知道了梯度,就我们就可以去根据梯度去更新这些权重,进而使得δz 变小,达到(局部)极小值。
是不是非常的简单,上面这个过程其实就是神经网络通过反向传播,更新权重,训练网络的过程了,还是看不出来跟神经网络有什么关系,我们接着看下面。
多层感知机与反向传播
我们可以将简单的前向神经网络认为多层感知机,为了简洁,我们可以去掉非线性激活函数,则一个简单的神经网络如下:
我们可以看出这个神经网络有三层,分别为输入层,一层隐藏层,输出层。其中输入层的变量长度为3,隐藏层变量长度为2,输出层长度为1。因为图片是在找不到能够生成偏置单元的生成器,我们就忽略了偏置单元。这个网络非常的简单。
然后我们将神经网络改写成公式,然后你就会神奇的发现,这正是我们上节推导的公式。so,在神经网络中的反向传播不就是上面我们提到的问题嘛,通过反向传播来更新神经网络中的权重参数。
总结
在我理解神经网络过程中遇到最大的问题是,神经网络给人一种很庞大很神秘的感觉,一接触那些很多的求导公式,再加之很多复杂的矩阵操作,就已经懵逼了。其实反向传播的思想是很简单的,反向传播利用链式法则将很复杂的函数求导给大大的简化,但是要是理解一个复杂的神经网络的梯度更新还是有点复杂的,但也是跟上面简单的网络差别不大,只是有点麻烦。
下篇文章会使用numpy 来实现一个全连接神经网络来实现对mnist数据机的分类问题,以加深对神经网络前向传导以及反向传播的理解,以及怎么使用矩阵运算来加速整个流程。
重要的事情说三遍:
如果我的文章对您有所帮助,那就点赞加个关注呗 ( * ^ __ ^ * )
如果我的文章对您有所帮助,那就点赞加个关注呗 ( * ^ __ ^ * )
如果我的文章对您有所帮助,那就点赞加个关注呗 ( * ^ __ ^ * )
传统2D计算机视觉学习笔记目录------->传送门
传统3D计算机视觉学习笔记目录------->传送门
深度学习学习笔记目录 ------------------->传送门
任何人或团体、机构全部转载或者部分转载、摘录,请保留本博客链接或标注来源。博客地址:开飞机的乔巴
作者简介:开飞机的乔巴(WeChat:zhangzheng-thu),现主要从事机器人抓取视觉系统以及三维重建等3D视觉相关方面,另外对slam以及深度学习技术也颇感兴趣,欢迎加我微信或留言交流相关工作。