附原文论文资源:https://pan.baidu.com/s/1PGocVgMkYIZqH8BbvONQHg
提取码:mzoe
复制这段内容打开「百度网盘APP 即可获取」
这篇文章描述了反向传播的过程,它是建立在梯度下降法的基础上。BP算法的学习过程由正向传播过程和反向传播过程组成。在正向传播过程中,输入信息通过输入层经隐含层,逐层处理并传向输出层。如果在输出层得不到期望的输出值,则取输出与期望的误差的平方和作为目标函数,转入反向传播,逐层求出目标函数对各神经元权值的偏导数,构成目标函数对权值向量的梯量,作为修改权值的依据,网络的学习在权值修改过程中完成。
原文是:1986年的《Learning representations by back-propagating errors》
目录
引言
本文描述了一个用于神经网络的新的学习算法,反向传播(back-propagation)。这个算法通过反复的去调整网络中的连接权重,来最小化该网络的实际输出向量和真实预期输出向量之间的差。由于权重的不断调整,那些不作为输入和输出层的内部隐藏层开始表现出任务的重要特征,并且通过这些掩藏层单元间的相互作用来发现任务的规律性。这种创造新的有用特征的能力将反向传播与早期比较简单的算法例如感知收敛(perceptron-convergence)区分开来。
目前已经有很多尝试去设计一个自组织的神经网络,目的就是为了找到一个强有效的神经网络的调整规则,利用该调整规则可以使任意连接的神经网络成为一个能够适合某种特定任务的内部结构。对于每组输入的状态向量,都有特定的输出向量。如果输入单元直接连接到输出单元,就会较容易发现这种迭代地调整连接权重的学习规则,从而减少实际输出与预期输出的差。但是当我们引入没有被实际指定的隐藏单元时,这种学习过程变得有趣并且更加困难了(在感知机里面,也存在着输入输出之间的这种特征分析器,但是由于输入的这种连接是人为规定的,并不是自动学习出来的,因此不是真正意义上的隐藏神经单元)。这个学习过程必须决定在什么情况下这些隐藏神经元应该被激活来帮助完成给定的输入输出任务,这也就意味着解释了这些神经元它能够代表什么。本文就提出了一种普遍意义上成立,而且相对来说非常简单又非常有效的的方法,这种方法足以构建合适的内部结构。
网络构建
一个最简单的学习程序是分层次的网络,其中输入层位于最底层,中间有任意数量的中间层(也就是隐藏层),输出层在最顶层。不允许同层之间或者高层向低层方向的连接,但是可以由低层向高层跳过某些中间层连接。通过设置输入向量的状态,网络就可以表示出输出网络的状态,每层单元状态向量的确定是通过对其下层利用公式(1)和公式(2)来确定的。同一层的所有单元状态是同步平行设置的,但不同层的状态向量需要顺序设置,从底层开始向上传播直到输出单元的状态确定为止。
对单元 j 的总入 ,
是连接到 j 的单元
和此连接上的权重
的输出的线性函数:
(1)
可以通过引入一个常数1作为输入来为网络单元增加一个偏差。额外输入上的权重称为偏差(bias),并且等于相反符号的阈值(threshold),可以像其他权重一样对待它。
输出值是
通过一个非线性函数,即sigmoid函数生成的:
(2)
其实并不是必须用上边给的方程(1)和(2),任何一个有界可导函数都可以作为一个输入输出函数。然而,在使用非线性方程前,利用一个线性方程将所有输入合到一个单元中,可以大大简化学习过程。
损失函数
本文的目标是能够找到一组权重,可以确保对于每一个输入向量,神经网络都会产生一个与期望输出向量相同或者十分接近的实际输出向量。对于一组固定且是有限输入输出的情况,可以通过计算真实期望的输出与实际输出的差值的平方和来计算,损失函数E定义如下方程(3):
(3)
其中,c是样本索引,j是输出神经元的索引,y是实际输出值,d是期望的输出值,为了通过梯度下降来最小化误差,需要计算损失函数E对每一个权重的偏导数,这仅仅是每个输入输出样本的偏导数之和。对于一个给定情况,误差相对于每个权重的偏导数经过两个传递后计算得到。上述说明了前向传播的过程,即每层的状态向量都是由他们从较低层接受的输入值利用方程(1)和方程(2)来确定的,而反向传播是由顶层向低层的方向通过计算偏导数来实现的,这一过程更为复杂。
链式推导
反向传播是通过对每个输出单元计算偏导数 来实现的。对方程(3)的特定样本c进行偏导数计算,并且忽略c,得到方程(4):
(4)
可以利用链式求导法则来计算:
根据方程(2)可以进一步求得,代入后可得如下方程(5):
(5)
这个公式告诉我们,我们知道从整个输入x到一个输出层单元的这个变化是如何影响误差的。但是这个整个输入只是一个更低层的状态的线性函数,而且也是连接间的权重的线性函数,因此便很容易可以计算出来改变这些输入状态和权重将会怎样影响到损失值。对一个权重从 i 到 j 的导数是:
(6)
并且对第 i 个单元的输出,可以通过第i层对第 j 层的作用(方程1)得到:
因此将所有的从 i 发出的连接都考虑进来,可以得到:
(7)
到目前为止当给出最后一层所有单元的时,我们便可以计算出倒数第二层任意单元的偏导数
。我们可以重复这个过程往前计算,不断计算出前面层的偏导数,以及
。
梯度下降
根据误差E去更新权重,第一种方法是对于每一个输入输出样本,都去更新一次权重,这样做的好处就是不需要单独分配内存去存储梯度值。还有一种是本文所使用的另外一种方法,就是在所有的输入输出样本集成训练之后去求累计的梯度,然后再去更新权重。最简单的一种梯度下降方式是按照一个固定的学习率对已经累计的求偏导数,进而去更新权重:
(8)
这种方法虽然收敛速度不如利用二阶导数的方法快,但却简单很多,并且很容易的在本地并行计算得到计算结果。在没有牺牲简便性和并行计算能力的情况下, 利用当前的梯度去修改权重空间中点的速度,而不是点的位置,可以显著的改进此算法。
(9)
t 每次加一, 是一个介于0和1之间的衰减参数,它决定当前梯度和之前的梯度对参数更新的贡献程度。