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

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

几个定义

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

这里写图片描述

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

这里写图片描述

有了这些表示, l t h 层第 j t h 个神经元的激活值就与 ( l 1 ) t h 层的激活值建立起了联系

(1) a j l = σ ( k w j k l a k l 1 + b j l )
求和是在 ( l 1 ) t h 层所有 k 个神经元上进行的。上式可以方便改写成矩阵乘法的形式
(2) a l = σ ( w l a l 1 + b l )
这里为了简化计算,我们再引入一个中间变量,称为带权输入,
(3) z l = w l a l 1 + b l
那么激活值可以表示为带权输入的函数 a l = σ ( z l )

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

BP算法四个基本方程

反向传播其实是对权重和偏置变化影响代价函数过程的理解。其本质的含义是计算偏导数 C / w j k l C / b j l 。但是为了计算简便性,我们需要再定义一个中间变量, δ j l ,表示 l t h 层第 j t h 个神经元的误差。我们定义

(4) δ j l C z j l

方程1

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

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

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

方程(BP1)对 δ L 来说是个按分量构成的。这是一个非常好的表达式,但不是我们期望的用矩阵表示的形式。以矩阵形式重写方程其实很简单,

(BP1a) δ L = a C . σ ( z L )
这里 a C 被定义成一个向量,其元素是偏导数 C / a j L 。你可以将 a C 看成是 C 关于输出激活值的改变速度。方程(BP1)和方程(BP1a)的等价也是显而易见的,所以现在开始,我们会用(BP1)表示这两个方程。举个例子,在二次代价函数时,我们有 a C = ( a L y ) ,所以 (BP1) 的整个矩阵形式就变成
(5) δ L = ( a L y ) . σ ( z L )

方程2

使用下一层的误差 δ l + 1 来表示当前层的误差 δ l :特别地,

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

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

下一步,我们将证明(BP2),为此,我们想要以 δ k l + 1 = C / z k l + 1 的形式重写 δ j l = C / z j l 。我们可以用链式法则:

δ j l = C z j l = k C z k l + 1 z k l + 1 z j l = k z k l + 1 z j l δ k l + 1

这里最后一行我们交换了右边的两项,并用 δ k l + 1 的定义代入。为了对最后一行的第一项求值,注意:
z k l + 1 = j w k j l + 1 a j l + b k l + 1 = j w k j l + 1 σ ( z j l ) + b k l + 1
做微分,我们得到
z k l + 1 z j l = w k j l + 1 σ ( z j l )
把它代入我们得到
δ j l = k w k j l + 1 δ k l + 1 σ ( z j l )
这正是以分量形式写的(BP2)。

方程3

代价函数关于网络中偏置的改变率

(BP3) C b j l = δ j l
误差 δ j l 和偏导数值 C / b j l 完全一致。这是很好的性质,因为(BP1) 和 (BP2) 已经告诉我们如何计算 δ j l
这个证明十分简单:
C b j l = C z j l z j l b j l = C z j l = δ j l

方程4

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

(BP4) C w j k l = a k l 1 δ j l
这告诉我们如何计算偏导数 C / w j k l ,其中 δ l a l 1 这些量我们都已经知道如何计算了。

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

C w j k l = C z j l z j l w j k l = a k l 1 δ j l

小节:四个基本公式
(BP1) δ L = a C . σ ( z L )
(BP2) δ l = ( ( w l + 1 ) T δ l + 1 ) . σ ( z l )
(BP3) C b j l = δ j l
(BP4) C w j k l = a k l 1 δ j l