冒泡~周末愉快鸭!
反向传播算法(BackPropagation)
概念
1.什么是BP 算法?
BP算法全称叫作误差反向传播(error Back Propagation,或者也叫作误差逆传播)算法。BP神经网络是由一个输入层、一个输出层和一个或多个隐层构成的,它的激活函数采用sigmoid函数。在这其中,输入信号经输入层输入,通过隐层计算由输出层输出,输出值与标记值比较,若有误差,将误差反向由输出层向输入层传播,在这个过程中,利用梯度下降算法对神经元权值进行调整。
2.为什么要使用BP算法?直接使用梯度下降不行吗?
不行的,纵然梯度下降神通广大,却不是万能的。梯度下降可以应对带有明确求导函数的情况,或者说可以应对那些可以求出误差的情况,比如逻辑回归,我们可以把它看做没有隐层的网络;但对于多隐层的神经网络,输出层可以直接求出误差来更新参数,但其中隐层的误差是不存在的,因此不能对它直接应用梯度下降,而是先将误差反向传播至隐层,然后再应用梯度下降,其中将误差从末层往前传递的过程需要链式法则(Chain Rule)的帮助,因此反向传播算法可以说是梯度下降在链式法则中的应用。
举个例子:
如下图所示,这是带有一个隐层的三层神经网络,
-小女孩→隐藏层节点
-小黄帽→输出层节点
-哆啦A梦→误差
小女孩左侧接受输入信号,经过隐层节点产生输出结果,哆啦A梦则指导参数往更优的方向调整。由于哆啦A梦可以直接将误差反馈给小黄帽,所以与小黄帽直接相连的左侧参数矩阵可以直接通过误差进行参数优化(实纵线);而与小女孩直接相连的左侧参数矩阵由于不能得到哆啦A梦的直接反馈而不能直接被优化(虚棕线)。但由于反向传播算法使得哆啦A梦的反馈可以被传递到小女孩那进而产生间接误差,所以与小女孩直接相连的左侧权重矩阵可以通过间接误差得到权重更新,迭代几轮,误差会降低到最小。(也就是说小男孩得到的是直接误差,小女孩是间接误差)
具体过程
接下来将用例子演示整个过程
假设有下图这样一个带权值的网络层,第一层是输入层,包含两个神经元i1,i2,和截距项b1;第二层是隐含层,包含两个神经元h1,h2和截距项b2,第三层是输出o1,o2,每条线上标的wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数。
输入数据 i1=0.05,i2=0.10;
输出数据 o1=0.01,o2=0.99;
初始权重 w1=0.15,w2=0.20,w3=0.25,w4=0.30;w5=0.40,w6=0.45,w7=0.50,w8=0.55
目标:给出输入数据i1,i2(0.05和0.10),使输出尽可能与原始输出o1,o2(0.01和0.99)接近。
步骤一:前向传播
通过前向传播我们得到输出值为[0.75136079 , 0.772928465],与实际值[0.01 , 0.99]相差还很远,接下来我们对误差进行反向传播,更新权值,重新计算输出。
步骤二:反向传播
进行完这一小步之后,需要先引入一个概念:链式法则
补充:
3.输入层---->隐含层的权值更新:
在上文计算总误差对w5的偏导时,是从out(o1)---->net(o1)---->w5,但是在隐含层之间的权值更新时,是out(h1)---->net(h1)---->w1,而out(h1)会接受E(o1)和E(o2)两个地方传来的误差,所以这个地方两个都要计算。
进入计算:
此过程具体参考感谢(https://www.cnblogs.com/charlotte77/p/5629865.html)
总结
根据BP算法的过程演示,可以得到BP算法的一般过程:
1. 正向传播FP(求损失)
此过程中,我们根据输入的样本、给定的初始化权重值W和偏置项的值b, 计算最终输出值以及输出值与实际值之间的损失值。(注意:如果损失值不在给定的范围内则进行接下来反向传播的过程, 否则停止W,b的更新。)
2.反向传播BP(回传误差)
将输出以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。(主要为: ①隐层到输出层的参数W的更新 ②从输入层到隐层的参数W的更新。)
Ending~理解计算和公式还是很重要的鸭!