什么是反向传播算法
反向传播算法(Backpropagation)的全称是误差反向传播(Error Backward Propagation)算法(以下简称 BP 算法)。BP 算法主要由前向传播过程和反向传播两个过程组成:
- 前向传播时:输入信息从神经网络的输入层进入,通过一个或多个隐藏层,再由输出层输出。
- 反向传播时:将输出值与实际值进行比较,将误差反向由输出层经隐藏层向输入层进行传播;在这个过程中,利用梯度下降法对神经元权重值进行调整。
权重值不断调整的过程就是训练神经网络或神经网络学习的过程。
构造神经网络
神经网络结构
神经网络一般依次由一个输入层、一个或多个隐藏层和一个输出层构成。我们构造如下简单的神经网络为例进行说明,在输出层应用 Sigmoid 激活函数:
激活函数
激活函数能给网络提供非线性建模能力。如果没有激活函数,那么网络仅能够表达线性映射。激活函数有很多种,这里使用的 Sigmoid 函数的公式和图像如下:
初始权重
初始权重在算法开始时随机生成,假设生成的初始权重如下:
训练样本
假设获得如下的三组训练样本,上标表示样本次序:
- 输入值:x(1) = (2,3,1),x(2) = (1,0,2),x(3) = (3,1,1)
- 输出值:t(1) = 0.64,t(2) = 0.52,t(3) = 0.36
训练目标是给定输入值 x 时,模型的输出值 y 尽可能接近实际输出值 t。
前向传播过程
输入层 → 隐藏层
神经元 h1 和 h2 的计算公式如下:
隐藏层 → 输出层
输出值 y 的计算公式如下:
计算
根据上述公式,分别对三个样本进行计算:
x |
h1 | h2 | s | y | t |
---|---|---|---|---|---|
x(1) = (2,3,1) | 2.4 | 1.8 | 2.28 | 0.907 | 0.64 |
x(2) = (1,0,2) | 0.75 | 1.2 | 0.84 | 0.698 | 0.52 |
x(3) = (3,1,1) | 1.35 | 1.4 | 1.36 | 0.796 | 0.36 |
上表也在最后列出了样本实际的输出值。可以看出,此时三个样本的输出值都与期望值很不一样。
损失函数
损失函数(Loss Function)用来计算模型输出值与期望值之间的误差,损失函数也称为目标函数(Objective Function)或成本函数(Cost Function)。一个常用的损失函数是均方误差(Mean-Square Error, MSE):
其中 m 为样本数量。由公式计算本次前向传播的误差为:
E = [(0.64-0.907)2 + (0.52-0.698)2 + (0.36-0.796)2] / (2*3) = 0.234
损失函数衡量模型的精确度,损失函数值越小,模型精确度就越高,模型学习的目的就是尽可能降低损失函数值。将输入值和输出值看成常数,损失函数可看成是以各权重为自变量的函数。要找到使得损失函数值最小的权重,常用方法就是梯度下降法。
反向传播过程
以下将使用批量梯度下降法(BGD)更新权重,即所有样本都参与梯度计算。设定学习率 η = 0.5。
如果读者不熟悉梯度下降法,请先阅读文档——梯度下降法。
输出层 → 隐藏层
从输出层到隐藏层有两个权重 w1 和 w2,分别对这两个权重值进行调整。
调整 w1 时,要计算 w1 对误差 E 产生了多少影响,使用链式法则对 w1 求偏导:
分别求解每个梯度:
带入数值计算:
∂E/∂y = [(0.907-0.64) + (0.698-0.52) + (0.796-0.36)] / 3 = 0.294
∂y/∂s = [0.907*(1-0.907) + 0.698*(1-0.698) + 0.796*(1-0.796)] / 3 = 0.152
∂s/∂w1 = (2.4 + 0.75 + 1.35) / 3 = 1.5
最终得到 ∂E/∂w1 = 0.294*0.152*1.5 = 0.067
由于全部三个样本均参与计算,因此在计算 ∂y/∂s 和 ∂s/∂w1 时,对三个样本的结果求和再求平均。
调整后的 w1 := w1 - η ⋅ ∂E/∂w1 = 0.8 - 0.5*0.067 = 0.766
调整 w2 的方法与调整 w1 类似,这里直接给出结果,w2 从 0.2 调整为 0.167。
隐藏层 → 输入层
从隐藏层到输入层有六个权重 v11、v12、v21、v22、v31 和 v32,分别对这六个权重值进行调整。
调整 v11 时,要计算 v11 对误差 E 产生了多少影响,使用链式法则对 v11 求偏导:
前两个梯度在调整 w1 和 w2 时已经求过了,只需求解后两个梯度:
带入数值计算:
∂E/∂y = 0.294
∂y/∂s = 0.152
∂s/∂h1 = 0.8
∂h1/∂v11 = (2 + 1 + 3) / 3 = 2
最终得到 ∂E/∂v11 = 0.294*0.152*0.8*2 = 0.072
调整后的 v11 := v11 - η ⋅ ∂E/∂v11 = 0.15 - 0.5*0.072 = 0.114
调整其他五个权重的方法与调整 v11 类似,这里直接给出结果:
- v12 从 0.2 调整为 0.191
- v21 从 0.6 调整为 0.576
- v22 从 0.3 调整为 0.294
- v31 从 0.3 调整为 0.282
- v32 从 0.5 调整为 0.496
模型训练
将上述调整后的权重值带入模型并使用相同的三个样本重新进行一次前向传播,得到的误差 E = 0.192,相比于第一次前向传播的误差 E = 0.234,有了明显提升。
BP 算法重复上述前向传播和反向传播过程对模型进行迭代训练,直至达到预设的训练次数或时间,或误差小于某个阈值。