什么是反向传播(BP, Back Propagation)算法
BP算法(即误差反向传播算法)是适合于多层神经元网络的一种学习算法, 它建立在梯度下降法的基础上。BP网络的输入输出关系实质上是一种映射关系:一个n输入m输出的BP神经网络所完成的功能是从n维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。它的信息处理能力来源于简单非线性函数的多次复合, 因此具有很强的函数复现能力。这是BP算法得以应用的基础。
单个神经元的计算过程
如下图所示,

对于每个输入xi,分别乘以权重wi,求和,再经过一个非线性的**函数(sigmod等),得到输出y
即
y=f(e)e=WTX
f(o)是**函数,W是权重矩阵(此处为行向量),X为输入(行向量)。
反向传播算法计算过程

BP是一种反馈型学习网络,算法的学习过程包括两部分。
首先是信息的前向传播,然后是通过误差进行的反向传播。
通过神经网络的输入层将数据信息输入到神经网络,输入层的各个单元将数据传递给隐含层各个神经元进行。
反向传播算法的第一步是前向传播。
前向传播
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧y1y2y3y4y5y6y_predict=======f1(w(x1)1x1+w(x2)1x2)f2(w(x1)2x1+w(x2)2x2)f3(w(x1)3x1+w(x2)3x2)f4(w14y1+w24y2+w34y3)f5(w15y1+w25y2+w35y3)f6(w46y4+w56y5)y6
wij表示第i个节点对第j个节点的权重。
计算代价δ
一般情况下我们使用误差平方和表示代价。
即
δ=21(ground_truth−y_predict)2
当然极少数情况下我们也会使用简单的计算方式
δ=ground_truth−y_predict
反向传播
此时我们得到了最终的误差,也就是f6(e)的误差δ
反向传播给前面的神经元
δi表示第i个神经元的误差。
Second_hidden_layer{δ4δ5==w46∗δw56∗δ
下面计算第一个隐藏层
First_hidden_layer⎩⎪⎨⎪⎧δ1δ2δ3===w14∗δ4+w15∗δ5w24∗δ4+w25∗δ5w34∗δ4+w35∗δ5
梯度下降法修正权重
wij′=wij+biasijbiasij=ηδjdedfj(e)elementi
即
wij′=wij+ηδjdedfj(e)elementi
wij′是修正后的权重,η是学习率,e是**函数前的计算结果(本质就是对上一层结果的线性组合),dedfj(e)是这个神经元本身的结果对**函数前结果的导数,δi是第i个神经元的代价,elementi就是元素i(也就是前面的那一个元素)。
为便于理解我们写一下式子,还是以下图这个为例。

First_hidden_layer⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧wx11′=wx11+ηδ1dedf1(e)x1wx12′=wx12+ηδ2dedf2(e)x1wx13′=wx13+ηδ3dedf3(e)x1wx21′=wx21+ηδ1dedf1(e)x2wx22′=wx11+ηδ2dedf2(e)x2wx23′=wx11+ηδ3dedf3(e)x2
Second_hidden_layer⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧w14′=w14+ηδ4dedf4(e)y1w24′=w14+ηδ4dedf4(e)y2w34′=w14+ηδ4dedf4(e)y3w15′=w15+ηδ4dedf5(e)y1w25′=w25+ηδ4dedf5(e)y2w35′=w35+ηδ4dedf5(e)y3
Output_layer⎩⎪⎪⎨⎪⎪⎧w46′=w46+ηδdedf6(e)y4w56′=w56+ηδdedf6(e)y5
这样我们就完成了一次每一层连接权值的修正。
接下来是下一轮的循环:利用修正完的模型,再输入一个样本,正向传播等到y,再求δ,再反向传播回来逐层修复权值。如此循环反复就是BP神经网络的计算原理了。
归一化
归一化方法
可见参考文献4的文章
-
min−max归一化:x′=max−minx−min 实现对原始数据的等比例缩放 [0-1]
-
zero−score归一化:x=δx−μ 期望为0,方差为1
-
y=2∗max−minx−min−1 最终数据区间[-1,1]
归一化作用
- 输入数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。
- 数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。
- 由于神经网络输出层的**函数的值域是有限制的,因此需要将网络训练的目标数据映射到**函数的值域。例如神经网络的输出层若采用S形** 函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。
-
S形**函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(x)在参数a=1时,f(100)与f(5)只相差0.0067。这样数据的差异就会失去意义!
各类函数
- 线性函数 f(x)=k∗x+c
- 斜坡函数
f(x)=⎩⎪⎨⎪⎧T,x>ck∗x,∣x∣≤c−T,x<−c
- 阈值函数
f(x)={1,x≥c0,x<c
-
S型函数(Sigmoid)
f(x)=1+e−αx1(0<f(x)<1)
f′(x)=(1+e−αx)2αe−αx=αf(x)[1−f(x)]
- 双极S型函数
f(x)=1+e−αx2−1,(−1<f(x)<1)
f′(x)=(1+e−αx)22αe−αx=2α[1−f(x)2]

参考文献
1王忠勇,陈恩庆,葛强,等.误差反向传播算法与信噪分离[J].河南科学,2002,01:7-10.
2许朋.基于BP神经网络的手写数字识别[J].科技视界,2020(11):51-53.
3奔跑的Yancy.BP神经网络:计算原理详解和MATLAB实现[EB/OL].https://blog.****.net/lyxleft/article/details/82840787 ,2018-09-25.
4刘林龙.2.7 理论 神经网络讲解[EB/OL].http://www.liulinlong.cn/index.php/archives/137/ ,2020-03-28.
[5]边华清.BP神经网络[EB/OL].https://blog.****.net/xiaobian_/article/details/105444399 ,2020-04-11.