此條目介紹的是计算机算法。关于生物过程，请见「**神经反向传播**」。
反向传播也可以指蒙特卡洛树搜索中向上传播的搜索树的方式

| 机器学习与 |
| --- |
|  |
| 范式
* 监督学习
* 無監督學習
* 線上機器學習
* 元学习（英语：）
* 半监督学习
* 自监督学习
* 强化学习
* 基于规则的机器学习（英语：）
* 量子機器學習
 |
| 问题
* 统计分类
* 生成模型
* 迴歸分析
* 聚类分析
* 降维
* 密度估计（英语：）
* 异常检测
* 数据清洗
* 自动机器学习
* 关联规则学习
* 語意分析
* 结构预测（英语：）
* 特征工程
* 表征学习
* 排序学习（英语：）
* 语法归纳（英语：）
* 本体学习（英语：）
* 多模态学习（英语：）
 |
| 监督学习(**分类** · **回归**)
* 学徒学习（英语：）
* 决策树学习
* 集成学习
	+ Bagging
	+ 提升方法
	+ 随机森林
* *k*-NN
* 線性回歸
* 朴素贝叶斯
* 人工神经网络
* 邏輯斯諦迴歸
* 感知器
* 相关向量机（RVM）
* 支持向量机（SVM）
* 迁移学习
* 微调
 |
| 聚类分析
* BIRCH
* CURE算法（英语：）
* 层次
* *k*-平均
* Fuzzy
* 期望最大化（EM）
* DBSCAN
* OPTICS
* 均值飘移（英语：）
 |
| 降维
* 因素分析
* CCA
* ICA
* LDA
* NMF（英语：）
* PCA
* PGD（英语：）
* t-SNE（英语：）
* SDL
 |
| 结构预测（英语：）
* 圖模式
	+ 貝氏網路
	+ 條件隨機域
	+ 隐马尔可夫模型
 |
| 异常检测
* RANSAC
* *k*-NN
* 局部异常因子（英语：）
* 孤立森林（英语：）
 |
| 人工神经网络
* 自编码器
* 認知計算
* 深度学习
* DeepDream（英语：）
* 多层感知器
* RNN
	+ LSTM
	+ GRU（英语：）
	+ ESN（英语：）
	+ 储备池计算（英语：）
* 受限玻尔兹曼机
* GAN
* SOM
* 卷积神经网络
	+ U-Net
* Transformer
	+ Vision transforme（英语：）
* 脉冲神经网络（英语：）
* Memtransistor（英语：）
* 电化学RAM（英语：）（ECRAM）
 |
| 强化学习
* Q学习
* SARSA
* 时序差分（TD）
* 多智能体（英语：）
	+ Self-play（英语：）
* RLHF
 |
| 与人类学习
* 主动学习（英语：）
* 众包
* Human-in-the-loop（英语：）
 |
| 模型诊断
* 学习曲线（英语：）
 |
| 数学基础
* 内核机器（英语：）
* 偏差–方差困境（英语：）
* 计算学习理论（英语：）
* 经验风险最小化
* 奥卡姆学习（英语：）
* PAC学习（英语：）
* 统计学习
* VC理论
 |
| 大会与出版物
* NeurIPS
* ICML（英语：）
* ICLR
* ML（英语：）
* JMLR（英语：）
 |
| 相关条目
* 人工智能术语（英语：）
* 机器学习研究数据集列表（英语：）
* 机器学习概要（英语：）
 |
| * 
* 论
* 编
 |

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

动机
--

任何监督式学习算法的目标是找到一个能把一组输入最好地映射到其正确的输出的函数。例如一个简单的分类任务，其中输入是动物的图像，正确的输出将是动物的名称。一些输入和输出模式可以很容易地通过单层神经网络（如感知器）学习。但是这些单层的感知机只能学习一些比较简单的模式，例如那些非线性可分的（英语：）模式。例如，人可以通过识别动物的图像的某些特征进行分类，例如肢的数目，皮肤的纹理（无论是毛皮，羽毛，鳞片等），该动物的体型，以及种种其他特征。但是，单层神经网络必须仅仅使用图像中的像素的强度来学习一个输出一个标签函数。因为它被限制为仅具有一个层，所以没有办法从输入中学习到任何抽象特征。多层的网络克服了这一限制，因为它可以创建内部表示，并在每一层学习不同的特征。 第一层可能负责从图像的单个像素的输入学习线条的走向。第二层可能就会结合第一层所学并学习识别简单形状（如圆形）。每升高一层就学习越来越多的抽象特征，如上文提到的用来图像分类。每一层都是从它下方的层中找到模式，就是这种能力创建了独立于为多层网络提供能量的外界输入的内部表达形式。
反向传播算法的发展的目标和动机是找到一种训练的多层神经网络的方法，于是它可以学习合适的内部表达来让它学习任意的输入到输出的映射。

概括
--

反向传播算法（BP 算法）主要由两个阶段组成：激励传播与权重更新。

### 第1阶段：激励传播

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

1. （前向传播阶段）将训练输入送入网络以获得預測結果；
2. （反向传播阶段）對預測結果同训练目标求差(损失函数)。

### 第2阶段：权重更新

对于每个突触上的权重，按照以下步骤进行更新：

1. 将输入激励和响应误差相乘，从而获得权重的梯度；
2. 将这个梯度乘上一个比例并取反后加到权重上。

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

第 1 和第 2 阶段可以反复循环迭代，直到网络对输入的响应达到满意的预定的目标范围为止。

算法
--

### 數學推導

假設多層人工神经网络的第 l 層是由线性算子 {\displaystyle W^{l}:\mathbb {R} ^{n\_{l-1}}\to \mathbb {R} ^{n\_{l}}} 和激活函數 {\displaystyle f^{l}:\mathbb {R} \to \mathbb {R} } 所構成，也就是說，第 l 層的輸入是 {\displaystyle n\_{l-1}} 維实数向量

{\displaystyle y^{l-1}=(x\_{1},\,x\_{2},\,\cdots ,\,x\_{n\_{l-1}})}
輸出則為{\displaystyle n\_{l}} 維實向量

{\displaystyle y^{l}=(y\_{1},\,y\_{2},\,\cdots ,\,y\_{n\_{l}})}
換句話說，第 {\displaystyle l-1} 層的輸出 {\displaystyle y^{l-1}} 就是第 l 層的輸入。

而 {\displaystyle y^{l}} 和 {\displaystyle y^{l-1}} 的具體(以第 i 分量表示)遞迴關係為

{\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]} （ {\displaystyle 1\leq i\leq n\_{l}} ）
上式通常會簡寫為

{\displaystyle y^{l}=f^{l}[\,W^{l}(y^{l-1})\,]}
若這個多層人工神經網路總共有 L 層，也就是說，{\displaystyle y^{0}} 是最一開始的輸入，而 {\displaystyle y^{L}} 是最後一層的輸出，那跟损失函数 g 是以最後一層輸出 {\displaystyle y^{L}} 的各分量 {\displaystyle {y^{L}}\_{i}} (與真實值)為變數。依據上面的遞迴關係，可以把 g 進一步的轉成以第 L 層的輸入 {\displaystyle y^{L-1}} 與權重因子 {\displaystyle {W^{m}}\_{ij}} 為變數的函数 {\displaystyle g^{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]} （ {\displaystyle 1\leq k\leq n\_{L-1}} , {\displaystyle 1\leq b\leq n\_{L}} ）
由此可以歸納到 {\displaystyle 1\leq l<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]} （ {\displaystyle 1\leq k\leq n\_{l-1}} , {\displaystyle 1\leq b\leq n\_{l}} ）
那這樣**如果假設適當的可微分條件**，由链式法则會有以下的遞迴關係 ( 若取 {\displaystyle g^{L+1}:=g} 和 {\displaystyle 1\leq l\leq L} )

{\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}}
{\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]}
這樣就可以依據這個遞迴關係進行梯度下降，因為計算上是由 {\displaystyle {y^{L}}\_{i}} 對 损失函数 g 的偏微分出發，一層層向後遞推出前面各層的權重因子梯度，所以被稱為**反向傳播**。

注意到可將輸入設為

{\displaystyle y^{l-1}=(1,\,x\_{1},\,x\_{2},\,\cdots ,\,x\_{n\_{l-1}})}
並多加一行權重因子 {\displaystyle W\_{i0}^{l}} 為偏移，就可以把有偏移的多層網路納入剛剛討論的範圍內。

### 實際範例

三层网络算法（只有一个隐藏层）：

```
  初始化网络权值（通常是小的随机值）
  **do**
     **forEach** 训练样本 ex
        prediction = neural-net-output(network, ex)  *// 正向传递*
        actual = teacher-output(ex)
        计算输出单元的误差 (prediction - actual)
        计算 \Delta w\_{h}  对于所有隐藏层到输出层的权值                           *// 反向传递*
        计算 \Delta w\_{i}  对于所有输入层到隐藏层的权值                           *// 继续反向传递*
        更新网络权值 *// 输入层不会被误差估计改变*
  **until** 所有样本正确分类或满足其他停止标准
  **return** 该网络
```

这个算法的名称意味着误差会从输出结点反向传播到输入结点。严格地讲，反向传播算法对网络的可修改权值计算了网络误差的梯度。 这个梯度会在简单随机梯度下降法（英语：）中经常用来求最小化误差的权重。通常"反向传播"这个词使用更一般的含义，用来指涵盖了计算梯度以及在随机梯度下降法中使用的整个过程。在适用反向传播算法的网络中，它通常可以快速收敛到令人满意的极小值。

直观理解
----

### 学习作为一个优化问题

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

具有2个输入单元和1个输出单元的一个简单的神经网络
在训练之前，我们将随机分配权重{\displaystyle 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\_{1}w\_{1}+x\_{2}w\_{2},
其中 w\_{1} 和 w\_{2} 是从输入单元到输出单元相连的权重。因此，误差取决于输入到该神经元的权重，也是网络要学习最终需要改变的。若每个权重都画在一个水平的轴上，而误差画在垂直轴上，得出的就是一个抛物面（若一个神经元有 k 个权重，则误差曲面的維度就会是 k+1，因而就是二维抛物线的 k+1 维等价）。

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

### 运用类比理解梯度下降法

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

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

限制
--

* 结果可能会收敛到极值。如果只有一个极小值，梯度下降的"爬山"策略一定可以起作用。然而，往往是误差曲面有许多局部最小值和最大值。如果梯度下降的起始点恰好介于局部最大值和局部最小值之间，则沿着梯度下降最大的方向会到达局部最小值。梯度下降法可以找到局部最小值，而不是全局最小值。
* 从反向传播学习获得的收敛很慢。
* 在反向传播学习的收敛性不能保证。
	+ 然而，收敛到全局最小值据说使用自适应终止条件得到保证。
* 反向传播学习不需要输入向量的标准化（normalization）；然而，标准化可提高性能。

历史
--

参见：感知器的历史
弗拉基米尔·瓦普尼克引用（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年，顶级语音识别器现在使用反向传播算法训练神经网络。

参见
--

* 人工神经网络
* 生物神经网络
* 灾难性干扰（英语：）
* 表徵學習
* AdaBoost
* 過適

参考文献
----

1. 1 2 3  Rumelhart, David E.; Hinton, Geoffrey E.; Williams, Ronald J.. Nature. 8 October 1986, **323** (6088): 533–536. doi:10.1038/323533a0.
2. ↑  Paul J. Werbos (1994). The Roots of Backpropagation. From Ordered Derivatives to Neural Networks and Political Forecasting. New York, NY: John Wiley & Sons, Inc.
3. ↑  Lalis, Jeremias; Gerardo, Bobby; Byun, Yung-Cheol.  (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）.
4. ↑  ISBN 1-931841-08-X,
5. ↑  Stuart Russell; Peter Norvig. . : 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.
6. ↑  Arthur Earl Bryson, Yu-Chi Ho.. Blaisdell Publishing Company or Xerox College Publishing. 1969: 481.
7. ↑  Paul J. Werbos. Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Sciences. PhD thesis, Harvard University, 1974
8. ↑  Alpaydın, Ethem.  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（页面存档备份，存于）

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
可微分计算 |
| --- |
|  |
| 概论 | 
* 可微分编程
* 自動微分
* 张量微积分（英语：）
* 信息几何
* 统计流形
* 神经形态工程（英语：）
* 模式识别
* 运算学习理论（英语：）
* 归纳偏置

 |
|  |
| 概念 | 
* 梯度下降
	+ SGD（英语：）
* 聚类
* 回归
	+
* 幻觉
* 对抗（英语：）
* 注意力
* 卷积
* 損失函數
* 反向传播
* + softmax
	+ sigmoid
	+ ReLU
* 正则化
* 
* 扩散（英语：）
* 自回归

 |
|  |
| 应用 | 
* 机器学习
* 人工神经网络
	+ 深度学习
* 科学计算
* 人工智能
* 語言模型
	+ 大型语言模型

 |
|  |
| 硬件 | 
* TPU
* VPU
* IPU（英语：）
* 憶阻器
* SpiNNaker（英语：）

 |
|  |
| 软件库 | 
* Theano
* TensorFlow
	+ Keras
* PyTorch
* JAX
* Flux.jl（英语：）

 |
|  |
| 实现 | 

|  |  |
| --- | --- |
| 视觉·语音 | 
* AlexNet
* WaveNet
* 人像合成
* 手寫
* OCR
* 语音合成
* 
* 
* AlphaFold
* DALL-E
* Midjourney
* Stable Diffusion
* Whisper（英语：）

 |
|  |
| 自然语言 | 
* Word2vec
* Seq2seq
* BERT
* LaMDA
	+ Bard
* NMT
* 辩手项目（英语：）
* 沃森
* GPT
	+ GPT-1
	+ GPT-2
	+ GPT-3
	+ GPT-4
* GPT-J（英语：）
* ChatGPT
* 文心一言
* Chinchilla AI（英语：）
* PaLM（英语：）
* BLOOM（英语：）
* LLaMA

 |
|  |
| 决策 | 
* AlphaGo
* Q学习
* SARSA
* OpenAI Five（英语：）
* 自动驾驶
* MuZero
* 行动选择（英语：）
	+ Auto-GPT
* 机器人控制（英语：）

 |

 |
|  |
| 人物 | 
* 约书亚·本希奥
* 杰弗里·辛顿
* 杨立昆
* 艾力克斯·格雷夫斯
* 伊恩·古德费洛
* 吴恩达
* 杰米斯·哈萨比斯
* 大衛·席爾瓦
* 李飛飛
* 于尔根·施密德胡伯
* 伊爾亞·蘇茨克維

 |
|  |
| 组织 | 
* Anthropic
* DeepMind
* EleutherAI（英语：）
* Google Brain
* Meta AI（英语：）
* Mila（英语：）
* MIT CSAIL
* OpenAI
* Hugging Face

 |
|  |
| 架构 | 
* 多层感知器（MLP）
* 循环神经网络（RNN）
* 長短期記憶（LSTM）
* 门控循环单元（英语：）（GRU）
* 卷积神经网络（CNN）
* 残差神经网络（英语：）（ResNet）
* 变换器
* 自编码器
* 变分自编码器（VAE）
* 生成对抗网络（GAN）
* 图神经网络（英语：）（GNN）
* 回响状态网络（英语：）（ESN）
* 神经图灵机（英语：）（NTM）
* 可微分神经计算机（英语：）（DNC）

 |
|  |
| 
* 主题 主题
	+ 计算机编程
	+ 技术
* 分类 分类
	+ 人工神经网络
	+ 机器学习

 |

 |