反向傳播算法

喺機械學習裏頭，**反向傳播**（**backpropagation，backprop**， **BP**）係一種廣泛用於訓練前饋神經網絡嘅算法，一般應用喺啲監督式學習當中。反向傳播嘅一般概念都存在喺其他人工神經網絡（ANN）同埋啲一般函數當中。啲噉嘅類型嘅算法都着統稱為「反向傳播」。喺擬合（fitting）一幅神經網絡陣時，根據個網絡啲權重（weights），反向傳播算法識幫個輸入-輸出樣本計算得出損失函數梯度，而且個效率高過直接攞啲權重計算每個梯度。單獨權重。噉樣嘅效率令到使啲梯度方法（通常似梯度下降或者諸如隨機梯度下降之類嘅變體）來訓練多𤗲網絡、更新權重嚟最細化啲損失成為可能。反向傳播算法嘅工作原理係，透過鏈式法則計算個損失函數相對於每個權重嘅梯度，論𤗲噉計算個梯度，而且從最後一𤗲開始向後疊代嚟避免冗餘計算到鏈式法則裏頭啲中間項；以上係屬於動態編程嘅一個例。

「反向傳播」一詞嚴格來講僅衹攞嚟意指個算法係計出梯度嘅，而唔係指點樣使用個梯度嘅。之不過實質上好多時個術語講法通常都寬鬆噉指埋成個學習算法，即包埋點樣使個梯度，譬如隨機梯度下降法。反向傳播作爲Delta 法則嘅普適化情形、個反向傳播嘅單𤗲形式，反過來又透過嘅概念而得到普適化，係噉作爲特殊情況嘅一種、喺啲反向累積方法（reverse accumulation，又喊做reverse mode，「反向模式」）之中。「反向傳播」個詞與及佢喺神經網絡領域裏頭嘅普遍使用，係出於Hinton Rumelhart同埋Williams嘅相關闡述同埋推廣，但隻技術着獨立重新發現過好多次，而且有好多1960年代嘅先例；見。現代概述喺Goodfellow, Bengio & Courville（2016）嗰本深度學習教科書裏頭畀到。 

## 概述
反向傳播旨在考慮埋損失函數嚟計算梯度，喺個前饋神經網絡嘅權重空間入便。以下係一啲符號：

* x ：輸入（特徵向量）
* y ：目標輸出
*: 對於分類任務，輸出會係一枚向量表示各類別概率，譬如 (0.1, 0.7, 0.2)，目標輸出就係一個特定嘅類，由One-hot/啞變數編碼，譬如(0, 1, 0) 。
* C ：損失函數或者「成本函數」 
*: 對於分類，呢個通常係交叉熵（XC，對數損失）；而對於回歸就通常係平方誤差損失（SEL）。
* L ：𤗲數
* W^l = (w^l_{jk}) ：𤗲l - 1同埋l之間嘅權重 ；其中w^l_{jk}係指一隻權重，𤗲l - 1裏頭第k粒綟與及l𤗲裏頭嘅第j粒綟之間嘅。
* f^l ：l𤗲嘅啟動函數
*: 對於分類任務，最孻𤗲一般使邏輯函數畀二類分類，softmax （softargmax）畀多類分類；而對於隱藏𤗲，傳統上每粒綟（坐標）上係Sigmoid函數（邏輯函數抑或其他），但時今多樣化多啲，整流器似ramp、ReLU都好常見。

喺反向傳播嘅推導裏頭，其他啲中間量都有使到，下低會根據需要嚟介紹。偏趲項（bias terms）冇特別討論到，因為佢哋對應啲權重係輸入固定為1嘅。出於反向傳播嘅目的，特定嘅損失函數同埋啟動函數都唔緊要，只要有效噉評估得到啲函數同埋佢哋啲導數就得。

成個網絡係複合函數同埋矩陣乘法嘅組合：

: g(x) := f^L(W^L f^{L-1}(W^{L-1} \cdots f^1(W^1 x)\cdots))

對於訓練集，會有一組輸入-輸出孖 \left\{(x_i, y_i)\right\} 。對於訓練集裏頭嘅每個輸入-輸出孖(x_i, y_i)，針對嗰一孖嘅模型個損失就對應個差異嘅成本，個預測輸出g(x_i)同埋目標輸出y_i 之間嘅：

: C(y_i, g(x_i))

注意區別：喺模型評估期間，係固定啲權重嘅而啲輸入識變化（目標輸出可能係未知嘅），個網絡係攞輸出𤗲做尾（唔包括損失函數）。喺模型訓練期間，係固定啲輸入-輸出孖而改啲權重，網絡係以損失函數結束。

反向傳播幫固定嘅輸入-輸出孖(x_i, y_i) 計算個梯度，權重w^l_{jk}可以變化。梯度嘅每個單獨嘅成分\partial C/\partial w^l_{jk}，可以透過鏈式法則嚟計算；但係，對每個權重都分別進行呢項操作嘅話效率會好低。反向傳播可以避開重複計算，唔去計算啲冇必要嘅中間值，從後到前噉計算每一𤗲嘅梯度（具體嚟講，每一𤗲個加權輸入\delta^l嘅梯度），嚟高效噉計返個梯度。

通俗噉講，算法嘅關鍵係，喺W^l入便嘅一個權重只有透過對下一𤗲嘅影響先可以影響到個損失；而且由於佢係線性噉起作用，\delta^l係唯一需要到嘅數據去計算嗰一𤗲l啲權重個梯度。然之後就可以用遞歸重複來繼續計算前一𤗲\delta^{l-1}。噉樣就喺兩個方面提高咗個運算效率。首先係避免到重複，因為計算𤗲l個梯度陣時，唔使每一次都計澌所有啲導數喺以後啲𤗲l+1, l+2, \ldots。其次，避免到啲冇必要嘅中間計算，因為喺每個階段都係直接計算啲權重嘅梯度、相對於最終輸出（損失）嘅，而唔係又要睇返\partial a^{l'}_{j'}/\partial w^l_{jk}變化嚟幫啲隱藏𤗲嘅值計算過啲導數，噉樣即冇必要。

簡單嘅前饋網絡反向傳播可以表示成矩陣乘法，或者更加普遍噉表示成伴隨圖。

## 矩陣乘法
對於基本情況前喺饋網絡嘅入便，佢裏頭每𤗲裏頭啲綟都僅衹連接到鄰接嘅下一𤗲裏頭啲綟（即唔跳過任何𤗲），而且係有返一個損耗函數係計算得到最終輸出嘅損失標量值嘅，可噉以好簡單噉透過矩陣乘法來理解反向傳播。本質上，反向傳播係捉成本函數嘅導數表達式睇作係乘積、即從左到右（「向後」）每一𤗲之間嘅乘積，其中每一𤗲之間啲權重嘅梯度係簡單噉修改到啲部分乘積（partial products）（「向着反向播嘅誤差」）。

畀定一個輸入-輸出孖(x, y)，損失為：

: C(y, f^L(W^L f^{L-1}(W^{L-1} \cdots f^2(W^2 f^1(W^1 x))\cdots)))

為咗計算呢條式，從輸入x開始前向輸出；每一𤗲嘅加權輸入表示為z^l，𤗲l嘅輸出作為激活值a^l 。對於反向傳播，激活值a^l同埋導數(f^l)' （以z^l 計出）必須緩存住，等喺反向傳遞期間有得使用。

損失對於輸入嘅導數由鏈式法則一路反推嚟畀到；要注意嘅係，每個項都係全微分，係根據輸入x上喺每粒綟嘅網絡值求出嘅 ：

: \frac{d C}{d a^L}\cdot \frac{d a^L}{d z^L}\cdot \frac{d z^L}{d a^{L-1}} \cdot \frac{d a^{L-1}}{d z^{L-1}}\cdot \frac{d z^{L-1}}{d a^{L-2}} \cdots \frac{d a^1}{d z^1} \cdot \frac{\partial z^1}{\partial x}.

以下式嗰三項唔同樣式嘅分別係損失函數嘅導數\frac{d C}{d a^L}；啲啟動函數嘅導數f^L \dots；同埋啲權重矩陣W^L \dots，由後到前： 

: \frac{d C}{d a^L}\cdot (f^L)' \cdot W^L \cdot (f^{L-1})' \cdot W^{L-1} \cdots (f^1)' \cdot W^1.

以下個梯度\nabla係轉置咗個輸出對輸入嘅導數，因此矩陣着轉置而且乘法嘅順序着反轉，但意義係相同嘅：

: \nabla_x C = (W^1)^T \cdot (f^1)' \cdots \cdot (W^{L-1})^T \cdot (f^{L-1})' \cdot (W^L)^T \cdot (f^L)' \cdot \nabla_{a^L} C.

然之後，反向傳播實質上包括從右到左評估呢條表達式（等效於從左到右乘先前導數表達式），計算沿途每一𤗲嘅梯度。另外仲有一動額外嘅步驟，因為啲權重個梯度唔單止係一條「子表達式」，而有一次額外乘法。

引入輔助量\delta^l畀部分乘積（從右到左相乘），解釋為「𤗲l誤差 」，並定義為𤗲l上啲輸入值嘅梯度（相當於從中間第l項開始往右乘啲先前導數嘅表達式）：

: \delta^l := (f^l)' \cdot (W^{l+1})^T \cdots \cdot (W^{L-1})^T \cdot (f^{L-1})' \cdot (W^L)^T \cdot (f^L)' \cdot \nabla_{a^L} C.

注意\delta^l係一枚向量，佢長度等於𤗲l裏頭嘅綟數；每個組分都可以解釋成「歸屬嗰粒綟嘅（值嘅）成本」。

𤗲l裏頭啲權重嘅梯度就係：

: \nabla_{W^l} C = \delta^l(a^{l-1})^T.

a^{l-1}因子係因為權重W^l係喺𤗲l - 1同l之間嘅，會戥輸入（激活）成比例噉影響到𤗲l；即輸入係固定嘅，權重識變化。

隻\delta^{l-1}可以好容易噉憑遞歸計出：

: \delta^{l-1} := (f^{l-1})' \cdot (W^l)^T \cdot \delta^l.

係噉，計算權重嘅梯度就可以用一啲矩陣乘法來幫每𤗲求，即「反向傳播」：

: \begin{align}
\delta^L &= (f^L)' \cdot \nabla_{a^L} C \\
\delta^{L-1} &= (f^{L-1})' \cdot (W^L)^T \cdot \delta^{L} \\
&\vdots\\
\delta^2 &= (f^2)' \cdot (W^3)^T \cdot \delta^{3}\\
\delta^1 &= (f^1)' \cdot (W^2)^T \cdot \delta^{2}\\
\end{align}

相較起嚟，單純噉計算前向值（forwards）（使用\delta^l講明）會係噉：

: \begin{align}
\delta^1 &= (f^1)' \cdot (W^2)^T \cdot (f^2)' \cdots \cdot (W^{L-1})^T \cdot (f^{L-1})' \cdot (W^L)^T \cdot (f^L)' \cdot \nabla_{a^L} C\\
\delta^2 &= (f^2)' \cdots \cdot (W^{L-1})^T \cdot (f^{L-1})' \cdot (W^L)^T \cdot (f^L)' \cdot \nabla_{a^L} C\\
&\vdots\\
\delta^{L-1} &= (f^{L-1})' \cdot (W^L)^T \cdot (f^L)' \cdot \nabla_{a^L} C\\
\delta^L &= (f^L)' \cdot \nabla_{a^L} C,
\end{align}

比起噉，反向傳播有兩個關鍵分別：

# 電腦按照\delta^l運算\delta^{l-1}避免明顯噉重複啲乘法喺𤗲l以及往後啲𤗲上。
# 乘法係從\nabla_{a^L} C開始，即反向傳播個誤差，即每個步驟僅捉一枚向量（\delta^l）乘埋權重矩陣(W^l)^T同埋激活值嘅導數(f^{l-1})' 。相比之下，從前一𤗲嘅變化開始，前向相乘意味住每次乘法都係成個矩陣乘上成個矩陣。呢個嘅運算花銷要大過，而且相當於跟踪更改嗮每一條啲可能路徑喺一𤗲l裏頭嘅、並前向對應去𤗲l+2裏頭啲更改去（W^{l+1}用W^{l+2}乘埋，並為激活值嘅導數做埋額外嘅乘法），就無謂到要計埋啲中間量，啲表示權重變化係點樣影響到隱藏綟啲值嘅。

## 伴隨圖
對於更一般嘅圖形同埋其他高級變化，可以透過自動微分來理解反向傳播，佢裏頭反向傳播係反向累積（或「反向模式」）嘅特殊情況。 

## 直觀解釋

### 動機
任何監督式學習嘅算法，目標都係要搵到一個將一組輸入映射到其正確輸出嘅最佳函數。反向傳播嘅動機係訓練多𤗲神經網絡，等到佢可以學到啲啱嘅內部表示值，嚟學到任意映射從輸入到輸出嘅。

### 當優化問題噉學習
為咗理解反向傳播算法嘅數學推導，培養某種直覺係有啲幫助嘅，即理解到一粒神經元嘅實際輸出戥特定訓練樣本（sample）嘅正確輸出之間嘅關係。考慮一個簡單嘅神經網絡，佢裏頭有兩粒輸入單元，一粒輸出單元，冇隱藏單元，而且每粒神經元使用線性輸出（戥大多數神經網絡工作唔同，啲從輸入到輸出嘅映射係非線性嘅） 係其輸入嘅加權總同埋。

最初，喺訓練之前，啲權重會隨機設置。然之後，神經元從訓練樣本裏頭學習，喺呢種情況下，訓練樣本（training examples）由一組元組(x_1, x_2, t)組成，其中x_1同埋x_2係網絡嘅輸入，係啱嘅輸出（經過訓練，網絡喺畀定呢啲輸入嘅情況下理應產生嘅輸出）。初始網絡畀定x_1同埋x_2，識計算出一條輸出 係唔似 嘅（畀出隨機權重）。損失函數 L(t, y) 用於測量目標輸出 戥計出輸出 之間嘅差異。對於回歸分析問題，平方誤差可以用作損失函數，對於分類問題，可以使用分類交叉熵。

譬如，考慮有回歸問題使用平方誤差作為損失：

: L(t, y)= (t-y)^2 = E, 

裏頭 係差異或者誤差。

考慮網絡喺一個單一訓練案例裏頭： (1, 1, 0) 。因此，輸入x_1同埋x_2分別係1同埋1，啱嘅輸出 係0。噉時如果以橫軸爲 棟軸爲 繪製關係，結果就係拋物線。拋物線嘅最細值對應於輸出，個輸出令到誤差 最細。對於單個訓練情況，最細值亦都會掂到橫軸，呢個代表誤差會為零，而且網絡可以產生啱目標輸出 嘅 。因此，將輸入映射到輸出嘅問題可以簡化成為搵會產生最細誤差嘅函數嘅優化問題。

但係，神經元嘅輸出取決於其所有輸入嘅加權同埋：

: y=x_1w_1 + x_2w_2,

其中w_1同埋w_2係輸入單元到輸出單元個連接嘅權重。因此，誤差仲取決於個神經元嘅輸入權重，要學習嘅話網絡裏頭最終係要改變佢先得。

喺呢個樣本裏頭，注入訓練數據後，損失函數變為

 E = (t-y)^2 = y^2 = (x_1w_1 + x_2w_2)^2 = (w_1 + w_2)^2.

然之後，損失函數E採取拋物線圓柱體嘅形式，個㞘底沿w_1 = -w_2 。由於所有啲權重滿足w_1 = -w_2嘅會最細化個損失函數，喺呢種情況下需要額外嘅約束先收斂得到唯一嘅解決方案。其他約束可以透過為權重設置特定條件或者透過注入其他訓練數據來生成。

一種用於搵到啲權重係最細化個誤差嘅算法係梯度下降。透過反向傳播，可以計算出損失函數相對於當前啲突觸權重嘅最急嘅下降方向。然之後，可以沿最急嘅下降方向修改啲權重，嚟有效噉最細化個誤差。

## 推導例
梯度下降法涉及嘅係，參照網絡啲權重嚟計算個損耗函數嘅導數。通常係使用反向傳播完成呢項操作。假設有一粒輸出神經元，誤差函數為

: E = L(t, y)

其中

: E係輸出嘅損失，
: t係訓練樣本嘅目標輸出，
: y係輸出神經元嘅實際輸出。

對於每粒神經元j，佢個輸出o_j着定義成前一𤗲啲神經元輸出加權求和，再通過一個函數\varphi：

: o_j = \varphi(\text{net}_j) = \varphi\left(\sum_{k=1}^n w_{kj}o_k\right),

其中個函數\varphi即係啟動函數，係非線性且可微得嘅（即使ReLU唔喺一個點上）。歷史上使過嘅啟動函數係邏輯函數：

:  \varphi(z) = \frac 1 {1+e^{-z}}

個導數形式幾好：

:  \frac {d \varphi(z)}{d z} = \varphi(z)(1-\varphi(z)) 

神經元個輸入\text{net}_j係之前啲神經元嘅輸出o_k嘅加權總和。若果隻神經元位於輸入𤗲之後嘅第一𤗲，噉個輸入o_k就係成個網絡嘅輸入x_k。神經元嘅輸入單位數為n 。變數w_{kj}表示神經元之間嘅權重，其中k係前一𤗲神經元，j係當前𤗲神經元。

### 搵誤差嘅導數

針對權重w_{ij}計算誤差偏導數，用兩次鏈式法則： = \frac{\partial E}{\partial o_{j}} \frac{\partial o_{j}}{\partial w_{ij}}
= \frac{\partial E}{\partial o_j} \frac{\partial o_j}{\partial\text{net}_j} \frac{\partial \text{net}_j}{\partial w_{ij}}|}}

喺上述右便手嘅最後一行，總和\text{net}_j裏頭只有一項係取決於w_{ij}，所以： = \frac{\partial}{\partial w_{ij}} \left(\sum_{k=1}^n w_{kj} o_k\right) = \frac{\partial}{\partial w_{ij}}  w_{ij} o_i= o_i.|}}若果隻神經元喺輸入𤗲之後嘅第一𤗲，o_i就係x_i 。隻神經元輸出對應輸入嘅導數j即係啟動函數嘅偏導數：對於邏輯啟動函數嘅情況係：

: \frac{\partial o_j}{\partial\text{net}_j} = \frac {\partial}{\partial \text{net}_j} \varphi(\text{net}_j) = \varphi(\text{net}_j)(1-\varphi(\text{net}_j)) = o_j(1-o_j)

呢個就係反向傳播算法要求啟動函數係可微得嘅原因。（儘管如此，ReLU嘅啟動函數（喺0陣時唔可微分得）都經已非常之流行，譬如喺AlexNet裏頭）

第一項好容易計得出，若果神經元係喺輸出𤗲，因為噉樣就有o_j = y同埋若果攞平方誤差嘅二份一作爲損失函數，可以重寫過條式成為

: \frac{\partial E}{\partial o_j} = \frac{\partial E}{\partial y} = \frac{\partial}{\partial y} \frac{1}{2}(t - y)^2 = y - t 

但係，若果j喺網絡嘅任意內部𤗲裏頭，唔係咁顯然噉搵得到相對於輸出o_j嘅導數E。

考慮裏頭E係一條函數，輸入係L = \{u, v, \dots, w\}啲全部神經元嘅，啲輸神經元入又係從一粒神經元j攞到返

: \frac{\partial E(o_j)}{\partial o_j} = \frac{\partial E(\mathrm{net}_u, \text{net}_v, \dots, \mathrm{net}_w)}{\partial o_j}

考慮o_j取全微分，就攞得到個導數嘅遞歸表達式：因此，針對o_j嘅導數就計得出，若果所有啲導數都已知、啲對應下一𤗲（即靠近輸出神經元）嘅輸出o_\ell嘅。注意，若果集合L裏頭有任何神經元冇連接到神經元j，啲神經元會獨立於w_{ij}，而且求和下嘅相應偏導數會消失為0。 

代入Eq. 2，Eq. 3Eq. 5Eq.4同埋等式Eq. 1Eq. 5 Eq. 1獲得：

: \frac{\partial E}{\partial w_{ij}} 
= \frac{\partial E}{\partial o_{j}} \frac{\partial o_{j}}{\partial \text{net}_{j}} \frac{\partial \text{net}_{j}}{\partial w_{ij}}

= \frac{\partial E}{\partial o_{j}} \frac{\partial o_{j}}{\partial \text{net}_{j}} o_i
:  \frac{\partial E}{\partial w_{ij}} = o_i \delta_j

同埋

: \delta_j 
  = 
    \frac{\partial E}{\partial o_j} \frac{\partial o_j}{\partial\text{net}_j} 
  = \begin{cases}
      \frac{\partial L(o_j, t)}{\partial o_j} \frac {d \varphi(\text{net}_j)}{d \text{net}_j}          & \text{if } j \text{ is an output neuron,}\\
      (\sum_{\ell\in L} w_{j \ell} 
              \delta_\ell)\frac {d \varphi(\text{net}_j)}{d \text{net}_j}  & \text{if } j \text{ is an inner neuron.}
\end{cases}

若果\varphi係邏輯函數，誤差係平方誤差：

: \delta_j = \frac{\partial E}{\partial o_j} \frac{\partial o_j}{\partial\text{net}_j} = \begin{cases}
(o_j-t_j)o_j(1-o_{j}) & \text{if } j \text{ is an output neuron,}\\
(\sum_{\ell\in L} w_{j \ell} \delta_\ell)o_j(1-o_j) & \text{if } j \text{ is an inner neuron.}
\end{cases}

更新權重w_{ij}使用梯度下降，必須選擇學習率\eta >0 。權重變化需要反映出權重w_{ij}增加或者減少對E嘅影響。如果\frac{\partial E}{\partial w_{ij}} > 0，增加w_{ij}亦都會增埋E ;相反，如果\frac{\partial E}{\partial w_{ij}} ，增加w_{ij}就會減少E 。新嘅\Delta w_{ij}加埋舊嘅權重，然之後將學習率戥梯度嘅乘積再乘埋-1保證w_{ij}始終係以減少嘅方式改變個E （求最細）。即係話，喺下低嘅等式裏頭，- \eta \frac{\partial E}{\partial w_{ij}}始終係爲唨減少E嚟變個w_{ij}：

:  \Delta w_{ij} = - \eta \frac{\partial E}{\partial w_{ij}} = - \eta o_i \delta_j

## 損失函數

損失函數係映射啲一或者多個變數嘅值到實數上嘅函數，嚟直觀噉表示啲值關聯到嘅某啲「成本」。對於反向傳播，喺訓練樣本透過網絡傳播之後，損失函數可以計得出網絡輸出戥佢個預期輸出之間嘅走趲。

### 假設條件
要喺反向傳播裏頭使用，損失函數個數學表達式必須滿足兩個條件。首先係佢寫得成誤差函數E_x嘅平均值E=\frac{1}{n}\sum_xE_x，其中有n個單獨訓練實例x 。做出呢個假設嘅原因係，反向傳播算法係幫單獨訓練樣本計算誤差函數個梯度，又需要推廣到成個誤差函數。第二個假設係，佢可以作爲神經網絡啲輸出嘅函數來寫出。

### 損失函數嘅例
令y,y'係\mathbb{R}^n裏便嘅向量 。

選擇誤差函數E(y,y')嚟測量兩個輸出之間嘅差異。標準嘅選擇係向量y同埋y'之間歐式距離嘅平方：

E(y,y') = \tfrac{1}{2} \lVert y-y'\rVert^2

然之後，n個訓練樣本誤差函數可以寫各個單獨樣本啲損失嘅平均：

E=\frac{1}{2n}\sum_x\lVert (y(x)-y'(x)) \rVert^2

## 局限性

* 反向傳播嘅梯度下降唔保證得到搵得到誤差函數嘅整體最細值，而只能搵得到局部最細值。而且，佢喺誤差函數方面難跨越得到啲平穩段。好耐以來，啲人一直認為呢個問題、由神經網絡啲誤差函數嘅非凸性（non-convexity）引起嘅，係個主要嘅拖累；但Yann LeCun等人覺得喺好多實際問題裏頭亦都唔係噉。
* 反向傳播學習唔需要對輸入向量進行歸一化；但係，歸一化可以提高性能。
* 反向傳播需要啟動函數嘅導數喺設計網絡陣時就已知。

## 歷史
「反向傳播」嗰種講法同埋佢喺神經網絡裏頭嘅普遍使用係喺Rumelhart, Hinton &Williams（1986a）裏頭Rumelhart, Hinton &Williams（1986b）裏頭進行咗闡述同埋推廣，但該技術着獨立噉重新發現咗好多次，而且有好多先例係追得到1960年代。

亨利·溪利（Henry J. Kelley）於1960年同埋亞瑟·布雷遜（Arthur E. Bryson）於1961年喺控制理論嘅背景下得出咗連續反向傳播嘅基礎知識佢哋用咗動態編程嘅原理。1962年，斯圖遏·奪壘夫斯（Stuart Dreyfus）發布咗一種僅衹基於鏈式法則嘅簡單推導方法。Bryson同埋Ho喺1969年將佢描述為一種「多階段動態系統優化方法」。反向傳播由60年代初期嘅多位研究人員衍生，又由Seppo Linnainmaa最早於1970年實現到並喺電腦上運行。1974年，Paul Werbos喺美國首先提出咗建議將佢用於神經網絡，然之後對佢進行咗深入分析。即管唔係應用於神經網絡，Linnainmaa於1970年都發布咗自動微分（AD）嘅通用方法。即管存在有好大爭議，但一啲科學家認為呢個實質上係開發反向傳播算法嘅第一步。1973年，Dreyfus根據誤差梯度照比例調整啲控制器嘅參數。1974年，威波士（Werbos）提到咗個可能性嚟將呢一原理應用於人工神經網絡；而且喺1982年，佢將Linnainmaa嘅AD方法應用於非線性函數。

後來1985年，Parker 重新發現咗Werbos方法，並於1986年由Rumelhart、Hinton同埋Williams重新描述咗Werbos方法。Rumelhart、Hinton同埋Williams透過實驗證明，呢種方法可以喺神經網絡嘅隱藏𤗲裏頭生成啲有用嘅內部表示嚟表示返啲輸入數據。Rumelhart, David E.; Hinton, Geoffrey E.; Williams, Ronald J. (1986a). "Learning representations by back-propagating errors". *Nature*. **323** (6088): 533–536. Bibcode:1986Natur.323..533R. doi:. S2CID&nbsp;205001834.卷積神經網絡體系結構嘅發明者Yann LeCun喺1987年嘅博士學位論文裏頭提出咗反向傳播學習算法嘅現代形式畀個神經網絡。1993年，Eric Wan透過反向傳播贏得咗國際模式識別比賽。Schmidhuber, Jürgen (2015). "Deep learning in neural networks: An overview". *Neural Networks*. **61**: 85–117. arXiv:[//arxiv.org/abs/1404.7828 1404.7828]. doi:. PMID&nbsp;[//pubmed.ncbi.nlm.nih.gov/25462637 25462637]. S2CID&nbsp;11715509.

喺2000年代，反向傳播唔似往時咁受歡迎；但喺2010年代又返生，得益於廉價又強大嘅啲基於GPU嘅計算系統；尤其係喺啲領域似語音識別、機械視覺，自然語言處理同埋語言結構學習研究（用於解釋與第一語言學習同埋第二語言學習啲現象） 當中。

誤差反向傳播亦都經已俾人建議攞來解釋人腦啲ERP組件，譬如N400同埋P600。

## 睇埋
* 人工神經網絡
* 生物神經網絡
* 災難型遺忘
* 集成學習
* AdaBoost
* 過適
* 神經反向傳播
* 越時反向傳播算法

## 註

## 考

## 讀埋
* 
* 

## 連出去
* Wikiversity上嘅反向傳播神經網絡教程
* 
* 
* 

類:人工神經網絡