当前位置:   article > 正文

如何理解反向传播算法_反向传播算法的复杂度

反向传播算法的复杂度

如何理解反向传播算法

对于一个算法或者模型的理解可以分为直观理解,算法理解和数学证明三个层次。直观的理解能够启发思维,算法层面的理解能够消除歧义,数学证明能够提供更一般化的问题描述,为潜在的问题提供分析工具。本文试图从这三个层面对神经网络中的反向传播算法做简单的总结,文中大量的图片和公式来源于《神经网络与深度学习》一书第二章1,后续不在 一一引用。

神经网络模型的数学表示

反向传播算法是神经网络的一种权重更新算法,最早提出于20世纪70年代,直到论文 2 的出现才逐渐受到重视,后续成为神经网络学习的主流算法之一。在给出具体的数学描述之前,这里首先给出神经网络模型中所使用的数学符号的含义。

我们使用 ωjkl 表示第l1层的第k个神经元与第l层的第j个神经元的连接权重。如下图所示,ω243是 第2层的第4个神经元到第三层的第2个神经元的权重。这里jk的书写顺序初看比较别扭,需要稍微留意一下。

img

与此相似,我们使用bjl表示第l层的第j个神经元的偏置,ajl表示第l层的第j个神经元的激活值,如下图所示。

img

使用σ表示激活函数,第l1层到第l层的前向传播可以表示为:

(1)ajl=σ(kωjklakl1+bjl)

上述的求和是遍历第l1层的所有神经元。

为了方便进行矩阵化的描述,我们使用ωl表示第l层的权重矩阵,矩阵的第jk列的元素就是ωjkl。使用bl表示偏置向量,al表示激活值得向量。那么前向传播的向量表示为:

(2)al=σ(ωlal1+bl)

为了表示方便,我们又引入中间变量 zl=ωlal1+bl 表示线性组合部分,当然对于向量中的单个元素有: zjl=kωjklakl1+bjl

一个L层的神经网络可以表示为:

(3)a0=xzl=wlal1al=σ(zl)y^=aL

对代价函数的基本假设

代价函数度量模型输出与真实值的拟合程度。反向传播算法解决的基本问题就是通过不断更新权重来最小化代价函数。一个典型的二次的代价函数可以表示为:

(4)C=12nx||y(x)aL(x)||2

其中, n表示训练集的样本数量,x是单个样本, y(x)是对应的期望得到的输出, L是神经元的总层数。这里我们对代价函数做出两个基本假设。

假设一:代价函数可以表示为单个样本代价函数的平均,即代价函数可以写作:C=1nxCx,其中 Cx是单个样本的代价。

做出这个假设是因为我们后面讨论的梯度算法计算的是Cx/ωCx/b,这样我们就可以通过求平均的方式得到C/ωC/b。后续在反向传播算法的描述中,为了简化表示,Cx一般简记为C

假设二:代价函数依赖于神经网络最后一层的输出值,也就是说C=C(aL),这应该是一个比较显然的假设。

img

反向传播算法

反向传播算法解决的基本问题就是通过不断更新权重来最小化代价函数,一个自然的想法是通过梯度下降的方法来实现。牵涉到计算C/ωjkl。然后通过 ωjkl=ωjklαCωjkl 更新权重,其中α是学习率。反向传播算法就是通过误差反向传播的算法给出一个步骤来计算偏导数C/ωjkl

首先我们定义第l层第j个神经元的输入误差:

(5)δjlCzjl

反向传播算法就是利用 δjl来作为中间变量计算 Cx/ω Cx/b

反向传播算法利用四个等式来最终确定最终的偏导数,在具体介绍算法之前,我们首先引入符号来表示两个矩阵对应元素相乘的操作,比如:

[12][34]=[1324]=[38].

下面给出是个基本的等式,并给出证明。

等式一:输出层的误差公式

(BP1)δjL=CajLσ(zjL).

该等式计算输出层的误差。等式 BP1的证明是比较直观的,可以通过微积分中的链式法则很容易计算得到。

首先,

(6)δjL=CzjL=kCakLakLzjL

显然:
(7)aklzjl={0,jkσ(zjL),j=k

带入式(6)即可得到 BP1 ,证毕。我们也给出BP1向量化的等价描述:
(BP1a)δL=aCσ(zL).

等式二:给定输入误差 δl+1时, δl的计算:
(BP2)δl=((wl+1)Tδl+1)σ(zl),

同理,利用链式法则
(8)δjl=Czjl=kCzkl+1zkl+1zjl=kδkl+1zkl+1zjl,

而根据前向传播的关系:
(9)zkl+1=jwkjl+1ajl+bkl+1=jwkjl+1σ(zjl)+bkl+1.

则有
(10)zkl+1zjl=wkjl+1σ(zjl).

代入式(8)得到:
(11)δjl=kwkjl+1δkl+1σ(zjl).

同样,可以写成矩阵的形式,即可得到BP2。

等式三:给定δjl 关于偏重bjl的偏导的计算

(BP3)Cbjl=δjl.

根据: zjl=kωjklakl1+bjl 得到 zjlbjl=1 。那么
Cbjl=Czjlzjlbjl=δjl

问题得证,同样矩阵形式描述为:
(12)Cbl=δl

等式四:给定δjl 关于偏重ωjkl的偏导的计算

(BP4)Cwjkl=akl1δjl.

同样,根据zjl=kωjklakl1+bjl,得到 zjlωjkl=akl1。那么:

Cωjkl=Czjlzjlωjkl=δjlakl1

得证,同样我们可以采用矩阵形式描述:
(13)Cwl=δl(al1)T,

至此,反向传播算法中四个基础的等式证明完毕。这里做个总结:

img

BP1计算最后一层的输入误差,然后可以利用BP2迭代的计算每一层的输入误差δlj。在各层输入误差计算完毕之后就可以通过BP3和BP4计算各个参数对应的偏导数。反向传播算法的算法描述为:

  1. 输入 x: 设置初始值 a0=x
  2. 前向传播:对于l=1,2,,L,计算 zl=wlal1+bl 以及 al=σ(zl)
  3. 计算最后一层的误差 δL=aCσ(zL).
  4. 反向传播算法 对于 l=L1,L2,,1,计算 δl=((wl+1)Tδl+1)σ(zl)
  5. 计算各个参数对应的梯度 Cbl=δlCwl=δl(al1)T

从公式的角度,我们对学习过程可以获得以下理解:

  1. δl的计算依赖于σ。比如对于激活函数σ(z)=11+ez,在靠近0或1,也成为饱和状态时,其导数σ(z)接近0,那么BP2中等式第二项接近0,导致δ接近0。那么后续计算的梯度同样会接近0,从而产生梯度消失的问题;所以,实践中为了加快学习速度会采用梯度不会饱和的激活函数,如RELU函数。
  2. al接近0时,从BP4中可以看出,同样会导致梯度接近0,同样会导致参数学习过慢。

反向传播的直观理解

反向传播算法的思路来源是什么?设想反向传播算法出现以前,利用梯度下降法寻找最优参数是一个非常自然的思路,那么面临的问题同样是计算 C/ω 的问题。在看到解析求解梯度的困难后,很自然的想法可能是通过式(14)计算梯度。

(14)CwjC(w+ϵej)C(w)ϵ,

然而,这样的计算在问题复杂度增加时会面临很大的问题。对于大型的深度网络,参数数量很容易达到 104的数量级,那么按照式(14)就需要计算相应次数的前向传播才能得到估计的梯度,这在计算上是不可行的。对照反向传播算法,只需要进行一次前向传播和一次反向传播就可以完成梯度的计算,而且反向传播的计算复杂度与前向传播的复杂度是一致的。那么反向传播算法的计算效率是如何提升的呢?我们通过一个图示法进行说明。

img

假设,我们想计算ωjkl 的波动对代价值的影响,那么它的波动就会形成一个传播路径,最终产生ΔC

img

而且有:

(15)ΔCCwjklΔwjkl.

那么,在这种情况下,很自然的想法是通过 ΔC Δωjkl 来估计 Cwjkl。事实上,如果能将 ΔC归因到是哪些参数引起的,那么问题也就解决了,反向传播的思路就是利用逐层误差再加上微积分的链式规则推导得出的。

这里再提一下新理论的发展过程,一个理论的创新是非常复杂的,不断演化的过程。比如我们这里看到的反向传播的理论非常的简单明了,但这背后可能包含了很多非常复杂的演进过程。一个新的理论的发展过程往往是这样的:最开始只是一个非常粗略的想法加上非常复杂但甚至包含错误的证明,然后等引起关注之后,会有更多的人参与进来,随之更简洁更有效的证明方法,才会被提出和改进,经过这样反复的迭代最后才形成我们看到的结果。举个简单例子,对于式(5)中误差的定义,如果我们最开始将其定义为:δjl=Cajl ,那么后续的推导和证明就会非常复杂,而对于δjl的定义就是不断这么摸索而来的结果。

总结

本文介绍了反向传播的原理与算法,同时给出了一个可以说是直观理解也可以说是算法的思想来源的说明。反向传播在深度学习,神经网络学习中具有非常普遍的应用。当然,目前同深度学习遭受到的质疑一样,反向传播也遭受了一些质疑3。但不管怎么说,掌握反向传播算法的原理才能更好的改进它。博客4 包含了从第一行代码开始写神经网络的教程,感兴趣的同学可以以其为案例尝试编程实现一下。

参考文献

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/405603
推荐阅读
相关标签
  

闽ICP备14008679号