您好,欢迎访问三七文档
深度学习之反向传播算法(BackPropagation)1.算法简介反向传播算法(BP算法)主要由两个环节(激励传播、权重更新)反复循环迭代,直到网络的对输入的响应达到预定的目标范围为止。BP算法要求每个人工神经元(节点)所使用的激励函数必须是可微的。BP算法特别适合用来训练前向神经网络。2.算法原理假设有一个固定样本集,它包含个样例。可以用批量梯度下降法来求解神经网络。具体来讲,对于单个样例,其代价函数(或损失函数)为:这是一个(二分之一的)方差代价函数。给定一个包含个样例的数据集,可以定义整体代价函数为:以上公式中的第一项是一个均方差项。第二项是一个规则化项(也叫权重衰减项),其目的是减小权重的幅度,防止过度拟合。[注:通常权重衰减的计算并不使用偏置项,比如在的定义中就没有使用。一般来说,将偏置项包含在权重衰减项中只会对最终的神经网络产生很小的影响。]权重衰减参数用于控制公式中两项的相对重要性。在此重申一下这两个复杂函数的含义:是针对单个样例计算得到的方差代价函数;是整体样本代价函数,它包含权重衰减项。以上的代价函数经常被用于分类和回归问题。在分类问题中,利用或1,来代表两种类型的标签(这是因为sigmoid激活函数的值域为;如果我们使用双曲正切型激活函数,那么应该选用和作为标签)。对于回归问题,我们首先要变换输出值域,以保证其范围为(同样地,如果使用双曲正切型激活函数,要使输出值域为)。我们的目标是针对参数和来求其函数的最小值。为了求解神经网络,需要将每一个参数和初始化为一个很小的、接近零的随机值(比如说,使用正态分布生成的随机值,其中设置为),之后对目标函数使用诸如批量梯度下降法的最优化算法。因为是一个非凸函数,梯度下降法很可能会收敛到局部最优解;但是在实际应用中,梯度下降法通常能得到令人满意的结果。最后,需要再次强调的是,要将参数进行随机初始化,而不是全部置为。如果所有参数都用相同的值作为初始值,那么所有隐藏层单元最终会得到与输入值有关的、相同的函数(也就是说,对于所有,都会取相同的值,那么对于任何输入都会有:(图1))。随机初始化的目的是使对称失效。梯度下降法中每一次迭代都按照如下公式对参数和进行更新:其中是学习速率。其中关键步骤是计算偏导数。我们现在来讲一下反向传播算法,它是计算偏导数的一种有效方法。下面来介绍一下如何使用反向传播算法来计算和,这两项是单个样例的代价函数的偏导数。一旦求出该偏导数,就可以推导出整体代价函数的偏导数:以上两行公式稍有不同,第一行比第二行多出一项,是因为权重衰减是作用于而不是。3.算法实例图1三层神经网络上图是典型的三层神经网络的基本构成,LayerL1是输入层,LayerL2是隐含层,LayerL3是隐含层,给定一些数据{x1,x2,x3,...,xn},输出也是一堆数据{y1,y2,y3,...,yn},现在将它们在隐含层做某种变换,让输入的数据训练后得到期望的输出。如果输出和原始输入一样,那么就是最常见的自编码模型(Auto-Encoder)。如果输出和原始输入不一样,那么就是很常见的人工神经网络了,相当于让原始数据通过一个映射来得到希望输出的数据。在此直接举一个例子,带入数值演示反向传播法的过程,假设,有一个网络层:第一层是输入层,包含两个神经元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.88;目标:给出输入数据i1,i2(0.05和0.10),使输出尽可能与原始输出o1,o2(0.01和0.99)接近。前向传播输入层----隐含层:计算神经元h1的输入加权和:神经元h1的输出outh1:(此处用到激活函数为sigmoid函数):同理,可计算出神经元h2的输出outh2:隐含层----输出层:计算输出层神经元o1和o2的值:这样前向传播的过程就结束了,得到输出值为[0.75136079,0.772928465],与实际值[0.01,0.99]相差还很远,因此对误差进行反向传播,更新权值,重新计算输出。反向传播计算总误差总误差:(squareerror)因为有两个输出,所以分别计算o1和o2的误差,总误差为两者之和:隐含层----输出层的权值更新:以权重参数w5为例,如果想知道w5对整体误差产生了多少影响,可以用整体误差对w5求偏导求出:(链式法则)下面的图可以更直观的看清楚误差是怎样反向传播的:分别计算每个式子的值:计算:计算:(这一步实际上就是对sigmoid函数求导)计算:最后三者相乘:这样就计算出整体误差E(total)对w5的偏导值。根据w5的偏导值,更新w5的值:(其中,是学习速率,这里取0.5)同理,可更新w6,w7,w8:隐含层----隐含层的权值更新:计算过程与上述类似,但是有个地方需要变一下,在上文计算总误差对w5的偏导时,是从out(o1)----net(o1)----w5,但是在隐含层之间的权值更新时,是out(h1)----net(h1)----w1,而out(h1)会接受E(o1)和E(o2)两个地方传来的误差,所以这个地方两个都要计算。计算:先计算:同理,计算出:两者相加得到总值:再计算:再计算:最后,三者相乘:最后,更新w1的权值:同理,额可更新w2,w3,w4的权值:这样误差反向传播法就完成了,最后将更新的权值重新计算,不停地迭代,在这个例子中第一次迭代之后,总误差E(total)由0.298371109下降至0.291027924。迭代10000次后,总误差为0.000035085,输出为[0.015912196,0.984065734](原输入为[0.01,0.99]),证明效果还是较好的。
本文标题:深度学习之反向传播
链接地址:https://www.777doc.com/doc-4548608 .html