完整講解與原文對照 / Full explanation and source comparison
多層網路怎麼算梯度?靠反向傳播
訓練前饋神經網路,本質仍是梯度下降,但參數散落在各層,要算 ∂e/∂wiℓ 不能硬算——反向傳播(Backpropagation) 用鏈式法則從輸出層往回算,一次搞定所有權重梯度。同樣由 Rumelhart 等人系統化提出;概念上就是「分層系統裡的梯度下降 + 遞迴求導」。
單一神經元:前向與 δ
考慮神經元 i,權重 wiℓ 連接前一層神經元 ℓ。前向計算(式 (9)–(10)):
amp;ai=ℓ=1∑mwiℓzℓ,amp;zi:=σi(ai),(9)(10)
ai 是激活前加權和,zi 是激活後輸出,σi 是激活函數。
對任意權重 wiℓ,鏈式法則給出(式 (11)–(12)):
∂wiℓ∂e=∂ai∂e×∂wiℓ∂ai=(a)δi×zℓ,(11)
δi:=∂ai∂e.(12)
δi 是誤差對激活前輸入的敏感度;因為 ∂ai/∂wiℓ=zℓ,梯度 = δi×zℓ。
隱藏層的 δ:往後傳
若 i 在隱藏層(非輸出層),δi 要從下游層累加回來(式 (13)–(15)):
δi=∂ai∂e=j∑(δj×∂ai∂aj)=j∑(δj×wjiσ′(ai)),(15)
其中 ∂aj/∂ai=wjiσ′(ai)(式 (14))。代入式 (11) 得隱藏層權重梯度(式 (16)):
∂wiℓ∂e=zℓσ′(ai)j∑(δjwji).(16)
權重更新:輸出層 vs 隱藏層
通用更新(式 (17)):
wiℓ(k+1):=wiℓ(k)−η(k)∂wiℓ∂e,∀i,ℓ.(17)
輸出層(i 在最後一層,式 (18)):
wiℓ(k+1):=wiℓ(k)−η(k)zℓ∂ai∂e.(18)
隱藏層(式 (19)):
wiℓ(k+1):=wiℓ(k)−η(k)zℓσ′(ai)j∑(δjwji).(19)
差別在:輸出層 δi=∂e/∂ai 可直接算;隱藏層要多乘 σ′(ai) 並把下游 δj 加權傳回來。
Algorithm 2 流程摘要
- 初始化權重 w(0);
- 每輪 k:設學習率 η(k);
- 從最後一層往回(layer r → 第一層):對每個神經元 i、前一層神經元 ℓ:
- 若 r 是最後一層:用式 (18);
- 否則:用式 (19);
- 檢查收斂;未收斂則調整 η(k) 繼續。
口語版:先 forward 算 a,z 和 loss → 輸出層算 δ → 一層層往回傳 δ → 用 δizℓ(加隱藏層修正)更新每個 wiℓ。
教授祕笈:反向傳播——鍋爐房傳話,誤差從出口倒灌(式 (9)–(19))
同學,KP-1 已經劇透過:多層網路之所以能訓,靠的是反向傳播(Backpropagation)。今天進鍋爐房。前向很單純——煤炭從入口一間間傳到煙囪;麻煩的是出事以後。煙囪蒸汽太多或太少,你不能把整座廠拆了重算,你要讓「哪根閥門轉錯了」這句話,從出口倒灌回每一間房。Rumelhart 等人把這套傳話系統化:本質就是分層系統裡的梯度下降,配上鏈式法則。整節一句話:誤差從出口倒灌,每根閥門只聽隔壁傳過來的抱怨。
先把任務講成一句人話
訓練前饋網路,骨子裡還是梯度下降,但權重散落在各層,wiℓ 對最終誤差 e 的偏導不能硬算。反向傳播從輸出層開始,用鏈式法則一層層把「誤差對激活前輸入的敏感度」δ 往回傳,於是每個權重的梯度都變成「我的 δ 乘上前面傳來的輸出」。
鷹架式:先直覺,再符號
整座廠只做兩件事:先往前燒、再往回罵。
- 前向(燒):每間房把前一間送來的量加權求和,得到爐溫 a,再經閥門函數 σ 變成送出的蒸汽 z。
- 反向(罵):煙囪先算「蒸汽跟目標差多少」,這句抱怨變成輸出房的 δ;上一間房把各下游的 δ 按自己接出去的管路加權加總,再乘上自己閥門有多敏感,得到本房的 δ。
- 調閥門:知道這間房的 δ、也知道前一間送來多少 z,兩者一乘就是這根管子該轉的方向。
符號逐個拆
神經元 i 的前向,就是鍋爐房的兩道手續(式 (9)–(10)):
ai=ℓ=1∑mwiℓzℓ.(9)
zi:=σi(ai).(10)
- zℓ:前一間房送來的蒸汽(前一層輸出)。
- wiℓ:從 ℓ 接到 i 的管子粗細,也就是權重。
- ai:激活前的加權和,爐溫還沒過閥門。
- σi:激活函數,閥門怎麼把爐溫轉成輸出。
- zi:這間房送出去的蒸汽。
對任意一根管子 wiℓ,鏈式法則拆成兩段(式 (11)–(12)):
∂wiℓ∂e=∂ai∂e×∂wiℓ∂ai=(a)δi×zℓ,(11)
δi:=∂ai∂e.(12)
δi 是誤差對這間房爐溫的敏感度。因為 ai 裡 wiℓ 前面乘的就是 zℓ,所以 ∂ai/∂wiℓ=zℓ,梯度=抱怨強度 × 進來的量。
若 i 在隱藏層,它自己看不見煙囪,必須接下游的電話。式 (13)–(14) 先把 ∂e/∂ai 拆成「各下游 δj 乘上 ∂aj/∂ai」,而 ∂aj/∂ai=wjiσ′(ai);加總後就是式 (15):
δi=j∑(δjwjiσ′(ai)).(15)
白話:把每間下游房的 δj,乘上「我接過去那根管子 wji」,再乘上「我這扇閥門此刻有多敏感 σ′(ai)」,全部加起來。代入式 (11) 就是隱藏層權重梯度(式 (16)):
∂wiℓ∂e=zℓσ′(ai)j∑(δjwji).(16)
通用更新還是梯度下降(式 (17)):
wiℓ(k+1):=wiℓ(k)−η(k)∂wiℓ∂e.(17)
輸出層看得到誤差,直接用 δi=∂e/∂ai(式 (18));隱藏層多乘 σ′ 並加總下游(式 (19)):
wiℓ(k+1):=wiℓ(k)−η(k)zℓ∂ai∂e,(18)
wiℓ(k+1):=wiℓ(k)−η(k)zℓσ′(ai)j∑(δjwji).(19)
Algorithm 2 的遍歷順序只有一句:從最後一層往回第一層。先 forward 算出所有 a、z 和 e,輸出層算 δ,一層層倒灌,再用 δizℓ(隱藏層加上 σ′ 與下游加權)更新每根管子。
真的算一遍:兩間房、一根倒灌的電話
最小鍋爐房:入口 → 隱藏房 i → 出口房 j。激活用 σ(a)=a2(所以 σ′(a)=2a),出口不再轉彎(恆等)。學習率 η=0.1,誤差 e=21(zj−0)2(目標蒸汽是 0,實際太多)。
| 步驟 | 人話 | 數字 |
| 入口送來 | zℓ | 1 |
| 隱藏管子 | wiℓ | 1 |
| 隱藏爐溫 | ai=wiℓzℓ | 1 |
| 隱藏送出 | zi=σ(ai)=ai2 | 1 |
| 閥門斜率 | σ′(ai)=2ai | 2 |
| 出口管子 | wji | 1 |
| 出口爐溫/蒸汽 | aj=zj=wjizi | 1 |
| 誤差 | e=21(1−0)2 | 0.5 |
| 出口 δj | ∂e/∂aj=zj−0 | 1 |
| 出口梯度 | δj⋅zi(式 (11)) | 1 |
| 隱藏 δi | δjwjiσ′(ai)(式 (15)) | 1×1×2=2 |
| 隱藏梯度 | δi⋅zℓ | 2 |
更新:出口管子式 (18) 變成 1−0.1×1×1=0.9;隱藏管子式 (19) 變成 1−0.1×1×2×(1×1)=0.8。誤差 0.5 是正的、蒸汽太多,兩根管子都往細調——倒灌的方向跟常識一致。
用差分偷瞄一眼隱藏梯度:把 wiℓ 從 1 撥到 1.01,則 ai=1.01、zi=1.0201、zj=1.0201、e≈0.5203,差量約 0.0203/0.01=2.03,貼近我們算的 2。鏈式法則不是咒語,是可以對帳的算術。
先留一個反轉
出口蒸汽明明全錯,中間那根閥門有沒有可能這一步完全不動?有。給隱藏房接兩根出口:一根 δ1=1、w1i=1,另一根 δ2=−1、w2i=1。式 (15) 的加總 1⋅1+(−1)⋅1=0,於是 δi=0,隱藏梯度也是 0。兩間鍋爐房一個嫌熱、一個嫌冷,電話打到中間互相抵消——中間那個人這回合收不到任何該轉閥門的指示。反向傳播傳的不是「有沒有錯」,而是帶正負號、會對消的敏感度。你若以為「下游有錯、上游一定會動」,數字會打你臉。
換個場景,自己找出同一條路
把鍋爐房換成公司客訴專線:客服(輸出層)先聽到客人罵什麼,把「這單該誰負責」δ 打給課長;課長再按各組貢獻的權重 wji、以及自己這關有多敏感 σ′,加總後打給組長。組長調的那根旋鈕,仍然是 δ×(下屬交來的量)。骨架與式 (11)、(15)、(19) 相同,只是工廠換成辦公室。
留一題:入口 zℓ=2,隱藏 wiℓ=0.5、ai=1,仍用 σ(a)=a2,出口 wji=2、目標改成 3,η=0.05。自己走一遍前向、δj、δi、兩根管子的新權重。式 (9)–(19) 夠你算完。
大家最容易在這裡搞混
第一個誤解:δi 是 ∂e/∂w 或 ∂e/∂z。錯,式 (12) 寫明 δi:=∂e/∂ai,是對激活前爐溫,不是對權重、也不是對激活後輸出。第二個誤解:反向是從輸入層往輸出層走。錯,Algorithm 2 是從最後一層往回第一層;你得先有下游的 δj 才能算上游的 δi。第三個誤解:隱藏層更新跟輸出層「只差一個學習率」。錯,式 (19) 比式 (18) 多了 σ′(ai) 與下游 δj 的加權和——少乘 σ′,閥門敏感度整段消失,梯度就傳錯。
跨知識點掛勾
- KP-1:本章把反向傳播當訓練多層網路的引擎;本節是那句話的施工圖。
- KP-2:式 (17) 就是式 (4) 的逐權重版本;反向傳播負責把式 (4) 裡那個 ∇f 在每根管子上算出來。
- KP-5:動量加在「梯度已經算好、要怎麼走」之後,不取代傳話,只讓推車帶慣性。
- KP-7:每筆資料都會走一遍這套 forward–backward,得到的就是單樣本梯度 ∇fi;下一節改成每次只抽一筆來更新。
換句話重述
把整節濃縮成一句:前向用式 (9)–(10) 把爐溫與蒸汽算完;δi=∂e/∂ai,權重梯度是 δizℓ;隱藏層的 δ 從下游倒灌(式 (15)–(16));輸出層用式 (18)、隱藏層用式 (19),而且一定從最後一層往回走。
一句話收尾: 誤差從煙囪倒灌,每間鍋爐房只接隔壁電話——δ 乘上進來的量,閥門就知道該轉哪邊。