您的位置:首页 > 理论基础 > 计算机网络

神经网络学习(三)反向(BP)传播算法(1)

2018-03-13 10:38 861 查看
系列博客是博主学习神经网络中相关的笔记和一些个人理解,仅为作者记录笔记之用,不免有很多细节不对之处。

几个定义

我们首先给出网络中权重的清晰定义。我们使用 wljkwjkl 表示从 (l−1)th(l−1)th 层的第 kthkth 个神经元到 lthlth 层第 jthjth 个神经元的权重。例如,下图给出了网络中第二层的第四个神经元到第三层的第⼆个神经元的链接上的权重:



之所以如此定义权重矩阵的下标是,利于矩阵的相乘。我们对网络的偏置和激活值也会使用类似的表示。显式地,我们使用 bljbjl 表示 lthlth 层第 jthjth 个神经元的偏置,使用 aljajl 表示 lthlth 层第 jthjth 个神经元的激活值,下面的图清晰地解释了这样表示的含义:



有了这些表示,lthlth 层第 jthjth 个神经元的激活值就与 (l−1)th(l−1)th 层的激活值建立起了联系alj=σ(∑kwljkal−1k+blj)(1)(1)ajl=σ(∑kwjklakl−1+bjl)求和是在 (l−1)th(l−1)th 层所有 kk 个神经元上进行的。上式可以方便改写成矩阵乘法的形式al=σ(wlal−1+bl)(2)(2)al=σ(wlal−1+bl)这里为了简化计算,我们再引入一个中间变量,称为带权输入,zl=wlal−1+bl(3)(3)zl=wlal−1+bl那么激活值可以表示为带权输入的函数 al=σ(zl)al=σ(zl)。

在推导反向传播算法前,还需要定义个矩阵对应元素相乘的算子,这里采用Matlab的乘法符号 .*(点乘,矩阵对应元素相乘)。

BP算法四个基本方程

反向传播其实是对权重和偏置变化影响代价函数过程的理解。其本质的含义是计算偏导数 ∂C/∂wljk∂C/∂wjkl 和 ∂C/∂blj∂C/∂bjl。但是为了计算简便性,我们需要再定义一个中间变量,δljδjl,表示 lthlth 层第 jthjth 个神经元的误差。我们定义δlj≡∂C∂zlj(4)(4)δjl≡∂C∂zjl

方程1

输出层误差的方程,δLδL: 每个元素定义如下:

δLj=∂C∂aLjσ′(zLj)(BP1)(BP1)δjL=∂C∂ajLσ′(zjL)上式利用了微分链式法则,右式第一个项 ∂C/∂aLj∂C/∂ajL 表示代价函数随着 jthjth 输出激活值的变化而变化的速度。假如 CC 不太依赖一个特定的输出神经元 jj,那么 δLjδjL 就会很小,这也是我们想要的效果。右式第二项 σ′(zLj)σ′(zjL) 刻画了在 zLjzjL 处激活函数 σσ 变化的速度。

注意到在(BP1)中的每个部分都是很好计算的。特别地,我们在计算网络行为时计算 zLjzjL,这仅仅需要一点点额外工作就可以计算 σ′(zLj)σ′(zjL)。当然 ∂C/∂aLj∂C/∂ajL 依赖于代价函数的形式。然而,给定了代价函数,计算 ∂C/∂aLj∂C/∂ajL 就没有什么大问题了。例如,如果我们使用二次函数,那么 C=12∑j(yj−aj)2C=12∑j(yj−aj)2,所以 ∂C/∂aLj=(aj−yj)∂C/∂ajL=(aj−yj),这其实很容易计算。

方程(BP1)对 δLδL 来说是个按分量构成的。这是一个非常好的表达式,但不是我们期望的用矩阵表示的形式。以矩阵形式重写方程其实很简单,δL=∇aC.∗σ′(zL)(BP1a)(BP1a)δL=∇aC.∗σ′(zL)这里 ∇aC∇aC 被定义成一个向量,其元素是偏导数 ∂C/∂aLj∂C/∂ajL。你可以将 ∇aC∇aC 看成是 CC 关于输出激活值的改变速度。方程(BP1)和方程(BP1a)的等价也是显而易见的,所以现在开始,我们会用(BP1)表示这两个方程。举个例子,在二次代价函数时,我们有 ∇aC=(aL−y)∇aC=(aL−y),所以 (BP1) 的整个矩阵形式就变成δL=(aL−y).∗σ′(zL)(5)(5)δL=(aL−y).∗σ′(zL)

方程2

使用下一层的误差 δl+1δl+1 来表示当前层的误差 δlδl:特别地,δl=((wl+1)Tδl+1).∗σ′(zl)(BP2)(BP2)δl=((wl+1)Tδl+1).∗σ′(zl)其中 (wl+1)T(wl+1)T 是 (l+1)th(l+1)th 层权重矩阵 wl+1wl+1 的转置。这个公式看上去有些复杂,但每一个元素有很好的解释。假设我们知道 l+1thl+1th 层的误差 δl+1δl+1。当我们应用转置的权重矩阵 (wl+1)T(wl+1)T,我们可以凭直觉地把它看作是在沿着网络反向移动误差,给了我们度量在 lthlth 层输出的误差方法。

通过组合(BP1) 和(BP2),我们可以计算任何层的误差 δlδl。首先使用(BP1) 计算 δLδL,然后应用方程(BP2)来计算δL−1δL−1,然后再次用方程(BP2)来计算 δL−2δL−2,如此一步一步地反向传播完整个网络。

下一步,我们将证明(BP2),为此,我们想要以 δl+1k=∂C/∂zl+1kδkl+1=∂C/∂zkl+1 的形式重写 δlj=∂C/∂zljδjl=∂C/∂zjl。我们可以用链式法则:δlj=∂C∂zlj=∑k∂C∂zl+1k∂zl+1k∂zlj=∑k∂zl+1k∂zljδl+1kδjl=∂C∂zjl=∑k∂C∂zkl+1∂zkl+1∂zjl=∑k∂zkl+1∂zjlδkl+1

这里最后一行我们交换了右边的两项,并用 δl+1kδkl+1 的定义代入。为了对最后一行的第一项求值,注意:zl+1k=∑jwl+1kjalj+bl+1k=∑jwl+1kjσ(zlj)+bl+1kzkl+1=∑jwkjl+1ajl+bkl+1=∑jwkjl+1σ(zjl)+bkl+1做微分,我们得到

∂zl+1k∂zlj=wl+1kjσ′(zlj)∂zkl+1∂zjl=wkjl+1σ′(zjl)把它代入我们得到δlj=∑kwl+1kjδl+1kσ′(zlj)δjl=∑kwkjl+1δkl+1σ′(zjl)这正是以分量形式写的(BP2)。

方程3

代价函数关于网络中偏置的改变率: ∂C∂blj=δlj(BP3)(BP3)∂C∂bjl=δjl误差 δljδjl 和偏导数值 ∂C/∂blj∂C/∂bjl 完全一致。这是很好的性质,因为(BP1) 和 (BP2) 已经告诉我们如何计算 δljδjl。

这个证明十分简单:

∂C∂blj=∂C∂zlj∂zlj∂blj=∂C∂zlj=δlj∂C∂bjl=∂C∂zjl∂zjl∂bjl=∂C∂zjl=δjl

方程4

代价函数关于网络中权重的改变率: 特别地,

∂C∂wljk=al−1kδlj(BP4)(BP4)∂C∂wjkl=akl−1δjl这告诉我们如何计算偏导数 ∂C/∂wljk∂C/∂wjkl,其中 δlδl 和 al−1al−1 这些量我们都已经知道如何计算了。

这个公式的证明也十分简单:

∂C∂wljk=∂C∂zlj∂zlj∂wljk=al−1kδlj∂C∂wjkl=∂C∂zjl∂zjl∂wjkl=akl−1δjl

小节:四个基本公式

δL=∇aC.∗σ′(zL)(BP1)(BP1)δL=∇aC.∗σ′(zL)δl=((wl+1)Tδl+1).∗σ′(zl)(BP2)(BP2)δl=((wl+1)Tδl+1).∗σ′(zl)∂C∂blj=δlj(BP3)(BP3)∂C∂bjl=δjl∂C∂wljk=al−1kδlj(BP4)(BP4)∂C∂wjkl=akl−1δjl
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: