首页 > 代码库 > 什么是反向传播

什么是反向传播

什么是反向传播

作者:韩小雨

类别:①反向传播算法  ②反向传播模型

反向传播算法(英:Backpropagation algorithm,简称:BP算法)

算法简介:是一种监督学习算法,常被用来训练多层感知机。 于1974年,Paul Werbos[1]首次给出了如何训练一般网络的学习算法,而人工神经网络只是其中的特例。不巧的,在当时整个人工神经网络社群中却无人知晓Paul所提出的学习算法。直到80年代中期,BP算法才重新被David Rumelhart、Geoffrey Hinton及Ronald Williams[2][3]、David Parker[4]和Yann LeCun[5]独立发现,并获得了广泛的注意,引起了人工神经网络领域研究的第二次热潮。

适用范围:BP算法是Delta规则的推广,要求每个人工神经元(节点)所使用的激励函数必须是可微的。BP算法特别适合用来训练前向神经网络。

算法过程:反向传播算法(BP算法)主要由两个环节(激励传播、权重更新)反复循环迭代,直到网络的对输入的响应达到预定的目标范围为止。

每次迭代中的传播环节包含两步:

(前向传播阶段)将训练输入送入网络以获得激励响应;

(反向传播阶段)将激励响应同训练输入对应的目标输出求差,从而获得隐层和输出层的响应误差。对于每个突触上的权重,按照以下步骤进行更新:

将输入激励和响应误差相乘,从而获得权重的梯度;

将这个梯度乘上一个比例并取反后加到权重上。

这个比例将会影响到训练过程的速度和效果,因此称为“训练因子”。梯度的方向指明了误差扩大的方向,因此在更新权重的时候需要对其取反,从而减小权重引起的误差。

具体算法:反向传播算法(Backpropagation)已经是神经网络模型进行学习的标配。但是有很多问题值得思考一下:

反向传播算法的作用是什么? 神经网络模型的学习算法一般是SGD。SGD需要用到损失函数C关于各个权重参数w_{jk},b_j的偏导数\frac{ \partial C }{ \partial w_{jk} } , \frac{ \partial C }{ \partial b_j} 。一个模型的参数w,b是非常多的,故而需要反向传播算法快速计算\frac{ \partial C }{ \partial w_{jk} } , \frac{ \partial C }{ \partial b_j} 。也就是说反向传播算法是一种计算偏导数的方法。

为什么要提出反向传播算法? 在反向传播算法提出之前人们应该想到了使用SGD学习模型,也想到了一些办法求解网络模型的偏导数,但这些算法求解效率比较低,所以提出反向传播算法来更高效的计算偏导数。(那时的网络模型还比较浅只有2-3层,参数少。估计即便不适用反向传播这种高效的算法也能很好的学习。一旦有人想使用更深的网络自然会遇到这个偏导数无法高效计算的问题,提出反向传播也就势在必行了)

反向传播怎么样实现高效计算偏导数的? 请先回顾一下当初我们学习微积分时是如何计算偏导数的? (链式法则,具体看下面)

式子 e=(a+b)*(b+1) 可以用如下计算图表达:

技术分享    

 

 

 

 

 

技术分享a=2,b=1则有:

 

当我们训练神经网络时,把损失看作权重参数的函数,需要计算损失关于每一个权重参数的偏导数(然后用梯度下降法学习)。 神经网络的权重参数可以是百万甚至过亿级别。因此 反向求导模式(反向传播算法)可以极大的加速学习。

神经网络计算图

对应计算图如下:(只展开了最后两层的计算图)

 

 

 

 

 

 

 

 

 

 

 

技术分享绿色代表权重参数w_{jk},橙色代表基底参数b_j。可见虽然网络图上只是简单几条线,计算图还是蛮复杂的。

 

现在我们在计算图箭头上标出对应的偏导数(只标出了一部分)。

技术分享

 

 

 

 

 

 

 

 

 

 

 

反向传播四公式

 

 

 

 

技术分享

技术分享具体流程

 

 

 

 

 

BP(反向传播)算法了。事实上,如果不是要做理论研究而只是想快速应用神经网络来干活的话,了解如何使用 tensorflow 等帮你处理梯度的成熟的框架可能会比了解算法细节要更好一些。但即使如此,了解神经网络背后的原理总是不亏的,在某种意义上它也能告诉我们应该选择怎样的神经网络结构来进行具体的训练

要想知道 BP 算法的推导,我们需要且仅需要知道两点知识:求导及其链式法则;如果想知道原理的话,还需要知道梯度相关的一些理论。同时我们可以从名字上知道,BP 算法和前向传导算法的“方向”刚好相反:前向传导是由后往前一路传导,反向传播则是由前往后一路传播

 

先从直观上理解一下 BP 的原理。总体上来说,BP 的目的是利用梯度来更新结构中的变量以使得损失函数最小化。

总结:脑皮层中的反向传播

 

1)放电信号不是大问题

 

★The fact that neurons send spikes rather than real numbers is not a problem-Spikes are a great regularizer.

 

分析: 生物神经元放电, 而不是以实数计算. 并且电信号本身就是个很好的Weight调整约束器(regularizer).

 

2) 时间导数

 

★Error derivatives can be represented as temporal derivatives.

 

-This allows a neuron to represent both its activity and its error derivative in the same axon.

 

分析: 误差导数可以被分解为线性时间导数, 这样, 一个神经元就无须准备传递两种Signal了.

 

(temporal__derivatives∝activity=y)

 

3) 放电时刻即是反向传播的时刻

 

★Spike-time dependent plasticity is the signature of backpropagation learning.

 

4) 双向权值不是大问题

 

★The problem that each bottom-up connection needs to have a corresponding top-down connection is a non-problem.

 

-Random top-down weights work just fine.

 

分析:生物神经网络中,逆向权值应该是存在的。即便逆向权值不能反向传播自适应调整,问题也不大。

                     本文主要参考:Neural networks and deep learni  百度

什么是反向传播