在前面几章中,我们介绍了随机梯度下降的框架和各个参数误差的求法,本章将在此基础之上介绍用于训练神经网络的反向传播算法。
一、反向传播算法(Backpropagation Algorithm)
回顾随机梯度算法的流程:
- 初始化各个参数 θ , θ={w(1),b(1),...,w(L+1),b(L+1)}
- 循环
N
次
- 对于每一个训练样本
(x(t),y(t)) - 求目标函数的反梯度方向,即 Δ=−∇θl(f(x(t);θ),y(t))−λ∇θΩ(θ)
- 更新参数 θ←θ+αΔ
其中,一个很重要的过程就是如何求目标函数的反梯度方向。假定我们已经对神经网络进行了前向传播(即通过输入计算出了各层的预激励和激励,以及最终的误差函数),综合前面几张我们说的参数误差梯度的求法,我们有:
- 计算输出梯度
- ∇a(L+1)(x)logf(x)y=−(e(y)−f(x)) ,详见第四章
- 对于
L+1
到
1
中的每一层
k ,有:
- 计算隐层梯度
∇W(k)−logf(x)y=(∇a(k)(x)−logf(x)y)(h(k−1)(x))T
∇b(k)−logf(x)y=∇a(k)−logf(x)y
详见第六章 - 计算下一层激励梯度
∇h(k−1)(x)−logf(x)y=(W(k))T(∇a(k)(x)−logf(x)y) ,详见第五章 - 计算下一层预激励梯度
∇a(k−1)(x)−logf(x)y=(∇h(k−1)(x)−logf(x)y)⊙[⋯,g′(a(k)(x)),⋯]
详见第五章
- 计算隐层梯度
二、流图表示形式
1.前向传播
前向传播算法可以表示为如下图所示的一个无环图:
如图,从输入向量 x 开始,我们可以根据其子节点计算当前节点中的值。例如,要计算
a(1)(x) ,则我们可以根据 x 、W(1) 以及 b(1) 等子节点进行计算。前向传播的最终目的是计算出各层的预激励和激励,以及最终的误差函数。根据上面对反向传播算法的描述,不难看出,前向传播是反向传播算法的必要步骤。2.反向传播
我们的最终目的是求参数的误差梯度。根据上述方法,我们已经具备了求每一个参数 θ={w(1),b(1),...,w(L+1),b(L+1)} 梯度的必要条件,只需从输出层开始,往下一层一层求各层参数梯度即可,故称为“反向传播”,其流图如下:
如图,此时我们从输出层开始,根据某节点的父节点计算该节点的梯度,过程在上面讲的很清楚,在此不再赘述。三、梯度检验
梯度检验的作用是调试你的算法,确保BP算法正确。其原理如下:
∂f(x)∂x≈f(x+ϵ)−f(x−ϵ)2ϵ其中:- f(x) 是误差函数
- x 是待检验的参数
f(x+ϵ) 是原参数值加上一个很小的数 ϵ 后的误差函数值- f(x−ϵ) 是原参数值减去一个很小的数 ϵ 后的误差函数值
- 对于每一个训练样本