读懂反向传播算法(bp算法)

原文链接:这里

介绍

反向传播算法可以说是神经网络最基础也是最重要的知识点。基本上所以的优化算法都是在反向传播算出梯度之后进行改进的。同时,也因为反向传播算法是一个递归的形式,一层一层的向后传播误差即可,很容易实现(这部分听不懂没关系,下面介绍)。不要被反向传播吓到,掌握其核心思想就很容易自己手推出来。

思想

我们知道神经网络都是有一个loss函数的。这个函数根据不同的任务有不同的定义方式,但是这个loss函数的目的就是计算出当前神经网络建模出来输出的数据和理想数据之间的距离。计算出loss之后,根据反向传播算法就可以更新网络中的各种参数以此使loss不断下降,即可使输出的数据更加理想。
所以,现在的任务是,已知一个网络的loss之后,如何根据loss来更新参数呢?具体点即如何更新网络节点中的权重w和偏差b的值呢?

定义元素

这里我们采用的是全连接神经网络进行说明。
要想把这个过程说清楚,首先需要将神经网络中各个参数用文字表达清楚。定义的就是w和b在网络中的准确位置。

w标记说明

对于表示的是神经网络中第层第k个节点到神经网络中第层第j个节点之间的权重。注意w的下标是首位表示的是节点后层节点的位置,末尾表示是前层节点的位置。理解这样的表达方式在后面的计算中会很好理解。
同理,对于b的表示:

b,a符号说明

b的表示相比于w要简单一些,符号表示第l层网络在第j个节点的偏置。无论w还是b的表示,上标都是表示层数。并且表示都是第l层网络第j个节点的参数。所以该节点的输出可以表示为:

神经网络输出之后会经过一个激活函数,这用激活函数用表示,则经过激活函数输出为:

至此,根据上面符号。我们可以对于神经网络里面每一个数据准确的表示了。

损失函数对参数的偏导

给定一个损失函数之后,用表示,说白了反向传播就是求?C/?w和?C/?b,然后将这个值乘以和对应的w,b进行相减就可以实现一次的参数更新了。为什么这样的操作就可以优化网络,减小loss值呢?

来源于导数的概念和速度相关。?C/?w和?C/?b相当于loss值C相对于w和v变化的速度。如果?C/?w是正的,则增大w,C也会增大,如果希望C减小的话,应该减小w;并且?C/?w的绝对值越大,表示w对C的值影响越大,w稍微有一点变化,C就会有大幅变化。如果要优化C变小,w应该对应的减少多少呢?也没有一个确定的答案。这里通过变化的速度和学习率相乘作为一个减小的值。通过多轮迭代。最终是希望c达到最小点。而当函数落入最小值的时候,无论是局部最小还是全局最小,其周围一定是平滑的。所以此时?C/?w和?C/?b将会变得很小甚至为0,即参数不在更新了。当函数在局部最小点处参数不在更新出现梯度消失的问题时,目前也有各种trick进行解决。不是这里的重点。

为了好说明,这里定义一个很简单的损失函数C:

损失函数

即:网络输出的值和label之间的均方差。

求导

接下来就是有意思的阶段了。这里还是利用上一节中?C/?w和?C/?b的解释。如果我们想要求出?C/?w和?C/?b的值,即具体的对C影响速率的值,我们找一个中间变量?C/?。因为我们知道:

我们定义:

当我们知道了值之后,我们根据式子可以很容易求出
利用导数的链式法则:

很容易推出来不是?同理可以求出:

可以看出通过媒介 很容易求出?C/?w和?C/?b。那么我们现在来理解一下 到底是什么意思,以及如何求出来每一个l层j节点的值。

根据定义:

可以看出来就是对于C的影响大小(联系之前说的导数和速率的关系)。而是第层第个神经元未进过激活函数之前的输出。所以我们可以理解为网络中第层第个神经元对loss的影响。所以很直观的看法就是我们先求出单个神经元对loss值得影响,然后再计算该神经元内部参数对于loss的影响。

ok,如果我们已经理解了为什么要引入变量以及如何利用该变量计算具体参数的梯度后,接下来我们就可以看看如何获得值。反向传播的名字我想也就是通过计算的方式而来的。是一层一层递归而来的。

既然说是递归的方式,我们来思考一下之间有什么关系,如果找到这个关系之后,我们就可以默认我们如果知道最后一层网络节点的值,我们就可以获得倒数第二层网络节点的值,倒数第三层,倒数第四层,……以此推类即可获得整个网络的每个节点的值。至此我们的反向传播也基本完成了。
所以最重要的有两点:

  1. 之间有什么关系
  2. 假设最后一层网络是L,最后一层如何计算得出

先看问题1,直接根据求导的链式法则就可以找出两个的关系,具体公式如下,可以多看看手写一下,思路上也很简单。

觉得这样的链式公式还是很直观的,如果不好理解,可以自己画一个神经网络图,连上节点与节点之间的线,标上参数,然后推一下应该就能理解了。
这里的都表示的未经过激活函数的神经元的输出。表示激活函数。因为:

所以:

带入上式就可以得出:

至此就找出了之间的关系了。
(还能简化,根据最开始我们定义的)。

理解起来就是网络中前面一层某一个神经元对于loss的影响与该层的后一层所有的神经元对loss的影响、该神经元的输出大小、该神经元与后一层神经元连接的权重有关系的,并且是一个累加的效应。这样的理解也是非常直观合乎常理的。

现在万事具备,只差问题2了。即假设最后一层网络是L,最后一层如何计算得出。最后一层的值就像一个导火索,一旦有了开始,就可以利用我们之前推出来的:公式进行反向传播了(反向传播还是很形象的不是?)。现在解决这个问题。这个问题就是和损失函数具体怎么定义有关系了。不过我们先不考虑C的具体形式,根据通用的链式法则我们可以得到:

这里需要注意的是最后一层激活函数使用的是哪种。最后一层激活函数在计算某一个神经元的输出时可能会结合其他节点的输出来计算。比如softmax激活函数,其输出的是一个概率值【0,1】。输出大小就是结合输出所有的值。

现在我们来考虑两个具体的损失函数,并且采用之前定义的均方误差损失函数

  • sigmoid损失函数

    形式:

    函数曲线:

    sigmoid function

求导为:
因为sigmoid输出的值仅仅和输入的x值有关 。所以时值为0.所以:

  • softmax损失函数
    形式:
    函数形式:输出也是【0,1】的值,不过需要依赖最后一层所有的数来计算分母
    求导:

    所以

总结

根据上面,BP推导有三部曲,先求出,再根据分别求出。总结公式如下:



启动上面反传的导火索是最后一层的值,计算公式为:

根据最后一层不同类型的激活函数不同对待。

博主你好,文章中间 那块儿 第l+1层Zk的 对l层Zj的求导那儿 没太明白 不应该是激活函数的导数么?

2019.10.18 14:35

我也是这个问题,应该是w*激活函数导数才对啊

2019.11.07 00:40

中间有少许错误,但不失为一篇好文章,估计是作者笔误。其一在原文&[l,j]=&[l+1,k]w[l+1,k,j]a[l,j],应把a[l,j]修正为a[l,j]对z[l,j]的偏导

原文地址:https://www.cnblogs.com/schips/p/12164130.html

时间: 2024-10-09 18:31:44

读懂反向传播算法(bp算法)的相关文章

【神经网络和深度学习】笔记 - 第二章 反向传播算法

上一章中我们遗留了一个问题,就是在神经网络的学习过程中,在更新参数的时候,如何去计算损失函数关于参数的梯度.这一章,我们将会学到一种快速的计算梯度的算法:反向传播算法. 这一章相较于后面的章节涉及到的数学知识比较多,如果阅读上有点吃力的话也可以完全跳过这一章,把反向传播当成一个计算梯度的黑盒即可,但是学习这些数学知识可以帮助我们更深入的理解神经网络. 反向传播算法的核心目的是对于神经网络中的任何weight或bias计算损失函数$C$关于它们的偏导数$\frac{\partial C}{\par

记一下机器学习笔记 多层感知机的反向传播算法

<神经网络与机器学习>第4章前半段笔记以及其他地方看到的东西的混杂-第2.3章的内容比较古老预算先跳过. 不得不说幸亏反向传播的部分是<神机>里边人话比较多的部分,看的时候没有消化不良. 多层感知机 书里前三章的模型的局限都很明显,对于非线性可分问题苦手,甚至简单的异或都弄不了.于是多层感知机(也就是传说中的神经网络)就被发明了出来对付这个问题. 多层感知机就是由一系列的感知机,或者说神经元组成,每个神经元都接受若干的输入(树突)并产生一个输出(轴突). 这些神经元被分成若干层,每

机器学习之反向传播算法

Thoughts of Algorithms 博客园 首页 联系 订阅 管理 随笔 - 54  文章 - 1  评论 - 141 机器学习公开课笔记(5):神经网络(Neural Network)--学习 这一章可能是Andrew Ng讲得最不清楚的一章,为什么这么说呢?这一章主要讲后向传播(Backpropagration, BP)算法,Ng花了一大半的时间在讲如何计算误差项δδ,如何计算ΔΔ的矩阵,以及如何用Matlab去实现后向传播,然而最关键的问题--为什么要这么计算?前面计算的这些量到

stanford coursera 机器学习编程作业 exercise4--使用BP算法训练神经网络以识别阿拉伯数字(0-9)

在这篇文章中,会实现一个BP(backpropagation)算法,并将之应用到手写的阿拉伯数字(0-9)的自动识别上. 训练数据集(training set)如下:一共有5000个训练实例(training instance),每个训练实例是一个400维特征的列向量(20*20 pixel image).用 X 矩阵表示整个训练集,则 X 是一个 5000*400 (5000行 400列)的矩阵 另外,还有一个5000*1的列向量 y ,用来标记训练数据集的结果.比如,第一个训练实例对应的输出

什么是反向传播

作者:韩小雨 类别:①反向传播算法  ②反向传播模型 反向传播算法(英:Backpropagation algorithm,简称:BP算法) 算法简介:是一种监督学习算法,常被用来训练多层感知机. 于1974年,Paul Werbos[1]首次给出了如何训练一般网络的学习算法,而人工神经网络只是其中的特例.不巧的,在当时整个人工神经网络社群中却无人知晓Paul所提出的学习算法.直到80年代中期,BP算法才重新被David Rumelhart.Geoffrey Hinton及Ronald Will

DL4NLP——神经网络(一)前馈神经网络的BP反向传播算法步骤整理

这里把按[1]推导的BP算法(Backpropagation)步骤整理一下,备忘使用.[1] 中直接使用矩阵微分的记号进行推导,整个过程十分简洁.而且这种矩阵形式有一个非常大的优势就是对照其进行编程实现时非常方便. 但其实用标量计算推导也有一定的好处,比如可以清楚地知道某个权重是被谁所影响的. 记号约定: $L$:神经网络的层数.输入层不算. $n^l$:第 $l$ 层神经元的个数.偏置神经元不算在内. $W^{l}\in\mathbb R^{n^l\times n^{l-1}}$:第 $l-1

神经网络训练中的Tricks之高效BP(反向传播算法)

神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) [email protected] http://blog.csdn.net/zouxy09 Tricks!这是一个让人听了充满神秘和好奇的词.对于我们这些所谓的尝试应用机器学习技术解决某些问题的人,更是如此.曾记得,我们绞尽脑汁,搓手顿足,大喊“为什么我跑的模型不work?”,“为什么我实现的效果那么差?”,“为什么我复现的结果没有他论文里面说的那么好?”.有人会和你说“你不懂调参!

稀疏自动编码之反向传播算法(BP)

假设给定m个训练样本的训练集,用梯度下降法训练一个神经网络,对于单个训练样本(x,y),定义该样本的损失函数: 那么整个训练集的损失函数定义如下: 第一项是所有样本的方差的均值.第二项是一个归一化项(也叫权重衰减项),该项是为了减少权连接权重的更新速度,防止过拟合. 我们的目标是最小化关于 W 和 b 的函数J(W,b). 为了训练神经网络,把每个参数 和初始化为很小的接近于0的随机值(例如随机值由正态分布Normal(0,ε2)采样得到,把 ε 设为0.01), 然后运用批量梯度下降算法进行优

深度学习基础--神经网络--BP反向传播算法

BP算法: 1.是一种有监督学习算法,常被用来训练多层感知机.  2.要求每个人工神经元(即节点)所使用的激励函数必须可微. (激励函数:单个神经元的输入与输出之间的函数关系叫做激励函数.) (假如不使用激励函数,神经网络中的每层都只是做简单的线性变换,多层输入叠加后也还是线性变换.因为线性模型的表达能力不够,激励函数可以引入非线性因素) 下面两幅图分别为:无激励函数的神经网络和激励函数的神经网络 如图所示,加入非线性激活函数后的差异:上图为用线性组合逼近平滑曲线来分割平面,下图为使用平滑的曲线