BP算法-即误差反向传播法简介
1986年
反向传播算法(back propagation,简称BP模型)是1986年由Rumelhart、Hinton和Williams为首的科学家提出的概念,是用于多层神经网络训练的著名算法,有理论依据坚实、推导过程严谨、概念清楚、通用性强等优点。该方法到今天仍然很流行。
解决了神经网络在引入隐层节点后的学习 (或 训 练 )问题后,已经发展了许多的改进学习算法,如快速下降法 、共轭梯度法 、一维搜 索 法 及 Ievenberg—Marquardt法 等 ,其收敛速度很快,能满 足实时性要求,但也存在着一些问题 。
学习误差反向传播法有两种方式:
一是基于计算式,
这种方法严密且简洁,但是对数学功底要求比较高;
二是基于计算图(Computational graph),比较直观,易于理解。
目前各大深度学习框架如Tensorflow、PyTorch、Theano、百度飞桨PaddlePaddle等都以计算图作为描述反向传播算法的基础。本章我们将基于计算图来介绍误差反向传播法。
百度飞桨PaddlePaddle深度学习平台简介
百度飞桨(PaddlePaddle)是一个深度学习平台,其反向传播(Backpropagation)过程是基于计算图(Computation Graph)模式实现的。
在计算图模式中,深度学习模型的前向传播过程被表示为一个计算图,图中的节点表示变量或操作,边表示数据依赖关系。当模型进行前向传播时,数据从输入层流向输出层,并在计算图中生成中间结果和最终输出。
在反向传播过程中,飞桨会根据计算图自动计算梯度并更新模型参数。具体来说,它会从输出层开始,沿着计算图反向遍历,计算每个节点的梯度,并将梯度传播回前一层,直到达到输入层。这样,模型就可以根据计算出的梯度来更新参数,以优化模型的性能。
因此,可以说百度飞桨的反向传播是基于计算图模式实现的,而不是简单的计算式。这种计算图模式使得飞桨能够高效地处理复杂的深度学习模型,并支持多种不同的硬件平台。
计算图概述
计算图将计算过程用图形来表示。这里说的图形是数据结构图,通过多个节点和边表示(连接节点的直线称为“边”)。
计算图的优点是,可以通过正向传播和反向传播高效地计算各个变量的导数值。
计算图的反向传播
复合函数求导的链式法则和计算图
各种节点的反向传播(求导)
加法节点
乘法节点
ReLU层
Sigmoid层
除法节点
exp节点
Softmax-with-Loss层
卷积层、池化层和全连接层都是线性的,
激活函数是用来引入非线性因素的。
激活函数有如:激活函数ReLU,Sigmoid函数,Softmax-with-Loss层的反向传播等
激活函数一般具有以下性质:
非线性: 线性模型的不足我们前边已经提到。
处处可导:反向传播时需要计算激活函数的偏导数,所以要求激活函数除个别点外,处处可导。
单调性:当激活函数是单调的时候,单层网络能够保证是凸函数。
输出值的范围: 当激活函数输出值是有限的时候,基于梯度的优化方***更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate.
激活函数ReLU=max(0,x)
Sigmoid函数=1/(1+e^-x)
Softmax-with-Loss层(即包含交叉熵损失函数)
Softmax层的反向传播得到了(y1 − t1, y2 − t2, y3 − t3)这样“漂亮”的结果。由于(y1, y2, y3)是Softmax层的输出,(t1, t2, t3)是监督数据,所以(y1 − t1, y2 − t2, y3 − t3)是Softmax层的输出和监督标签的差。
反向传播得到( y1 − t1, y2 − t2, y3 − t3)这样“漂亮”的结果。实际上,这样“漂亮” 的结果并不是偶然的,而是为了得到这样的结果,特意设计了交叉熵误差函数。
误差反向传播法的优点
误差反向传播算法可以计算输出目标函数 f 对所有的参数 w 的偏微分,这样就可以得到 f 相对于网络参数的梯度 delta f ,有了这个梯度,我们就可以使用梯度下降法对网络进行训练,即每次沿着梯度的负方向(-delta f)移动一小步,不断重复,直到网络输出误差最小。
实际上,反向传播算法就是追踪权重(和偏置)的这种微小的变化是如何影响到损失函数的技术。
反向传播算法的特点是效率高
反向传播可以同时计算所有的偏导数,仅仅使用一次前向传播,加上一次后向传播。假设对一个节点求偏导需要的时间为单位时间,运算时间呈线性关系,那么网络的时间复杂度如下式所示:O(Network Size)=O(V+E),V为节点数、E为连接边数。为了提高反向传播算法的效率,我们通过高度并行的向量,利用GPU进行计算。
本blog地址:https://blog.csdn.net/hsg77