反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是:
- 将训练集数据输入到ANN的输入层, 经过隐藏层, 最后达到输出层并 输出结果, 这是ANN的前向传播过程;
- 由于ANN的输出结果与实际结果有误差, 则计算估计值与实际值之间 的误差, 并将该误差从输出层向隐藏层反向传播, 直至传播到输入层;
- 在反向传播的过程中, 根据误差调整各种参数的值; 不断迭代上述过 程, 直至收敛。
1、变量定义
上图是一个三层人工神经网络,layer1至layer3分别是输入层、隐藏层和输出层。如图,先定义一些变量:
3、公式及其推导
首先,将第层第个神经元中产生的错误(即实际值与预测值之间的误差)定义为:
δ∂C∂zlj
本文将以一个输入样本为例进行说明,此时代价函数表示为:
C=12||y−aL||2=12∑j(yj−aLj)2
公式1(计算最后一层神经网络产生的错误):
δ2=∇aC⊙σ′(zL)
其中,
⊙
表示Hadamard乘积,用于矩阵或向量之间点对点的乘法运算。公式1的推导过程如下:
δLj=∂C∂zLj=∂C∂aLj⋅∂aLj∂zLj
δLj=∂C∂aL⊙∂aL∂zL=∇aC⊙σ′(zL)
公式2(由后往前,计算每一层神经网络产生的错误):
δl=((wl+1)Tδl+1)⊙σ′(zl)
推导过程:
δLj=∂C∂zLj=∑k∂C∂zl+1k⋅∂al+1k∂alj⋅∂alj∂zlj=∑kδl+1k⋅∂(wl+1kjalj)+bl+1k∂alj⋅σ′(zlj)=∑k∂l+1k⋅wl+1kj⋅σ′(zlj)
得出:
∂l=((wl+1)Tδl+1)⊙σ′(zl)
公式3(计算权重的梯度):
∂C∂wljk=al−1kδlj
推导过程:
∂C∂wljk=∂C∂zlj⋅∂zlj∂wljk=δl∂(wljkal−1k+blj)∂wljk=al−1kδlj
公式4(计算偏置的梯度):
∂C∂blj=δlj
推导过:
:
∂C∂blj=∂C∂zlj⋅∂zlj∂blj=δl∂(wljkal−1k+blj)∂blj=δlj
4. 反向传播算法伪码
输入训练集
对于训练集中的每个样本x,设置输入层(Input layer)对应的激活前
前向传播:
zl=wlal−1+bl,al=σ(zl)
计算输出层产生的错误:
δ2=∇aC⊙σ′(zL)
反向传播错误:
∂l=((wl+1)Tδl+1)⊙σ′(zl)
使用梯度下降(gradient descent),训练参数:
wl⟶wl−ηm∑xδx,l(ax,l−1)T
bl⟶bl−ηm∑xδx,l
内容来自:https://blog.csdn.net/u014313009/article/details/51039334