前言
BP 算法是迄今最成功的神经网络学习算法,现实任务中使用神经网络时,大多是在使用 BP 算法进行训练。BP 算法允许来自代价函数的信息通过网络向后流动,以便计算梯度。
反向传播的四个基本方程及推导
定义
在接下来的公式中:
wljk
表示从
(l−1)th
层的
kth
个神经元到
lth
层的
jth
个神经元的链接上的权重。
alj
表示
lth
层第
jth
个神经元的激活值。
blj
表示在
lth
层第
jth
个神经元的偏置。
C
表示代价函数。
有了上面的表示,我们可以将两个相邻层之间的激活值通过方程关联起来:
zlj=∑kwljkal−1k+bljalj=σ(zlj)
其中 σ() 为激励函数。
上面两个公式的向量化形式:
zl=wlal−1+blal=σ(zl)
关于代价函数的两个假设:
1. 代价函数可以被写成一个在每个训练样本 x 上的代价函数
2. 代价可以写成神经网络输出的函数 cost C=C(aL) 。
最后,定义
l
层的第
δlj≡∂C∂zlj
反向传播其实是对权重和偏置变化影响代价函数过程的理解。最终极的含义其实就是计算偏导数 ∂C∂wljk 和 ∂C∂blj 。为了计算这些值,我们首先引入了一个中间量 ∂lj ,这个我们称为在 lth 层第 jth 个神经元上的误差。
反向传播将给出计算误差 δ 的流程,然后将其关联到计算 ∂C∂wljk 和 ∂C∂blj 上。
四个方程式
我们先直接给出四个基本方程,然后给出推导的过程。
δL=∇aC⊙σ′(zl)(BP1)δl=((wl+1)Tδl+1)⊙σ′(zl)(BP2)∂C∂blj=δlj(BP3)∂C∂wljk=al−1kδlj(BP4)
其中, ⊙ 运算符表示矩阵对应元素相乘。
四个基本方程的推导
BP1:
已知定义
δLj=∂C∂zLj
,应用链式法则,得:
δLj=∂C∂aLj∂aLj∂zLj
由 aLj=σ(zLj) 得:
δLj=∂C∂aLjσ′(zLj)
这就是 (BP1) 的分量形式。
BP2:
δ=∂C∂zlj=∑k∂C∂zl+1k∂zl+1k∂zlj=∑k∂zl+1k∂zljδl+1k
因为 (注意 wl+1kj 表示的意义, k,j 都是表示一层网路的第几个神经元,重要的是符号的位置):
zl+1k=∑jwl+1kjalj+bl+1k=∑jwl+1kjσ(zlj)+bl+1k
做微分,得:
∂zl+1k∂zlj=wl+1kjσ′(zlj)
把他带入上式,得:
δlj=∑kwl+1kjδl+1kσ′(zlj)
这就是(BP2)的分量形式。
BP3:
δlj=∂C∂zlj=∂C∂blj∂blj∂zlj
由 zlj=∑kwljkal−1k+blj 得:
∂blj∂zlj=1
因此:
∂C∂blj=δlj
BP4:
∂C∂wljk=∂C∂zlj∂zlj∂wljk
由 zlj=∑kwljkal−1k+blj 得:
∂zlj∂wljk=al−1k
因此:
∂C∂wljk=al−1kδlj
反向传播算法流程
- 输入
x
:为输入层设置对应的激活值
a1 -
- 前向传播:对每个 l=2,3,…,L 计算相应的 zl=wlal−1+bl 和 al=σ(zl)
- 输出层误差 δL :计算向量 δL=∇aC⋅σ′(zL)
- 反向误差传播:对每个 l=L−1,L−2,…,2, 计算 δl=((wl+1)Tδl+1)⋅σ′(zl)
- 输出:代价函数的梯度由 ∂C∂wljk=al−1kδlj 和 ∂C∂blj=δlj 得出