反向传播算法
反向传播（，缩写为BP）是“误差反向传播”的简称，是一种与最优化方法（如梯度下降法）结合使用的，用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失函数的梯度。这个梯度会回馈给最佳化方法，用来更新权值以最小化损失函数。
反向传播要求有对每个输入值想得到的已知输出，来计算损失函数梯度。因此，它通常被认为是一种監督式學習方法，虽然它也用在一些无监督网络（如自动编码器）中。它是多层前馈网络的的推广，可以用链式法则对每层迭代计算梯度。反向传播要求（或“节点”）的激励函数可微。
任何监督式学习算法的目标是找到一个能把一组输入最好地映射到其正确的输出的函数。例如一个简单的分类任务，其中输入是动物的图像，正确的输出将是动物的名称。一些输入和输出模式可以很容易地通过单层神经网络（如感知器）学习。但是这些单层的感知机只能学习一些比较简单的模式，例如那些非模式。例如，人可以通过识别动物的图像的某些特征进行分类，例如肢的数目，皮肤的纹理（无论是毛皮，羽毛，鳞片等），该动物的体型，以及种种其他特征。但是，单层神经网络必须仅仅使用图像中的像素的强度来学习一个输出一个标签函数。因为它被限制为仅具有一个层，所以没有办法从输入中学习到任何抽象特征。多层的网络克服了这一限制，因为它可以创建内部表示，并在每一层学习不同的特征。 第一层可能负责从图像的单个像素的输入学习线条的走向。第二层可能就会结合第一层所学并学习识别简单形状（如圆形）。每升高一层就学习越来越多的抽象特征，如上文提到的用来图像分类。每一层都是从它下方的层中找到模式，就是这种能力创建了独立于为多层网络提供能量的外界输入的内部表达形式。 反向传播算法的发展的目标和动机是找到一种训练的多层神经网络的方法，于是它可以学习合适的内部表达来让它学习任意的输入到输出的映射。
反向传播算法（BP 算法）主要由两个阶段组成：激励传播与权重更新。
每次迭代中的传播环节包含两步：
对于每个突触上的权重，按照以下步骤进行更新：
这个比例（百分比）将会影响到训练过程的速度和效果，因此成为「训练因子」。梯度的方向指明了误差扩大的方向，因此在更新权重的时候需要对其取反，从而减小权重引起的误差。
第 1 和第 2 阶段可以反复循环迭代，直到网络对输入的响应达到满意的预定的目标范围为止。三层网络算法（只有一个隐藏层）：
这个算法的名称意味着误差会从输出结点反向传播到输入结点。严格地讲，反向传播算法对网络的可修改权值计算了网络误差的梯度。 这个梯度会在简单中经常用来求最小化误差的权重。通常“反向传播”这个词使用更一般的含义，用来指涵盖了计算梯度以及在随机梯度下降法中使用的整个过程。在适用反向传播算法的网络中，它通常可以快速收敛到令人满意的极小值。
BP网络都是多层感知机（通常都会有一个输入层、一个隐藏层及一个输出层）。为了使隐藏层能够适合所有有用的函数，多层网络必须具有用于多个层的非线性激活函数：仅用线性激活函数的多层网络会与相当于单层线性网络。常用的非线性激活函数有邏輯函數、柔性最大函数和高斯函数。
用反向传播算法求梯度已被重新发现多次，是更加一般的自動微分技术在反向积累模式的特例。
它也与密切相关，也是继续研究的一部分。
在给出反向传播算法的数学推导之前，我们举一个例子来培养关于神经元的真实输出与正确输出间的直观感受。考虑一个有两个输入单元、一个输出单元、没有隐藏单元的简单神经网络。每个神经元都使用输入的加权作为。
在训练之前，我们将随机分配权重formula_3。之后神经元根据训练实例进行学习。在此例中，训练集为 (formula_4, formula_5, formula_6)，其中 formula_4 与 formula_5 是网络的输入，formula_6 为正确输出（在给定相同的输入时网络最终应当产生的输出）。网络在给定 formula_4 和 formula_5 时，会计算一个输出 formula_12，很可能与 formula_6 不同（因为权重最初是随机的）。为了衡量期望输出 formula_6 与实际输出 formula_12 之间的差异，一个常用的方法是采用平方误差测度： 其中 formula_17 为误差。
举例来讲，考虑单一训练实例的网络：formula_18，输入 formula_4 与 formula_5 均为1，正确输出 formula_6 为 0。现在若将实际输出 formula_12 画在x轴，误差 formula_17 画在 formula_12 轴，得出的是一条抛物线。抛物线的极小值对应输出 formula_12，最小化了误差 formula_17。对于单一训练实例，极小值还会接触到 formula_27 轴，这意味着误差为零，网络可以产生与期望输出 formula_6 完全匹配的输出 formula_12。因此，把输入映射到输出的问题就化为了一个找到一个能产生最小误差的函数的最佳化問題。
然而，一个神经元的输出取决于其所有输入的加权总和： 其中 formula_31 和 formula_32 是从输入单元到输出单元相连的权重。因此，误差取决于输入到该神经元的权重，也是网络要学习最终需要改变的。若每个权重都画在一个水平的轴上，而误差画在垂直轴上，得出的就是一个抛物面（若一个神经元有 formula_33 个权重，则误差曲面的維度就会是 formula_34，因而就是二维抛物线的 formula_34 维等价）。 反向传播算法的目的是找到一组能最大限度地减小误差的权重。寻找抛物线或任意维度中的任何函数的极大值的方法有若干种。其中一种方法是通过求解方程组，但这依赖于网络是一个線性系統，而目标也需要可以训练多层非線性网络（因为多层线性网络与单层网络等价）。在反向传播中使用的方法是梯度下降法。
梯度下降法背后的直观感受可以用假设情境进行说明。一个被卡在山上的人正在试图下山（即试图找到极小值）。大雾使得能见度非常低。因此，下山的道路是看不见的，所以他必须利用局部信息来找到极小值。他可以使用梯度下降法，该方法涉及到察看在他当前位置山的陡峭程度，然后沿着负陡度（即下坡）最大的方向前进。如果他要找到山顶（即极大值）的话，他需要沿着正陡度（即上坡）最大的方向前进。使用此方法，他会最终找到下山的路。不过，要假设山的陡度不能通过简单地观察得到，而需要复杂的工具测量，而这个工具此人恰好有。需要相当长的一段时间用仪器测量山的陡峭度，因此如果他想在日落之前下山，就需要最小化仪器的使用率。问题就在于怎样选取他测量山的陡峭度的频率才不致偏离路线。
在这个类比中，此人代表反向传播算法，而下山路径表示能使误差最小化的权重集合。山的陡度表示误差曲面在该点的斜率。他要前行的方向对应于误差曲面在该点的梯度。用来测量陡峭度的工具是微分（误差曲面的斜率可以通过对平方误差函数在该点求导数计算出来）。他在两次测量之间前行的距离（与测量频率成正比）是算法的学习速率。参见限制一节中对此类型“爬山”算法的限制的讨论。
由于反向传播使用梯度下降法，需要计算平方误差函数对网络权重的导数。假设对于一个输出神经元， 平方误差函数为： 其中
加入系數 formula_40 是為了抵消微分出來的指數。之後，該表達式會乘以一個任意的學習速率，因此在這裡乘上一個常系數是沒有關係的。 对每个神经元 formula_41，它的输出 formula_42 定义为
通向一个神经元的输入 formula_44 是之前神经元的输出 formula_45 的加权和。若该神经元处于输入层后的第一层，输入层的输出 formula_45 就是网络的输入 formula_47。该神经元的输入数量是 formula_48。变量 formula_49 表示神经元 formula_50 与 formula_41 之间的权重。
激活函数 formula_52 一般是非線性可微函数。常用作激活函数的是邏輯函數： 其导数的形式很好：
计算误差对权重 formula_49 的偏导数是两次使用链式法则得到的：
在右边的最后一项中，只有加权和 formula_57 取决于 formula_49，因此
神经元 formula_41 的输出对其输入的导数就是激活函数的偏导数（这里假定使用逻辑函数）： 这就是为什么反向传播需要的激活函数是可微的。
如果神经元在输出层中，因为此时 formula_62 以及 所以第一项可以直接算出。
但如果 formula_41 是网络中任一内层，求 formula_17 关于 formula_66 的导数就不太简单了。
考虑 formula_17 为接受来自神经元 formula_41 的输入的所有神经元 formula_69 的输入的函数， 并关于 formula_66 取全微分，可以得到该导数的一个递归表达式：
因此，若已知所有关于下一层（更接近输出神经元的一层）的输出 formula_73 的导数，则可以计算 formula_66 的导数。
把它们放在一起：
其中
要使用梯度下降法更新 formula_49，必须选择一个学习速率 formula_79。要加在原本的权重上的权重的变化，等于学习速率与梯度的乘积，乘以 formula_80：
之所以要乘以 formula_82 是因为要更新误差函数极小值而不是极大值的方向。
对于单层网络，这个表达式变为。 要想更好地理解反向传播是如何起作用的，下面是一个例子来说明它：The Back Propagation Algorithm，12页。
有可供选择的三种学习模式(Mode)：，批量和。在在线和随机学习，每次传播后被立即做一个权重的更新。在批量学习模式，权重更新前有许多传播发生。在线学习被用于提供新的型态(pattern)的连续流的动态环境。随机学习和批量学习都使用静态型态(pattern)的一个训练集合。随机学习以一个随机的顺序经过数据集合，以减少陷入局部极小值的机会。随机学习也比批量学习更快，因为权重在每次传播后被立即更新。然而批量学习将产生一个更加稳定下降到一个局部最小值，因为每次更新都是基于所有型态被进行的。弗拉基米尔·万普尼克引用（Bryson, A.E.; W.F. Denham; S.E. Dreyfus. Optimal programming problems with inequality constraints. I: Necessary conditions for extremal solutions. AIAA J. 1, 11 (1963) 2544-2550）在他的书《支持向量机》中首次发表反向传播算法。在1969年Arthur E. Bryson和何毓琦将其描述为多级动态系统优化方法。 直到1974年以后在神经网络的背景下应用，并由Paul Werbos、David E. Rumelhart、杰弗里·辛顿和Ronald J. Williams的著作，它才获得认可，并引发了一场人工神经网络的研究领域的“文艺复兴”。在21世纪初人们对其失去兴趣，但在2010年后又拥有了兴趣，如今可以通过GPU等大型现代运算器件用于训练更大的网络。例如在2013年，顶级语音识别器现在使用反向传播算法训练神经网络。