反向传播算法

反向传播（英語：Backpropagation，意為误差反向传播，缩写为BP）是對多層人工神经网络進行梯度下降的算法，也就是用链式法则以网络每层的权重為變數计算损失函数的梯度，以更新权重來最小化损失函数。 任何监督式学习算法的目标是找到一个能把一组输入最好地映射到其正确的输出的函数。例如一个简单的分类任务，其中输入是动物的图像，正确的输出将是动物的名称。一些输入和输出模式可以很容易地通过单层神经网络（如感知器）学习。但是这些单层的感知机只能学习一些比较简单的模式，例如那些非线性可分的（英语：linearly separable）模式。例如，人可以通过识别动物的图像的某些特征进行分类，例如肢的数目，皮肤的纹理（无论是毛皮，羽毛，鳞片等），该动物的体型，以及种种其他特征。但是，单层神经网络必须仅仅使用图像中的像素的强度来学习一个输出一个标签函数。因为它被限制为仅具有一个层，所以没有办法从输入中学习到任何抽象特征。多层的网络克服了这一限制，因为它可以创建内部表示，并在每一层学习不同的特征。 第一层可能负责从图像的单个像素的输入学习线条的走向。第二层可能就会结合第一层所学并学习识别简单形状（如圆形）。每升高一层就学习越来越多的抽象特征，如上文提到的用来图像分类。每一层都是从它下方的层中找到模式，就是这种能力创建了独立于为多层网络提供能量的外界输入的内部表达形式。 反向传播算法的发展的目标和动机是找到一种训练的多层神经网络的方法，于是它可以学习合适的内部表达来让它学习任意的输入到输出的映射。 反向传播算法（BP 算法）主要由两个阶段组成：激励传播与权重更新。 每次迭代中的传播环节包含两步： （前向传播阶段）将训练输入送入网络以获得預測結果； （反向传播阶段）對預測結果同训练目标求差(损失函数)。 对于每个突触上的权重，按照以下步骤进行更新： 将输入激励和响应误差相乘，从而获得权重的梯度； 将这个梯度乘上一个比例并取反后加到权重上。 这个比例（百分比）将会影响到训练过程的速度和效果，因此成为「训练因子」。梯度的方向指明了误差扩大的方向，因此在更新权重的时候需要对其取反，从而减小权重引起的误差。 第 1 和第 2 阶段可以反复循环迭代，直到网络对输入的响应达到满意的预定的目标范围为止。 假設多層人工神经网络的第 l {\displaystyle l} 層是由线性算子 W l : R n l − 1 → R n l {\displaystyle W^{l}:\mathbb {R} ^{n_{l-1}}\to \mathbb {R} ^{n_{l}}} 和激活函數 f l : R → R {\displaystyle f^{l}:\mathbb {R} \to \mathbb {R} } 所構成，也就是說，第 l {\displaystyle l} 層的輸入是 n l − 1 {\displaystyle n_{l-1}} 維实数向量 y l − 1 = ( x 1 , x 2 , ⋯ , x n l − 1 ) {\displaystyle y^{l-1}=(x_{1},\,x_{2},\,\cdots ,\,x_{n_{l-1}})} 輸出則為 n l {\displaystyle n_{l}} 維實向量 y l = ( y 1 , y 2 , ⋯ , y n l ) {\displaystyle y^{l}=(y_{1},\,y_{2},\,\cdots ,\,y_{n_{l}})} 換句話說，第 l − 1 {\displaystyle l-1} 層的輸出 y l − 1 {\displaystyle y^{l-1}} 就是第 l {\displaystyle l} 層的輸入。 而 y l {\displaystyle y^{l}} 和 y l − 1 {\displaystyle y^{l-1}} 的具體(以第 i {\displaystyle i} 分量表示)遞迴關係為 y l i = f l { [ W l ( y l − 1 ) ] i } = f l [ ∑ j = 1 n l − 1 y j l − 1 W j i l ] {\displaystyle {y^{l}}_{i}=f^{l}\{\,[W^{l}(y^{l-1})]_{i}\,\}=f^{l}\left[\,\sum _{j=1}^{n_{l-1}}y_{j}^{l-1}W_{ji}^{l}\,\right]} （ 1 ≤ i ≤ n l {\displaystyle 1\leq i\leq n_{l}} ） 上式通常會簡寫為 y l = f l [ W l ( y l − 1 ) ] {\displaystyle y^{l}=f^{l}[\,W^{l}(y^{l-1})\,]} 若這個多層人工神經網路總共有 L {\displaystyle L} 層，也就是說， y 0 {\displaystyle y^{0}} 是最一開始的輸入，而 y L {\displaystyle y^{L}} 是最後一層的輸出，那跟损失函数 g {\displaystyle g} 是以最後一層輸出 y L {\displaystyle y^{L}} 的各分量 y L i {\displaystyle {y^{L}}_{i}} (與真實值)為變數。依據上面的遞迴關係，可以把 g {\displaystyle g} 進一步的轉成以第 L {\displaystyle L} 層的輸入 y L − 1 {\displaystyle y^{L-1}} 與權重因子 W m i j {\displaystyle {W^{m}}_{ij}} 為變數的函数 g L {\displaystyle g^{L}} g L ( W i j L , y k L − 1 ) = g [ f L ( ∑ a = 1 n L − 1 y a L − 1 W a b L ) ] {\displaystyle g^{L}(W_{ij}^{L},\,{y_{k}^{L-1}})=g\left[\,f^{L}\left(\sum _{a=1}^{n_{L-1}}y_{a}^{L-1}W_{ab}^{L}\right)\,\right]} （ 1 ≤ k ≤ n L − 1 {\displaystyle 1\leq k\leq n_{L-1}} , 1 ≤ b ≤ n L {\displaystyle 1\leq b\leq n_{L}} ） 由此可以歸納到 1 ≤ l < L {\displaystyle 1\leq l<L} 的情況(注意到前幾層的權重因子不會消失在表達式中) g l ( W i j l , ⋯ , W i j L , y k l − 1 ) = g l + 1 [ W i j l + 1 , ⋯ , W i j L , f l ( ∑ a = 1 n l − 1 y a l − 1 W a b l ) ] {\displaystyle g^{l}(W_{ij}^{l},\,\cdots ,\,W_{ij}^{L},\,{y_{k}^{l-1}})=g^{l+1}\left[\,W_{ij}^{l+1},\,\cdots ,\,W_{ij}^{L},\,f^{l}\left(\sum _{a=1}^{n_{l-1}}y_{a}^{l-1}W_{ab}^{l}\right)\,\right]} （ 1 ≤ k ≤ n l − 1 {\displaystyle 1\leq k\leq n_{l-1}} , 1 ≤ b ≤ n l {\displaystyle 1\leq b\leq n_{l}} ） 那這樣如果假設適當的可微分條件，由链式法则會有以下的遞迴關係 ( 若取 g L + 1 := g {\displaystyle g^{L+1}:=g} 和 1 ≤ l ≤ L {\displaystyle 1\leq l\leq L} ) ∂ g l ∂ W c d l = ∂ g l + 1 ∂ y l d | y l d = f l ( x ) × d f l d x | x = ∑ y l − 1 a W a d l × y l − 1 c {\displaystyle {\frac {\partial g^{l}}{\partial W_{cd}^{l}}}={\frac {\partial g^{l+1}}{\partial {y^{l}}_{d}}}{\bigg |}_{{y^{l}}_{d}=f^{l}(x)}\times {\frac {df^{l}}{dx}}{\bigg |}_{x=\sum {y^{l-1}}_{a}W_{ad}^{l}}\times {y^{l-1}}_{c}} ∂ g l ∂ y l − 1 c = ∑ i = 1 n l [ ∂ g l + 1 ∂ y l i | y l i = f l ( x ) × d f l d x | x = ∑ y l − 1 a W a i l × W c i l ] {\displaystyle {\frac {\partial g^{l}}{\partial {y^{l-1}}_{c}}}=\sum _{i=1}^{n_{l}}\left[\,{\frac {\partial g^{l+1}}{\partial {y^{l}}_{i}}}{\bigg |}_{{y^{l}}_{i}=f^{l}(x)}\times {\frac {df^{l}}{dx}}{\bigg |}_{x=\sum {y^{l-1}}_{a}W_{ai}^{l}}\times W_{ci}^{l}\,\right]} 這樣就可以依據這個遞迴關係進行梯度下降，因為計算上是由 y L i {\displaystyle {y^{L}}_{i}} 對 损失函数 g {\displaystyle g} 的偏微分出發，一層層向後遞推出前面各層的權重因子梯度，所以被稱為反向傳播。 注意到可將輸入設為 y l − 1 = ( 1 , x 1 , x 2 , ⋯ , x n l − 1 ) {\displaystyle y^{l-1}=(1,\,x_{1},\,x_{2},\,\cdots ,\,x_{n_{l-1}})} 並多加一行權重因子 W i 0 l {\displaystyle W_{i0}^{l}} 為偏移，就可以把有偏移的多層網路納入剛剛討論的範圍內。 三层网络算法（只有一个隐藏层）： 初始化网络权值（通常是小的随机值） do forEach 训练样本 ex prediction = neural-net-output(network, ex) // 正向传递 actual = teacher-output(ex) 计算输出单元的误差 (prediction - actual) 计算 Δ w h {\displaystyle \Delta w_{h}} 对于所有隐藏层到输出层的权值 // 反向传递 计算 Δ w i {\displaystyle \Delta w_{i}} 对于所有输入层到隐藏层的权值 // 继续反向传递 更新网络权值 // 输入层不会被误差估计改变 until 所有样本正确分类或满足其他停止标准 return 该网络 这个算法的名称意味着误差会从输出结点反向传播到输入结点。严格地讲，反向传播算法对网络的可修改权值计算了网络误差的梯度。 这个梯度会在简单随机梯度下降法（英语：stochastic gradient descent）中经常用来求最小化误差的权重。通常“反向传播”这个词使用更一般的含义，用来指涵盖了计算梯度以及在随机梯度下降法中使用的整个过程。在适用反向传播算法的网络中，它通常可以快速收敛到令人满意的极小值。 在给出反向传播算法的数学推导之前，我们举一个例子来培养关于神经元的真实输出与正确输出间的直观感受。考虑一个有两个输入单元、一个输出单元、没有隐藏单元的简单神经网络。每个神经元都使用输入的加权作为线性输出（英语：Artificial neuron）。 在训练之前，我们将随机分配权重 w 1 , w 2 {\displaystyle w_{1},w_{2}} 。之后神经元根据训练实例进行学习。在此例中，训练集为 ( x 1 {\displaystyle x_{1}} , x 2 {\displaystyle x_{2}} , t {\displaystyle t} )，其中 x 1 {\displaystyle x_{1}} 与 x 2 {\displaystyle x_{2}} 是网络的输入， t {\displaystyle t} 为正确输出（在给定相同的输入时网络最终应当产生的输出）。网络在给定 x 1 {\displaystyle x_{1}} 和 x 2 {\displaystyle x_{2}} 时，会计算一个输出 y {\displaystyle y} ，很可能与 t {\displaystyle t} 不同（因为权重最初是随机的）。为了衡量期望输出 t {\displaystyle t} 与实际输出 y {\displaystyle y} 之间的差异，一个常用的方法是采用平方误差测度： E = ( t − y ) 2 {\displaystyle E=(t-y)^{2}\,} , 其中 E {\displaystyle E} 为误差。 举例来讲，考虑单一训练实例的网络： ( 1 , 1 , 0 ) {\displaystyle (1,1,0)} ，输入 x 1 {\displaystyle x_{1}} 与 x 2 {\displaystyle x_{2}} 均为1，正确输出 t {\displaystyle t} 为 0。现在若将实际输出 y {\displaystyle y} 画在x轴，误差 E {\displaystyle E} 画在 y {\displaystyle y} 轴，得出的是一条抛物线。抛物线的极小值对应输出 y {\displaystyle y} ，最小化了误差 E {\displaystyle E} 。对于单一训练实例，极小值还会接触到 x {\displaystyle x} 轴，这意味着误差为零，网络可以产生与期望输出 t {\displaystyle t} 完全匹配的输出 y {\displaystyle y} 。因此，把输入映射到输出的问题就化为了一个找到一个能产生最小误差的函数的最佳化問題。 然而，一个神经元的输出取决于其所有输入的加权总和： y = x 1 w 1 + x 2 w 2 {\displaystyle y=x_{1}w_{1}+x_{2}w_{2}} , 其中 w 1 {\displaystyle w_{1}} 和 w 2 {\displaystyle w_{2}} 是从输入单元到输出单元相连的权重。因此，误差取决于输入到该神经元的权重，也是网络要学习最终需要改变的。若每个权重都画在一个水平的轴上，而误差画在垂直轴上，得出的就是一个抛物面（若一个神经元有 k {\displaystyle k} 个权重，则误差曲面的維度就会是 k + 1 {\displaystyle k+1} ，因而就是二维抛物线的 k + 1 {\displaystyle k+1} 维等价）。 反向传播算法的目的是找到一组能最大限度地减小误差的权重。寻找抛物线或任意维度中的任何函数的极大值的方法有若干种。其中一种方法是通过求解方程组，但这依赖于网络是一个線性系統，而目标也需要可以训练多层非線性网络（因为多层线性网络与单层网络等价）。在反向传播中使用的方法是梯度下降法。 梯度下降法背后的直观感受可以用假设情境进行说明。一个被卡在山上的人正在试图下山（即试图找到极小值）。大雾使得能见度非常低。因此，下山的道路是看不见的，所以他必须利用局部信息来找到极小值。他可以使用梯度下降法，该方法涉及到察看在他当前位置山的陡峭程度，然后沿着负陡度（即下坡）最大的方向前进。如果他要找到山顶（即极大值）的话，他需要沿着正陡度（即上坡）最大的方向前进。使用此方法，他会最终找到下山的路。不过，要假设山的陡度不能通过简单地观察得到，而需要复杂的工具测量，而这个工具此人恰好有。需要相当长的一段时间用仪器测量山的陡峭度，因此如果他想在日落之前下山，就需要最小化仪器的使用率。问题就在于怎样选取他测量山的陡峭度的频率才不致偏离路线。 在这个类比中，此人代表反向传播算法，而下山路径表示能使误差最小化的权重集合。山的陡度表示误差曲面在该点的斜率。他要前行的方向对应于误差曲面在该点的梯度。用来测量陡峭度的工具是微分（误差曲面的斜率可以通过对平方误差函数在该点求导数计算出来）。他在两次测量之间前行的距离（与测量频率成正比）是算法的学习速率。参见限制一节中对此类型“爬山”算法的限制的讨论。 结果可能会收敛到极值。如果只有一个极小值，梯度下降的“爬山”策略一定可以起作用。然而，往往是误差曲面有许多局部最小值和最大值。如果梯度下降的起始点恰好介于局部最大值和局部最小值之间，则沿着梯度下降最大的方向会到达局部最小值。 从反向传播学习获得的收敛很慢。 在反向传播学习的收敛性不能保证。 然而，收敛到全局最小值据说使用自适应终止条件得到保证。 反向传播学习不需要输入向量的标准化（normalization）；然而，标准化可提高性能。 弗拉基米尔·瓦普尼克在他的书《支持向量机》中首次发表反向传播算法。在1969年阿瑟·E·布莱森（英语：Arthur E. Bryson）和何毓琦将其描述为多级动态系统优化方法。 直到1974年以后在神经网络的背景下应用，并由保罗·维波斯（英语：Paul Werbos）、大卫·鲁梅尔哈特（英语：David E. Rumelhart）、杰弗里·辛顿和罗纳德·J·威廉斯（英语：Ronald J. Williams）的著作，它才获得认可，并引发了一场人工神经网络的研究领域的“文艺复兴”。在21世纪初人们对其失去兴趣，但在2010年后又拥有了兴趣，如今可以通过GPU等大型现代运算器件用于训练更大的网络。例如在2013年，顶级语音识别器现在使用反向传播算法训练神经网络。 注意多层神经网络一般采用非线性的激活函数，而此例中的激活函数为线性函数，所以并不能给出明确的示范。虽然多层神经网络的误差表面要复杂许多，但在小范围内，我们可以用一个抛物面来估测这样的复杂表面。我们在这里采用线性的例子，因为它们简单易懂。 人工神经网络 生物神经网络 灾难性干扰（英语：Catastrophic interference） 表徵學習 AdaBoost 過適 Rumelhart, David E.; Hinton, Geoffrey E.; Williams, Ronald J. Learning representations by back-propagating errors. Nature. 8 October 1986, 323 (6088): 533–536. doi:10.1038/323533a0.  Paul J. Werbos (1994). The Roots of Backpropagation. From Ordered Derivatives to Neural Networks and Political Forecasting. New York, NY: John Wiley & Sons, Inc. Lalis, Jeremias; Gerardo, Bobby; Byun, Yung-Cheol. An Adaptive Stopping Criterion for Backpropagation Learning in Feedforward Neural Network (PDF). International Journal of Multimedia and Ubiquitous Engineering. 2014, 9 (8): 149–156 [17 March 2015]. doi:10.14257/ijmue.2014.9.8.13. （原始内容 (PDF)存档于2016-03-04）.  ISBN 1-931841-08-X, Stuart Russell; Peter Norvig. Artificial Intelligence A Modern Approach. : 578. The most popular method for learning in multilayer networks is called Back-propagation. It was first invented in 1969 by Bryson and Ho, but was largely ignored until the mid-1980s.  Arthur Earl Bryson, Yu-Chi Ho. Applied optimal control: optimization, estimation, and control. Blaisdell Publishing Company or Xerox College Publishing. 1969: 481.  Paul J. Werbos. Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Sciences. PhD thesis, Harvard University, 1974 Alpaydın, Ethem. Introduction to machine learning 2nd ed. Cambridge, Mass.: MIT Press. 2010: 250. ISBN 978-0-262-01243-0. ...and hence the name backpropagation was coined (Rumelhart, Hinton, and Williams 1986a).  引文格式1维护：冗余文本 (link) 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. Neural Network Back-Propagation for Programmers (a tutorial)（页面存档备份，存于互联网档案馆） Backpropagation for mathematicians（页面存档备份，存于互联网档案馆） Chapter 7 The backpropagation algorithm（页面存档备份，存于互联网档案馆） of Neural Networks - A Systematic Introduction（页面存档备份，存于互联网档案馆） by Raúl Rojas (ISBN 978-3540605058) Implementation of BackPropagation in C++（页面存档备份，存于互联网档案馆） Implementation of BackPropagation in C#（页面存档备份，存于互联网档案馆） Implementation of BackPropagation in Java（页面存档备份，存于互联网档案馆） Another Implementation of BackPropagation in Java Implementation of BackPropagation in Ruby（页面存档备份，存于互联网档案馆） Implementation of BackPropagation in Python（页面存档备份，存于互联网档案馆） Implementation of BackPropagation in PHP（页面存档备份，存于互联网档案馆） Quick explanation of the backpropagation algorithm（页面存档备份，存于互联网档案馆） Graphical explanation of the backpropagation algorithm（页面存档备份，存于互联网档案馆） Concise explanation of the backpropagation algorithm using math notation（页面存档备份，存于互联网档案馆） by Anand Venkataraman Backpropagation neural network tutorial at the Wikiversity（页面存档备份，存于互联网档案馆）