反向傳播算法( Backpropagation Algorithm )

藉由微積分中的鏈鎖律(Chain rule)使神經網路能更有效率地收斂

--

前言

之前文章提到梯度下降學習法(Gradient Descent Learning Rule),透過偏微分求得梯度之後,再對權重進行優化,使誤差盡可能地縮小。這個方法只要搭配上 Sigmoid Function,即便面對的是非線性可分的數據,仍能收斂在誤差很小的地方。

但其中有個缺點,倘若一個神經網路結構很複雜、神經元數量很多時,運算Gradient 的過程會有非常大量的重複計算。

反向傳播算法(Backpropagation Algorithm)

為了解決這問題,David E. Rumelhart, Geoffrey E. Hinton & Ronald J. Williams 在 1986 年提出《 Learning representations by back-propagating errors 》,文中闡述藉由微積分上的鏈鎖率(Chain rule)可以從神經網路的末端開始計算誤差與各權重的關係,藉此減少運算量。

這個問題如果用僅有單一隱藏層的神經網路當做例子,看不太出端倪,這邊舉個 2 層隱藏層的神經網路當例子,示意圖如下:

因為權重與變數的狀態比之前複雜,稍微對註釋解釋一下:

這邊如果要更新權重 W¹11 就必須利用鏈鎖律(Chain rule)做偏微分,再將其 Gradient 展開來看才能清楚理解重複的部分,在繼續往下看展開公式之前,我先用個簡單的例子說明一下 Chain rule。

鏈鎖率(Chain rule)

鏈鎖率通常應用在複合函數,可節省求導數的時間。在平常簡單的一次、二次的公式可能沒感覺,我們舉一個誇張一點的例子:

這個如果你不知道 Chain rule 大概只能把它全部展開,然後把每一項的次方數字拿下來與係數相乘,再把次方減 1,最後再整理成比較精簡的寫法。

那我們來看看 Chain rule 公式:

藉著這公式,可以把原本例子括弧內的東西想成 u ,那 u(x) 和 y 就可寫成:

再來把這兩個式子代入上面的公式:

這樣就變得簡單的多了
再把 u 代回有 x 變數的式子
到這邊就完成了,如果複合的情況越複雜或次方數非常高,利用 Chain rule 的感覺會越明顯

反向傳播算法(Backpropagation Algorithm)

有了 Chain rule 的概念,我們就可以開始觀察對 W¹11 做偏微分有影響的變數有哪些:

這邊看起來有點複雜,但就只是從網路的末端往回逐一展開,如果用sigma可以寫成:

讓我們從 output 往回慢慢將每個項展開來看,首先是 Loss 和 z³1:

接著次方拿下來與1/2抵銷,而 ŷ 其實就是z³1

再來是看 z³ 1 與 a² i 的關係:

z³ 1 受到第二層隱藏層的兩個輸出影響
如果對 a² 的兩個神經元做偏微,就會剩下各自的係數 w³ 11 和 w³ 12

接著是看 a² i 與 z² i 的關係:

因為 a 其實是 z 經過 sigmoid 之後的值,那其實只要對 sigmoid function 做微分即可,為了讓下一步驟更好理解,這邊先提一下 sigmoid 微分後的樣子。

S型函數(Sigmoid function)微分

這是 sigmoid 原本的公式,常用 σ 表示這函數。這邊將分數形式寫成 -1 次方,方便後續推導
鏈鎖律:外微(內不微) x 內微,這邊自然對數的底數 e 的 -x 次方微分後還是不變,只有負號會影響
前後兩項負號互相抵銷,再將 -2 次方還原成分數形式
先將e的-x次方放上分母,再將平方項展開,會發現後項是原本的 σ(x)
原本的前項拆開成 1 減原本的 σ(x),分子運算完仍是 e 的 -x 次方
將括號內的前項視為 1 ,再將 σ(x) 替換進公式內,就得到了結果

了解 sigmoid function 微分之後的樣子之後,我們回到 Backpropagation 的算法上,繼續看 a² i 與 z² i 的關係:

再往回推一層就會發現開始出現類似 w³ i 那段的算法:

a¹ 1 受到 w² 11 和 w² 21 影響
做完偏微之後只會剩下各自的係數 w² 11 和 w² 21

再來是 a¹ 1 與 z¹ 1:

這邊我就直接替換成 sigmoid 微分後的寫法

最後是 z¹ 1 與 w¹ 11:

最後剩下對 w¹ 11 的偏微

到這邊就是神經網絡反向傳播到 w¹ 11 的過程,為甚麼說這個算法比較有效率呢?我們拿 w¹ 12 與 w¹ 11 來比較一下:

這邊套用上面的展開公式會長這樣:

會發現只差在最後乘上 x 的地方,那同一層的 w 基本上能共享後面網路回傳的值,就可以減少計算量。

雖然這樣使得神經網路在加深之後,仍在可接受的運算時間內完成訓練,但因為使用了 Sigmoid function,造成神經網路出現梯度消失問題(Vanishing gradient problem),這問題我就之後的文章再繼續往下說明~

--

--

Ken Huang
人工智慧,倒底有多智慧?

在網路上自學的過程中,體會到開放式資源的美好,希望藉由撰寫文章記錄研究所的學習過程,同時作為回饋網路世界的一種方式。Email : kenhuang2019iii@gmail.com ,如果有任何問題都歡迎與我聯繫。