為了講清楚反傳遞算法,我們必須先發明一點數學符號!
讓我們先回頭看看梯度中的基本元素,也就是偏微分,其定義是:
∂xi∂f(x)=h→0limhf(x1,...,xi+h,....,xn)−f(x1,...,xi,....,xn)
舉例而言,假如對 f(x,y)=x2+y2 這個函數而言,其對 x 的偏微分就是:
∂x∂f(x,y)=h→0limhf(x+h,y)−f(x,y)
而對 y 的偏微分就是:
∂y∂f(x,y)=h→0limhf(x,y+h)−f(x,y)
以上的數學符號源自《萊布尼茲》
讓我們考慮一個兩層式網路如下圖,該網路是計算 f = (x+y) * z 這個算式。

其中的 q = x+y, 而 f = q*z。
反傳遞的原理主要來自偏微分的鏈鎖規則,我們可以用以下數學式描述 f, q, x 之間的梯度關係。
∂x∂f(q,z)=∂x∂q(x,y)∂q∂f(q,z)
但是其中的 ∂x 並非偏微分,而是 ∂x∂f(q,z) 才是 f 函數對 的偏微分,這樣寫起來不僅冗長,而且會引導我們一直去把 ∂x 想成偏微分 (梯度向量的其中一個軸),因而會造成很多誤解!
為了避免誤解,我們採用 gfx=∂x∂f 這樣的表達形式,於是可以有下列偏微分式:
gfx=∂x∂f
gfy=∂y∂f
gfq=∂q∂f
gfz=∂z∂f
然後我們可以改寫鏈鎖規則成為以 g 為主的形式:
萊布尼茲形式 : ∂x∂f(q,z)=∂x∂q(x,y)∂q∂f(q,z)
以 g 為主的形式: gfx=gfq∗gqx
這樣的畫我們就可以寫出下列兩組關係式:
gfx=gfq∗gqx
gfy=gfq∗gqy
由於 f=q*z, q=x+y ,因此我們可以計算出下列算式:
gfq=z
gqx=1
gqy=1
所以我們得到
gfx=gfq∗gqx=z∗1
gfy=gfq∗gqy=z∗1
如此只要把 z 值帶入就能計算出梯度 gfx 與 gfy 了。
透過這種方式,我們可以一層一層的算回去,得到 f 對任意變數的梯度。
f(x,y)=((2∗x)+(y+1))2
在 x=3, y=2 時,正向傳遞後再反向傳遞的結果為:
運算式 |
正向傳遞 |
閘的梯度 |
反向傳遞 |
x = 3 |
p=6 |
gfx=?? |
36 |
y = 2 |
p=6 |
gfy=?? |
18 |
p = 2*x = 2x |
p=6 |
gpx=2 |
gfx=gfp∗gpx=18∗2=36 |
q = y+1 |
q=3 |
gqy=1 |
gfy=gfq∗gqy=18∗1=18 |
r = p+q = 2x+y+1 |
r=9 |
grq=1 ; grp=1 |
gfq=gfr∗grq=18∗1 ; gfp=gfr∗grp=18∗1 |
f=r∗r=(2x+y+1)2 |
f=9*9 |
gfr=2r=18 |
gfr=gfr∗gff=18 |
f = f |
f=81 |
|
gff=1 |
2x => p
+ => r*r => f
y+1 => q
gfx=gfr∗grp∗gpx=1∗18∗2=36
gfy=gfr∗grq∗gqy=1∗18∗1=18
檢驗:
正向: f(x,y)=((2∗x)+(y+1))2=(2∗3+2+1)2=92=81
反向:
gfx=8x+4y+4=8∗3+4∗2+4=36
gfy=4x+2y+2=4∗3+2∗2+2=18