Backpropagation 算法的推導與直觀圖解


摘要

本文是對 Andrew Ng 在 Coursera 上的機器學習課程中 Backpropagation Algorithm 一小節的延伸。文章分三個部分:第一部分給出一個簡單的神經網絡模型和 Backpropagation(以下簡稱 BP)算法的具體流程。第二部分以分別計算第一層和第二層中的第一個參數(parameters,在神經網絡中也稱之為 weights)的梯度為例來解釋 BP 算法流程,並給出了具體的推導過程。第三個部分采用了更加直觀的圖例來解釋 BP 算法的工作流程。

注:1. 文中有大量公式,在 PC 或大屏移動設備下閱讀排版更佳

  2. 為了方便討論,省去了 Bias unit,並在第二部分的討論中省去了 cost function 的正則化項

  3. 如果熟悉 Ng 課程中使用的字符標記,則推薦的閱讀順序為:第一、第三、第二部分

 

第一部分 BP 算法的具體過程


圖 1.1 給出了一個簡單的神經網絡模型(省去了 Bias unit):

圖 1.1 一個簡單的神經網絡模型

圖 1.1 一個簡單的神經網絡模型

 

其中字符標記含義與 Ng 課程中的一致:

\(x_1, x_2, x_3 \) 為輸入值,也即 \(x^{(i)}\) 的三個特征;

 \(z^{(l)}_{j}\) 為第 l 層的第 j 個單元的輸入值。

 \(a^{(l)}_{j}\) 為第 層的第 j 個單元的輸出值。其中 a = g(z)g 為 sigmoid 函數。

 \(\Theta_{ij}^{(l)}\) 第 l 層到 l+1 層的參數(權重)矩陣。

 

表 1.1 BP 算法的具體流程(Matlab 偽代碼)

1    for i = m,

2        \(a^{(1)} = x ^{(i)};\)

3        使用前饋傳播算法計算 \(a^{(2)}, a^{(3)};\)

4        \(\delta^{(3)} = a^{(3)} - y^{(i)};\)                                                                

5        \(\delta^{(2)} = (\Theta^{(2)})^T * \delta^{(3)} .* g\prime(z^{(2)});\)  % 第 2 個運算符 ' .* ' 為點乘,即按元素操作

6        \(\Delta^{(2)} = \Delta^{(2)} + a^{(2)} * \delta^{(3)};\)

7        \(\Delta^{(1)} = \Delta^{(1)} + a^{(1)} * \delta^{(2)};\)

8    end;

 

第二部分 BP 算法步驟的詳解與推導過程

 

BP 算法的目的在於為優化函數(比如梯度下降、其它的高級優化方法)提供梯度值,即使用 BP 算法計算代價函數(cost function)對每個參數的偏導值,其數學形式為:\(\frac{\partial}{\partial{\Theta^{(l)}_{ij}}}J(\Theta)\),並最終得到的值存放在矩陣 \(\Delta^{(l)}\) 中。

若神經網絡有 K 個輸出(K classes),那么其 J(Θ) 為:

\[J(\Theta) = -\frac{1}{m}\sum_{i=1}^m\sum_{k=1}^K[y^{(i)}_klog(h_\Theta(x^{(i)})_k) + (1-y_k^{(i)})log(1-h_\Theta(x^{(i)})_k)]\]

接下來,以計算 \(\Theta_{11}^{(1)}, \Theta_{11}^{(2)}\) 為例來給出 BP 算法的詳細步驟。對於單個訓練用例,其代價函數為:

\[J(\Theta) = -[y^{(i)}_klog(h_\Theta(x^{(i)})_k) + (1-y_k^{(i)})log(1-h_\Theta(x^{(i)})_k)]    (式1)\]

其中 \(h_\Theta(x) = a^{(l)} = g(z^{(l)})\), g 為 sigmoid 函數。

 

計算 \(\Theta_{11}^{(2)}\) 的梯度:

\[\frac{\partial J(\Theta)}{\partial \Theta_{11}^{(2)}} = \frac{\partial J(\Theta)}{\partial a_1^{3}} * \frac{\partial a_1^{(3)}}{\partial z_1^{(3)}} * \frac{\partial z_1^{(3)}}{\partial \Theta_{11}^{(2)}}    (式 2)\]

先取出式 2 中等號右邊前兩項,並將其記為 \(\delta_1^{(3)}\):

\[\delta_1^{(3)} = \frac{\partial J(\Theta)}{\partial a_1^{3}} * \frac{\partial a_1^{(3)}}{\partial z_1^{(3)}}    (式 3)\]

這里給出 \(\delta^{(l)}\) 的定義,即:

 \[\delta^{(l)} = \frac{\partial}{\partial z^{(l)}}J(\Theta)^{(i)}    (式 4)\]

對式 3 進行詳細計算,即將 \(J(\Theta)\) 對 \(z_1^{(3)}\) 求偏導(計算過程中簡記為 z):

 \[\delta_1^{(3)} = \frac{\partial J(\Theta)}{\partial a_1^{(3)}} * \frac{\partial a_1^{(3)}}{\partial z_1^{(3)}}\]

\[=-[y * \frac{1}{g(z)}*g\prime(z) + (1-y)*\frac{1}{1 - g(z)}*(-g\prime(z))]\]

\[=-[y*(1-g(z))+(y-1)*g(z)]\]

\[=g(z)-y =a^{(3)}-y\]

其中用到了 sigmoid 函數的一個很好的性質:

\[g\prime(z)=g(z) * (1-g(z))    (易證)\]

這樣便得到了表 1.1 中 BP 算法的第四行過程。

接下來觀察式 2 中等號右邊最后一項  \(\frac{\partial z_1^{(3)}}{\partial \Theta_{11}^{(2)}}\):

其中 \(z_1^{(3)}=\Theta_{11}^{(2)}*a_1^{(2)}+\Theta_{12}^{(2)}*a_2^{(2)}+\Theta_{13}^{(2)}*a_3^{(2)}\),則易得:

 \[\frac{\partial z_1^{(3)}}{\partial \Theta_{11}^{(2)}}=a_1^{(2)}    (式 5)\]

再回頭觀察最初的式 2,代入式 3 和式 5,即可得到:

 \[\frac{\partial J(\Theta)}{\partial \Theta_{11}^{(2)}} = \delta_1^{(3)} * a_1^{(2)}\]

這樣便推導出了表 1.1 中 BP 算法的第六行過程。

至此,就完成了對 \(\Theta_{11}^{(2)}\) 的計算。

 

計算 \(\Theta_{11}^{(1)}\) 的梯度

 \[\frac{\partial J(\Theta)}{\partial \Theta_{11}^{(1)}} = \frac{\partial J(\Theta)}{\partial a_1^{3}} * \frac{\partial a_1^{(3)}}{\partial z_1^{(3)}}*\frac{\partial z_1^{(3)}}{\partial a_1^{(2)}}*\frac{\partial a_1^{(2)}}{\partial z_1^{(2)}}*\frac{\partial z_1^{(2)}}{\partial \Theta_{11}^{(1)}}    (式 6)\]

類似地,根據式 4 中對 \(\delta^{(l)}\) 的定義,可以把上式(即式 6)等號右邊前四項記為  \(\delta_1^{(2)}\) 。即:

 \[\delta_1^{(2)}=\frac{\partial J(\Theta)}{\partial a_1^{3}} * \frac{\partial a_1^{(3)}}{\partial z_1^{(3)}}*\frac{\partial z_1^{(3)}}{\partial a_1^{(2)}}*\frac{\partial a_1^{(2)}}{\partial z_1^{(2)}}    (式 7)\]

可以發現式 3 中的  \(\delta_1^{(3)}\)  是這個等式右邊的前兩項。

 

於是  \(\delta^{(l)}\)  的意義就體現出來了:它是用來保存上一次計算的部分結果。在計算  \(\delta^{(l-1)}\)  時,可以使用這個部分結果繼續向下逐層求偏導。這樣在神經網絡特別復雜、有大量計算時就可以節省大量重復的運算,從而有效地提高神經網絡的學習速度。

 

繼續觀察式 7,其等號右邊第三項易算得(已知  \(z_1^{(3)}=\Theta_{11}^{(2)}*a_1^{(2)}+\Theta_{12}^{(2)}*a_2^{(2)}+\Theta_{13}^{(2)}*a_3^{(2)}\)):

 \[\frac{\partial z_1^{(3)}}{\partial a_1^{(2)}} = \Theta_{11}^{(2)}    (式 8)\]

式 7 等號右邊最后一項為:

 \[\frac{\partial a_1^{(2)}}{\partial z_1^{(2)}}=g\prime(z_1^{(2)})   (式 9) \]

將 \(\delta_1^{(3)}\)、式 8、式 9 代入式 7,即可得到:

 \[\delta_1^{(2)}=\delta_1^{(3)}*\Theta_{11}^{(2)}*g\prime(z_1^{(2)})    (式 10)\]

這樣便推導出了表 1.1 中 BP 算法第五行過程。

接下來繼續計算式 6 中等號右邊最后一項,已知  \(z_1^{(2)}=\Theta_{11}^{(1)}*a_1^{(1)}+\Theta_{12}^{(1)}*a_2^{(1)}+\Theta_{13}^{(1)}*a_3^{(1)}\),易得:

 \[\frac{\partial z_1^{(2)}}{\partial \Theta_{11}^{(1)}}=a_1^{(1)}    (式 11)\]

將式 10、式 11 代入最開始的式 6 即可得:

 \[\frac{\partial J(\Theta)}{\partial \Theta_{11}^{(1)}} =\delta_1^{(2)} * a_1^{(1)}\]

如此,即可得到表 1.1 中 BP 算法的第七行過程。

至此,就完成了對 \(\Theta_{11}^{(1)}\) 的計算。

 

第三部分 BP 算法的直觀圖解

 

神經網絡學習算法圖概覽

給定一個函數 f(x),它的首要求導對象是什么?就是它的輸入值,是自變量 x。那 f(g(x)) 呢?即把g(x) 當作一個整體作為它的輸入值,它的自變量。那么 g(x) 這個整體就是它的首要求導對象。因此,一個函數的求導對象是它的輸入值,是它的自變量。弄清楚這一點,才能在求多元函數偏導的鏈式法則中游刃有余。

圖 3.1 自下而上,每一個框是上面一個框的輸入值,也即上面一個框中函數的自變量。這張圖明確了神經網絡中各數據之間的關系——誰是誰的輸入值,圖中表現得非常清楚。上段提到一個函數的求導對象是它的輸入值,那么通過圖 3.1 就能非常方便地使用鏈式法則,也能清楚地觀察到 BP 算法的流程(后面一個小節會給出一個更具體的 BP 流程圖)。

對照文首給出的圖 1.1 神經網絡的模型圖,應該很容易理解圖 3.1 的含義,它大致地展現了神經網絡的學習(訓練)流程。前饋傳播算法自下而上地向上計算,最終可以得到 \(a^{(3)}\),進一步可以計算得到 \(J(\Theta)\)。而 BP 算法自頂向下,層層求偏導,最終得到了每個參數的梯度值。下面一個小節將仔細介紹本文的主題,即 BP 算法的流程圖解。

圖 3.1 神經網絡學習算法概覽

圖 3.1 神經網絡學習算法概覽

 

BP 算法的直觀圖解

圖 3.2 給出了 BP 算法的計算流程,並附上了具體的計算步驟。BP 算法的流程在這張圖中清晰可見:自頂向下(對應神經網絡模型為自輸出層向輸入層)層層求偏導。因為神經網絡的復雜性,人們總是深陷於求多元函數偏導的泥潭中無法自拔:到底該對哪個變量求導?圖 3.2 理順了神經網絡中各數據點之間的關系,誰是誰的輸入值,誰是誰的函數一清二楚,然后就可以暢快地使用鏈式法則了。

> 如果看不清圖片上的文字,可在圖片上右鍵,選擇在新窗口中打開以查看原圖

圖3.2 BP 算法流程

圖3.2 BP 算法流程

 

所以 BP 算法即反向傳播算法,就是自頂向下求代價函數 \(J(\Theta)\) 對各個參數 \(\Theta_{ij}^{(l)}\) 偏導的過程,對應到神經網絡模型中即自輸出層向輸入層層層求偏導。在圖 3.2 中,當反向傳播到 \(a_1^{(2)}\) 結點時,遇到分叉路口:選擇對 \(\Theta_{11}^{(2)}\) 求偏導,即可得到第二層的參數梯度。而若選擇對 \(a_1^{(2)}\) 這條路徑繼續向下求偏導,就可以繼續向下(即輸出層)傳播,繼續向下求偏導,最終可得到第一層的參數梯度,於是就實現了 BP 算法的目的。在選擇分叉路口之前,使用 \(\delta^{(l)}\) 來保存到達分岔路口時的部分結果(本文的第二部分對 \(\delta^{(l)}\) 做出了精確定義)。那么如果選擇繼續向下求偏導,則還可以使用這個部分結果繼續向下逐層求偏導。從而避免了大量的重復計算,有效地提升了神經網絡算法的學習速度。

 

因此可以觀察到 BP 算法兩個突出特點:

1) 自輸出層向輸入層(即反向傳播),逐層求偏導,在這個過程中逐漸得到各個層的參數梯度。

2) 在反向傳播過程中,使用 \(\delta^{(l)}\) 保存了部分結果,從而避免了大量的重復運算。

 

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM