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

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

概述
--

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

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

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

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

{\displaystyle g(x):=f^{L}(W^{L}f^{L-1}(W^{L-1}\cdots f^{1}(W^{1}x)\cdots ))}
對於訓練集，會有一組輸入-輸出孖 {\displaystyle \left\{(x\_{i},y\_{i})\right\}} 。對於訓練集裏頭嘅每個輸入-輸出孖{\displaystyle (x\_{i},y\_{i})}，針對嗰一孖嘅模型個損失就對應個差異嘅成本，個預測輸出{\displaystyle g(x\_{i})}同埋目標輸出{\displaystyle y\_{i}} 之間嘅：

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

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

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

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

矩陣乘法
----

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

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

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

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

{\displaystyle {\frac {dC}{da^{L}}}\cdot {\frac {da^{L}}{dz^{L}}}\cdot {\frac {dz^{L}}{da^{L-1}}}\cdot {\frac {da^{L-1}}{dz^{L-1}}}\cdot {\frac {dz^{L-1}}{da^{L-2}}}\cdots {\frac {da^{1}}{dz^{1}}}\cdot {\frac {\partial z^{1}}{\partial x}}.}
以下式嗰三項唔同樣式嘅分別係損失函數嘅導數{\displaystyle {\frac {dC}{da^{L}}}}；啲啟動函數嘅導數{\displaystyle f^{L}\dots }；同埋啲權重矩陣{\displaystyle W^{L}\dots }，由後到前： 

{\displaystyle {\frac {dC}{da^{L}}}\cdot (f^{L})'\cdot W^{L}\cdot (f^{L-1})'\cdot W^{L-1}\cdots (f^{1})'\cdot W^{1}.}
以下個梯度{\displaystyle \nabla }係轉置咗個輸出對輸入嘅導數，因此矩陣着轉置而且乘法嘅順序着反轉，但意義係相同嘅：

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

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

{\displaystyle \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.}
注意{\displaystyle \delta ^{l}}係一枚向量，佢長度等於𤗲{\displaystyle l}裏頭嘅綟數；每個組分都可以解釋成「歸屬嗰粒綟嘅（值嘅）成本」。

𤗲{\displaystyle l}裏頭啲權重嘅梯度就係：

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

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

{\displaystyle \delta ^{l-1}:=(f^{l-1})'\cdot (W^{l})^{T}\cdot \delta ^{l}.}
係噉，計算權重嘅梯度就可以用一啲矩陣乘法來幫每𤗲求，即「反向傳播」：

{\displaystyle {\begin{aligned}\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{aligned}}}
相較起嚟，單純噉計算前向值（forwards）（使用{\displaystyle \delta ^{l}}講明）會係噉：

{\displaystyle {\begin{aligned}\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{aligned}}}
比起噉，反向傳播有兩個關鍵分別：

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

伴隨圖
---

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

直觀解釋
----

### 動機

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

### 當優化問題噉學習

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

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

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

{\displaystyle L(t,y)=(t-y)^{2}=E,}
裏頭E 係差異或者誤差。

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

單個訓練案例嘅線性神經元嘅誤差面
但係，神經元嘅輸出取決於其所有輸入嘅加權同埋：

{\displaystyle y=x\_{1}w\_{1}+x\_{2}w\_{2},}
其中{\displaystyle w\_{1}}同埋{\displaystyle w\_{2}}係輸入單元到輸出單元個連接嘅權重。因此，誤差仲取決於個神經元嘅輸入權重，要學習嘅話網絡裏頭最終係要改變佢先得。

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

{\displaystyle E=(t-y)^{2}=y^{2}=(x\_{1}w\_{1}+x\_{2}w\_{2})^{2}=(w\_{1}+w\_{2})^{2}.}

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

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

推導例
---

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

{\displaystyle E=L(t,y)}
其中

{\displaystyle E}係輸出嘅損失，
{\displaystyle t}係訓練樣本嘅目標輸出，
{\displaystyle y}係輸出神經元嘅實際輸出。
對於每粒神經元{\displaystyle j}，佢個輸出{\displaystyle o\_{j}}着定義成前一𤗲啲神經元輸出加權求和，再通過一個函數{\displaystyle \varphi }：

{\displaystyle o\_{j}=\varphi ({\text{net}}\_{j})=\varphi \left(\sum \_{k=1}^{n}w\_{kj}o\_{k}\right),}
其中個函數{\displaystyle \varphi }即係啟動函數，係非線性且可微得嘅（即使ReLU唔喺一個點上）。歷史上使過嘅啟動函數係邏輯函數：

{\displaystyle \varphi (z)={\frac {1}{1+e^{-z}}}}
個導數形式幾好：

{\displaystyle {\frac {d\varphi (z)}{dz}}=\varphi (z)(1-\varphi (z))}
神經元個輸入{\displaystyle {\text{net}}\_{j}}係之前啲神經元嘅輸出{\displaystyle o\_{k}}嘅加權總和。若果隻神經元位於輸入𤗲之後嘅第一𤗲，噉個輸入{\displaystyle o\_{k}}就係成個網絡嘅輸入{\displaystyle x\_{k}}。神經元嘅輸入單位數為{\displaystyle n} 。變數{\displaystyle w\_{kj}}表示神經元之間嘅權重，其中{\displaystyle k}係前一𤗲神經元，{\displaystyle j}係當前𤗲神經元。

### 搵誤差嘅導數

人工神經網絡圖，用於講明呢處使到嘅表示法

針對權重{\displaystyle w\_{ij}}計算誤差偏導數，用兩次鏈式法則：

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\frac {\partial E}{\partial 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}}}} | 

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

 | **(Eq. 1)** |

喺上述右便手嘅最後一行，總和{\displaystyle {\text{net}}\_{j}}裏頭只有一項係取決於{\displaystyle w\_{ij}}，所以：

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\frac {\partial {\text{net}}\_{j}}{\partial 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}.} | 

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

 | **(Eq. 2)** |

若果隻神經元喺輸入𤗲之後嘅第一𤗲，{\displaystyle o\_{i}}就係{\displaystyle x\_{i}} 。隻神經元輸出對應輸入嘅導數{\displaystyle j}即係啟動函數嘅偏導數：

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\frac {\partial o\_{j}}{\partial {\text{net}}\_{j}}}={\frac {\partial \varphi ({\text{net}}\_{j})}{\partial {\text{net}}\_{j}}}} | 

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

 | **(Eq. 3)** |

對於邏輯啟動函數嘅情況係：

{\displaystyle {\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裏頭）

第一項好容易計得出，若果神經元係喺輸出𤗲，因為噉樣就有{\displaystyle o\_{j}=y}同埋

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\frac {\partial E}{\partial o\_{j}}}={\frac {\partial E}{\partial y}}} | 

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

 | **(Eq. 4)** |

若果攞平方誤差嘅二份一作爲損失函數，可以重寫過條式成為

{\displaystyle {\frac {\partial E}{\partial o\_{j}}}={\frac {\partial E}{\partial y}}={\frac {\partial }{\partial y}}{\frac {1}{2}}(t-y)^{2}=y-t}
但係，若果{\displaystyle j}喺網絡嘅任意內部𤗲裏頭，唔係咁顯然噉搵得到相對於輸出{\displaystyle o\_{j}}嘅導數{\displaystyle E}。

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

{\displaystyle {\frac {\partial E(o\_{j})}{\partial o\_{j}}}={\frac {\partial E(\mathrm {net} \_{u},{\text{net}}\_{v},\dots ,\mathrm {net} \_{w})}{\partial o\_{j}}}}

考慮{\displaystyle o\_{j}}取全微分，就攞得到個導數嘅遞歸表達式：

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\frac {\partial E}{\partial o\_{j}}}=\sum \_{\ell \in L}\left({\frac {\partial E}{\partial {\text{net}}\_{\ell }}}{\frac {\partial {\text{net}}\_{\ell }}{\partial o\_{j}}}\right)=\sum \_{\ell \in L}\left({\frac {\partial E}{\partial o\_{\ell }}}{\frac {\partial o\_{\ell }}{\partial {\text{net}}\_{\ell }}}{\frac {\partial {\text{net}}\_{\ell }}{\partial o\_{j}}}\right)=\sum \_{\ell \in L}\left({\frac {\partial E}{\partial o\_{\ell }}}{\frac {\partial o\_{\ell }}{\partial {\text{net}}\_{\ell }}}w\_{j\ell }\right)} | 

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

 | **(Eq. 5)** |

因此，針對{\displaystyle o\_{j}}嘅導數就計得出，若果所有啲導數都已知、啲對應下一𤗲（即靠近輸出神經元）嘅輸出{\displaystyle o\_{\ell }}嘅。注意，若果集合{\displaystyle L}裏頭有任何神經元冇連接到神經元{\displaystyle j}，啲神經元會獨立於{\displaystyle w\_{ij}}，而且求和下嘅相應偏導數會消失為0。 

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

{\displaystyle {\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}}
{\displaystyle {\frac {\partial E}{\partial w\_{ij}}}=o\_{i}\delta \_{j}}
同埋

{\displaystyle \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}}}
若果{\displaystyle \varphi }係邏輯函數，誤差係平方誤差：

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

{\displaystyle \Delta w\_{ij}=-\eta {\frac {\partial E}{\partial w\_{ij}}}=-\eta o\_{i}\delta \_{j}}

損失函數
----

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

### 假設條件

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

### 損失函數嘅例

令{\displaystyle y,y'}係{\displaystyle \mathbb {R} ^{n}}裏便嘅向量 。

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

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

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

{\displaystyle 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:10.1038/323533a0. S2CID 205001834.</ref>卷積神經網絡體系結構嘅發明者Yann LeCun喺1987年嘅博士學位論文裏頭提出咗反向傳播學習算法嘅現代形式畀個神經網絡。1993年，Eric Wan透過反向傳播贏得咗國際模式識別比賽。Schmidhuber, Jürgen (2015). "Deep learning in neural networks: An overview". *Neural Networks*. **61**: 85–117. arXiv:1404.7828. doi:10.1016/j.neunet.2014.09.003. PMID 25462637. S2CID 11715509.</ref>

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

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

睇埋
--

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

註
-

1. ↑  Use {\displaystyle C} for the loss function to allow {\displaystyle L} to be used for the number of layers
2. ↑  This follows , and means (left) multiplication by the matrix {\displaystyle W^{l}} corresponds to converting output values of layer {\displaystyle l-1} to input values of layer {\displaystyle l}: columns correspond to input coordinates, rows correspond to output coordinates.
3. ↑  This section largely follows and summarizes .
4. ↑  The derivative of the loss function is a covector, since the loss function is a scalar-valued function of several variables.
5. ↑  The activation function is applied to each node separately, so the derivative is just the diagonal matrix of the derivative on each node. This is often represented as the Hadamard product with the vector of derivatives, denoted by {\displaystyle (f^{l})'\odot }, which is mathematically identical but better matches the internal representation of the derivatives as a vector, rather than a diagonal matrix.
6. ↑  Since matrix multiplication is linear, the derivative of multiplying by a matrix is just the matrix: {\displaystyle (Wx)'=W}.
7. ↑  One may notice that multi-layer neural networks use non-linear activation functions, so an example with linear neurons seems obscure. However, even though the error surface of multi-layer networks are much more complicated, locally they can be approximated by a paraboloid. Therefore, linear neurons are used for simplicity and easier understanding.
8. ↑  There can be multiple output neurons, in which case the error is the squared norm of the difference vector.

考
-

1. 1 2 3 4  Goodfellow, Ian; Bengio, Yoshua; Courville, Aaron (2016). "6.5 Back-Propagation and Other Differentiation Algorithms". *Deep Learning*. MIT Press. pp. 200–220. ISBN 9780262035613.
2. 1 2  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:10.1038/323533a0.
3. 1 2  Rumelhart, David E.; Hinton, Geoffrey E.; Williams, Ronald J. (1986b). "8. Learning Internal Representations by Error Propagation". 出自 Rumelhart, David E.; McClelland, James L. (編). *Parallel Distributed Processing : Explorations in the Microstructure of Cognition*.第Volume 1 : Foundations卷. Cambridge: MIT Press. ISBN 0-262-18120-7. `{{cite book}}`: `|volume=` has extra text (help)
4. 1 2  Nielsen, Michael A. (2015). "How the backpropagation algorithm works". *Neural Networks and Deep Learning*. Determination Press.
5. ↑  LeCun, Yann; Bengio, Yoshua; Hinton, Geoffrey (2015). "Deep learning". *Nature*. **521** (7553): 436–444. Bibcode:2015Natur.521..436L. doi:10.1038/nature14539. PMID 26017442.
6. ↑  Buckland, Matt; Collins, Mark (2002). *AI Techniques for Game Programming*. Boston: Premier Press. ISBN 1-931841-08-X.
7. 1 2 3  Rumelhart; Hinton; Williams (1986). "Learning representations by back-propagating errors" (PDF). *Nature*. **323** (6088): 533–536. Bibcode:1986Natur.323..533R. doi:10.1038/323533a0.Rumelhart; Hinton; Williams (1986). "Learning representations by back-propagating errors" (PDF). *Nature*. **323** (6088): 533–536. Bibcode:1986Natur.323..533R. doi:10.1038/323533a0. S2CID 205001834.
8. ↑  Kelley, Henry J. (1960). "Gradient theory of optimal flight paths". *ARS Journal*. **30** (10): 947–954. doi:10.2514/8.5282.
9. ↑  Bryson, Arthur E. (1962). "A gradient method for optimizing multi-stage allocation processes". *Proceedings of the Harvard Univ. Symposium on digital computers and their applications, 3–6 April 1961*. Cambridge: 哈佛大學出版社. OCLC 498866871.
10. ↑  Dreyfus, Stuart E. (1990). "Artificial Neural Networks, Back Propagation, and the Kelley-Bryson Gradient Procedure". *Journal of Guidance, Control, and Dynamics*. **13** (5): 926–928. Bibcode:1990JGCD...13..926D. doi:10.2514/3.25422.
11. ↑  Mizutani, Eiji; Dreyfus, Stuart; Nishio, Kenichi (July 2000). "On derivation of MLP backpropagation from the Kelley-Bryson optimal-control gradient formula and its application" (PDF). Proceedings of the IEEE International Joint Conference on Neural Networks.
12. 1 2  Schmidhuber, Jürgen (2015). "Deep learning in neural networks: An overview". *Neural Networks*. **61**: 85–117. arXiv:1404.7828. doi:10.1016/j.neunet.2014.09.003. PMID 25462637.
13. ↑  Schmidhuber, Jürgen (2015). "Deep Learning". *Scholarpedia*. **10** (11): 32832. Bibcode:2015SchpJ..1032832S. doi:10.4249/scholarpedia.32832.
14. ↑  Dreyfus, Stuart (1962). "The numerical solution of variational problems". *Journal of Mathematical Analysis and Applications*. **5** (1): 30–45. doi:10.1016/0022-247x(62)90004-5.
15. ↑  Russell, Stuart; Norvig, Peter (1995). *Artificial Intelligence : A Modern Approach*. Englewood Cliffs: Prentice Hall. p. 578. ISBN 0-13-103805-2. 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 more or less ignored until the mid-1980s.
16. ↑  Bryson, Arthur Earl; Ho, Yu-Chi (1969). *Applied optimal control: optimization, estimation, and control*. Waltham: Blaisdell. OCLC 3801.
17. ↑  Griewank, Andreas (2012). "Who Invented the Reverse Mode of Differentiation?". *Optimization Stories*. Documenta Matematica, Extra Volume ISMP. pp. 389–400.
18. ↑  The thesis, and some supplementary information, can be found in his book, Werbos, Paul J. (1994). *The Roots of Backpropagation : From Ordered Derivatives to Neural Networks and Political Forecasting*. New York: John Wiley & Sons. ISBN 0-471-59897-6.
19. ↑  Seppo Linnainmaa (1970). The representation of the cumulative rounding error of an algorithm as a Taylor expansion of the local rounding errors. Master's Thesis (in Finnish), Univ. Helsinki, 6–7.
20. ↑  Linnainmaa, Seppo (1976). "Taylor expansion of the accumulated rounding error". *BIT Numerical Mathematics*. **16** (2): 146–160. doi:10.1007/bf01931367.
21. ↑  Griewank, Andreas; Walther, Andrea (2008). *Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation, Second Edition*. SIAM. ISBN 978-0-89871-776-1.
22. ↑  Dreyfus, Stuart (1973). "The computational solution of optimal control problems with time lag". *IEEE Transactions on Automatic Control*. **18** (4): 383–385. doi:10.1109/tac.1973.1100330.
23. ↑  Werbos, Paul (1982). "Applications of advances in nonlinear sensitivity analysis" (PDF). *System modeling and optimization*. Springer. pp. 762–770.
24. ↑  Parker, D.B. (1985). "Learning Logic". Center for Computational Research in Economics and Management Science. Cambridge MA: Massachusetts Institute of Technology. `{{cite journal}}`: Cite journal requires `|journal=` (help)
25. ↑  Hertz, John. (1991). *Introduction to the theory of neural computation*. Krogh, Anders. Palmer, Richard G. Redwood City, Calif.: Addison-Wesley Pub. Co. pp. 8. ISBN 0-201-50395-6. OCLC 21522159.
26. ↑  Anderson, James Arthur; Rosenfeld, Edward (1988). *Neurocomputing Foundations of research*. MIT Press. ISBN 0-262-01097-6. OCLC 489622044.
27. ↑  Alpaydin, Ethem (2010). *Introduction to Machine Learning*. MIT Press. ISBN 978-0-262-01243-0.
28. ↑  Wan, Eric A. (1994). "Time Series Prediction by Using a Connectionist Network with Internal Delay Lines". 出自 Weigend, Andreas S.; Gershenfeld, Neil A. (編). *Time Series Prediction : Forecasting the Future and Understanding the Past*. Proceedings of the NATO Advanced Research Workshop on Comparative Time Series Analysis.第Volume 15卷. Reading: Addison-Wesley. pp. 195–217. ISBN 0-201-62601-2. `{{cite book}}`: `|volume=` has extra text (help)
29. ↑  Chang, Franklin; Dell, Gary S.; Bock, Kathryn (2006). "Becoming syntactic". *Psychological Review*. **113** (2): 234–272. doi:10.1037/0033-295x.113.2.234. PMID 16637761.
30. ↑  Janciauskas, Marius; Chang, Franklin (2018). "Input and Age-Dependent Variation in Second Language Learning: A Connectionist Account". *Cognitive Science*. **42**: 519–554. doi:10.1111/cogs.12519. PMC 6001481. PMID 28744901.
31. ↑  Fitz, Hartmut; Chang, Franklin (2019). "Language ERPs reflect learning through prediction error propagation". *Cognitive Psychology* (英文). **111**: 15–52. doi:10.1016/j.cogpsych.2019.03.002. PMID 30921626.

讀埋
--

* McCaffrey, James (October 2012). "Neural Network Back-Propagation for Programmers". *MSDN Magazine*.
* Rojas, Raúl (1996). "The Backpropagation Algorithm" (PDF). *Neural Networks : A Systematic Introduction*. Berlin: Springer. ISBN 3-540-60505-3.

連出去
---

* Wikiversity上嘅反向傳播神經網絡教程
* Bernacki, Mariusz; Włodarczyk, Przemysław (2004). "Principles of training multi-layer neural network using backpropagation".
* Karpathy, Andrej (2016). "Lecture 4: Backpropagation, Neural Networks 1". *CS231n*. Stanford University –透過YouTube.
* "What is Backpropagation Really Doing?". *3Blue1Brown*. November 3, 2017 –透過YouTube.

| * 睇
* 傾
* 改
機械學習同數據探勘 |
| --- |
| 可以睇埋機械學習詞彙同數據科學 |
| 基本概念 | 人工智能 · 學習 · 運算學習論 · 線性可分度 · 事前數據處理 · 特徵提取 · 知識表示 |  |
| 數學模型 | 

|  |
| --- |
| 迴歸模型 · 決策樹（蒙地卡羅樹搜尋） · 貝葉斯網絡 · 支援向量機 · 關聯規則學習 |
| 神經網絡 | 

|  |  |
| --- | --- |
| 網絡基礎 | 人工神經細胞 · 前饋網絡（感知機 · 多層感知機） |
| 遞迴網絡 | 霍菲特網絡 · 玻茲曼機 · 長短期記憶 · 神經圖靈機 |
| 深度學習 | 卷積網絡 · 受限玻茲曼機（深度信念網絡） · 深度強化學習 |
| 網絡概念 | 反向傳播算法 · 關注機制 · 生成對抗網絡 · 基於流嘅生成模型 |
| 自編碼器 · 脈衝神經網絡 · 自組織對映 · 網絡種類一覽 |

 |

 |
| 最佳化 | 誤差函數 · 爬山演算法 · 梯度下降法 · 全局最佳化 · 正則化 · 變分推斷 · 資訊最大化 |
| 學習範式 | 監督式學習 · 非監督式學習 · 強化學習 · 遺傳演算法 · 主動機械學習 |
| 模型評估 | 自助抽樣法 · 交叉驗證 · 訓練曲線 · 適合度函數 · 過適 |
| 主要應用 | 統計分類（線性分類機） · 表徵學習 · 降維（特徵選擇） · 聚類分析 · 異常檢測 |
| 拉雜相關 | 認知科學 · 電腦科學 · 統計學 · 資訊理論 · 資訊系統、資訊過多同大數據 |
| 機械學習類 · 數據探勘類 |