反向传播算法

反向传播(,意為误差反向传播,缩写为BP)是對多層人工神经网络進行梯度下降的算法,也就是用链式法则以网络每层的权重為變數计算损失函数的梯度,以更新权重來最小化损失函数。

动机
任何监督式学习算法的目标是找到一个能把一组输入最好地映射到其正确的输出的函数。例如一个简单的分类任务,其中输入是动物的图像,正确的输出将是动物的名称。一些输入和输出模式可以很容易地通过单层神经网络(如感知器)学习。但是这些单层的感知机只能学习一些比较简单的模式,例如那些非模式。例如,人可以通过识别动物的图像的某些特征进行分类,例如肢的数目,皮肤的纹理(无论是毛皮,羽毛,鳞片等),该动物的体型,以及种种其他特征。但是,单层神经网络必须仅仅使用图像中的像素的强度来学习一个输出一个标签函数。因为它被限制为仅具有一个层,所以没有办法从输入中学习到任何抽象特征。多层的网络克服了这一限制,因为它可以创建内部表示,并在每一层学习不同的特征。这个梯度会在简单中经常用来求最小化误差的权重。通常“反向传播”这个词使用更一般的含义,用来指涵盖了计算梯度以及在随机梯度下降法中使用的整个过程。在适用反向传播算法的网络中,它通常可以快速收敛到令人满意的极小值。

直观理解
学习作为一个优化问题
在给出反向传播算法的数学推导之前,我们举一个例子来培养关于神经元的真实输出与正确输出间的直观感受。考虑一个有两个输入单元、一个输出单元、没有隐藏单元的简单神经网络。每个神经元都使用输入的加权作为。

在训练之前,我们将随机分配权重w_{1}, w_{2}。之后神经元根据训练实例进行学习。在此例中,训练集为 (x_{1}, x_{2}, t),其中 x_{1} 与 x_{2} 是网络的输入,t 为正确输出(在给定相同的输入时网络最终应当产生的输出)。网络在给定 x_{1} 和 x_{2} 时,会计算一个输出 y,很可能与 t 不同(因为权重最初是随机的)。为了衡量期望输出 t 与实际输出 y 之间的差异,一个常用的方法是采用平方误差测度:
:E=(t-y)^2 \,,
其中 E 为误差。

举例来讲,考虑单一训练实例的网络:(1, 1, 0),输入 x_{1} 与 x_{2} 均为1,正确输出 t 为 0。现在若将实际输出 y 画在x轴,误差 E 画在 y 轴,得出的是一条抛物线。抛物线的极小值对应输出 y,最小化了误差 E。对于单一训练实例,极小值还会接触到 x 轴,这意味着误差为零,网络可以产生与期望输出 t 完全匹配的输出 y。因此,把输入映射到输出的问题就化为了一个找到一个能产生最小误差的函数的最佳化問題。

然而,一个神经元的输出取决于其所有输入的加权总和:
:y=x_1w_1 + x_2w_2,
其中 w_1 和 w_2 是从输入单元到输出单元相连的权重。因此,误差取决于输入到该神经元的权重,也是网络要学习最终需要改变的。若每个权重都画在一个水平的轴上,而误差画在垂直轴上,得出的就是一个抛物面(若一个神经元有 k 个权重,则误差曲面的維度就会是 k+1,因而就是二维抛物线的 k+1 维等价)。

反向传播算法的目的是找到一组能最大限度地减小误差的权重。寻找抛物线或任意维度中的任何函数的极大值的方法有若干种。其中一种方法是通过求解方程组,但这依赖于网络是一个線性系統,而目标也需要可以训练多层非線性网络(因为多层线性网络与单层网络等价)。在反向传播中使用的方法是梯度下降法。

运用类比理解梯度下降法
梯度下降法背后的直观感受可以用假设情境进行说明。一个被卡在山上的人正在试图下山(即试图找到极小值)。大雾使得能见度非常低。因此,下山的道路是看不见的,所以他必须利用局部信息来找到极小值。他可以使用梯度下降法,该方法涉及到察看在他当前位置山的陡峭程度,然后沿着负陡度(即下坡)最大的方向前进。如果他要找到山顶(即极大值)的话,他需要沿着正陡度(即上坡)最大的方向前进。使用此方法,他会最终找到下山的路。不过,要假设山的陡度不能通过简单地观察得到,而需要复杂的工具测量,而这个工具此人恰好有。需要相当长的一段时间用仪器测量山的陡峭度,因此如果他想在日落之前下山,就需要最小化仪器的使用率。问题就在于怎样选取他测量山的陡峭度的频率才不致偏离路线。

在这个类比中,此人代表反向传播算法,而下山路径表示能使误差最小化的权重集合。山的陡度表示误差曲面在该点的斜率。他要前行的方向对应于误差曲面在该点的梯度。用来测量陡峭度的工具是微分(误差曲面的斜率可以通过对平方误差函数在该点求导数计算出来)。他在两次测量之间前行的距离(与测量频率成正比)是算法的学习速率。参见限制一节中对此类型“爬山”算法的限制的讨论。

限制

  • 结果可能会收敛到极值。如果只有一个极小值,梯度下降的“爬山”策略一定可以起作用。然而,往往是误差曲面有许多局部最小值和最大值。如果梯度下降的起始点恰好介于局部最大值和局部最小值之间,则沿着梯度下降最大的方向会到达局部最小值。
  • 从反向传播学习获得的收敛很慢。
  • 在反向传播学习的收敛性不能保证。

** 然而,收敛到全局最小值据说使用自适应终止条件得到保证。

  • 反向传播学习不需要输入向量的标准化(normalization);然而,标准化可提高性能。

历史
弗拉基米尔·瓦普尼克在他的书《支持向量机》中首次发表反向传播算法。在1969年和何毓琦将其描述为多级动态系统优化方法。直到1974年以后在神经网络的背景下应用,并由、、杰弗里·辛顿和的著作,它才获得认可,并引发了一场人工神经网络的研究领域的“文艺复兴”。在21世纪初人们对其失去兴趣,但在2010年后又拥有了兴趣,如今可以通过GPU等大型现代运算器件用于训练更大的网络。例如在2013年,顶级语音识别器现在使用反向传播算法训练神经网络。

注释
参见

  • 人工神经网络
  • 生物神经网络

*

  • 表徵學習
  • AdaBoost
  • 過適

参考文献
外部連結
*[https://web.archive.org/web/20160206002034/http://numericinsight.com/uploads/A_Gentle_Introduction_to_Backpropagation.pdf A Gentle Introduction to Backpropagation - An intuitive tutorial by Shashi Sathyanarayana] The article contains pseudocode ("Training Wheels for Training Neural Networks") for implementing the algorithm.
*[http://msdn.microsoft.com/en-us/magazine/jj658979.aspx Neural Network Back-Propagation for Programmers (a tutorial)]
*[http://www.matematica.ciens.ucv.ve/dcrespin/Pub/backprop.pdf Backpropagation for mathematicians]

*[http://www.codeproject.com/KB/recipes/BP.aspx Implementation of BackPropagation in C++]
*[http://www.codeproject.com/KB/cs/BackPropagationNeuralNet.aspx Implementation of BackPropagation in C#]
*[https://github.com/guycole/BackProp1 Implementation of BackPropagation in Java]
*[https://github.com/agibsonccc/java-deeplearning/blob/67ffee2c431f5fdbf3be9f393279c98caaa35f76/deeplearning4j-core/src/main/java/org/deeplearning4j/nn/BaseMultiLayerNetwork.java Another Implementation of BackPropagation in Java]
*[http://ai4r.org/neuralNetworks.html Implementation of BackPropagation in Ruby]
*[http://arctrix.com/nas/python/bpnn.py Implementation of BackPropagation in Python]
*[http://freedelta.free.fr/r/php-code-samples/artificial-intelligence-neural-network-backpropagation/ Implementation of BackPropagation in PHP]
*[http://www.tek271.com/documents/others/into-to-neural-networks Quick explanation of the backpropagation algorithm]
*[http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html Graphical explanation of the backpropagation algorithm]
*[http://pandamatak.com/people/anand/771/html/node37.html Concise explanation of the backpropagation algorithm using math notation] by Anand Venkataraman
*[http://en.wikiversity.org/wiki/Learning_and_Neural_Networks Backpropagation neural network tutorial at the Wikiversity]

评论 (0)

  • 还没有评论,来抢沙发吧。