1. 程式人生 > >深度學習 --- BP演算法詳解(誤差反向傳播演算法)

深度學習 --- BP演算法詳解(誤差反向傳播演算法)

本節開始深度學習的第一個演算法BP演算法,本打算第一個演算法為單層感知器,但是感覺太簡單了,不懂得找本書看看就會了,這裡簡要的介紹一下單層感知器:

圖中可以看到,單層感知器很簡單,其實本質上他就是線性分類器,和機器學習中的多元線性迴歸的表示式差不多,因此它具有多元線性迴歸的優點和缺點。單層感知器只能對線性問題具有很好的解決能力,但是非線性問題就無法解決了,但是多層感知器卻可以解決非線性問題,多層感知器存在的問題是隱層的權值向量無法調整,我們從學習規則來看:

如上圖的多層感知器的模型,而單層感知器的通用學習規則為:\Delta w_j(t) = \eta (d_j-o_j(t))x,權值的調整量只取決於期望輸出和實際輸出之差,然而對於隱層節點來說不存在期望輸出,因而該權值更新不適合隱層,因為這個問題,一直沒有很好的解決辦法,所以神經網路停滯了。直到1986年, Rumelhart和McCelland提出了反向傳播誤差演算法即BP,徹底的解決了這個問題,也因此神經神經網路從新回到人們的視野。下面我們詳細講解BP演算法,搞懂BP的來龍去脈。

BP演算法

        本篇的核心就是BP演算法,講解過程中會有大量的數學公式,想深入理解BP演算法的同學,請不要懼怕數學,你要克服它,嘗試理解他,數學公式會告訴你最本質的問題,大家跟著我的思路走一定可以理解的,尤其我當時第一次學習時的疑惑的地方更會詳細的講解,同時本篇我是站在對BP一無所知的同學的角度進行講解,學習過程中,建議大家不要只看,自己也動手推一下,搞懂每個公式的來由,另外就是公式有點繁瑣,我會盡量講清楚,好下面開始:

       為了簡單起見,本篇將以三層感知器為例進行講解,下面開始:

上圖給出了三層感知器的模型圖,其中

輸入向量為:

                      x = (x_1,x_2,....,x_i,....,x_n)^T,其中x_0 = -1為隱層神經元引入閾值而設定的。

隱層輸出向量為:

                     Y = (y_1, y_2,...,y_j,...,y_m)^T,其中y_0 = -1是為輸出層神經元引入閾值而設定的。

輸出層向量為:

                     O = (o_1,o_2,...,o_k,...,o_l)^T

期望輸出向量為:

                      d = (d_1,d_2,...,d_k,...,d_l)^T

輸入層到隱層之間的權值矩陣用V表示:

                       V = (V_1,V_2,...,V_j,...,V_m),其中列向量V_j為隱層第j個神經元對應的權向量

                         V=\begin{Bmatrix} v_{11},v_{12},...,v_{1j},...,v_{1m} & \\ v_{21},v_{22},...,v_{2j},...,v_{2m}& \\ ....,....,....,...,...,..., & \\ v_{i1},v_{i2},....,v_{ij},...,v_{im}& \\ ....,....,....,...,...,..., & \\ v_{n1},v_{n2},...,v_{nj},...,v_{nm}& \\ \end{Bmatrix}

隱層到輸出層之間的權值矩陣用W表示為:

                        W = (W_1,W_2,...,W_k,...,W_l),其中列向量W_k為輸出層第k個神經元對應的權值向量

好,到這裡,基本上就是介紹了一些符合的意義,這裡大家需要注意的是下標的含義,輸入向量使用下表i代表第i個輸入。隱層輸出向量使用下標j表示第j個隱層輸出,而輸出層使用下標k表示第k個輸出,還有就是這都是向量不是矩陣,只有一列為向量。

我們再看看權值,這些權值組成的是矩陣,為什麼是矩陣呢?先看看輸入層到隱層的權值矩陣V,其中他是nxm的即n行m列,其中列向量V_j為隱層第j個神經元對應的權向量,說明v矩陣的列向量對應著隱層的神經元,那麼對應的行向量就是代表所有輸入向量對隱層的權值,因為隱層的每個神經元的輸入是所有的輸入向量,這裡大家特別注意,隱層權值是矩陣而不是向量,如上圖。同理隱層到輸出層的權值也矩陣,同時大家要多留意下標代表的意義,下面開始看看他們的數學關係:

對於輸出層,有:

                           o_k = f(net_k)                     k = 1,2,3,4,,,,,,l(不是i,是L的小寫)                                   \left ( 1 \right )

                           net_k = \sum_{j=0}^{m}w_{jk}y_j              k = 1,2,3,4,,,,,,l                                                                    \left ( 2 \right )

 對於隱層,有:

                            y_j = f(net_j)                      j = 1,2,3,...,m                                                                         \left ( 3 \right )

                          net_j = \sum_{i=0}^{n}v_{ij}x_i                 j = 1,2,3,...,m                                                                          \left ( 4 \right )

上面兩式的轉移函式f(x)都是單極性Sigmoid函式:

                               f(x) = \frac{1}{1+e^{-x}}                                                                                                                    \left ( 5 \right )                   f(x)具有連續可導的特點,且具有:

                              f'(x) = f(x)[1-f(x)]                                                                                                        \left ( 6 \right )

這裡也要多注意替換思路和下標,理解下標的意義 ,搞明白思路,下面就介紹誤差到底是怎麼反向傳播的。

BP學習演算法:

在推倒公式前,我先使用語言簡單的描述一下BP的工作過程,這樣再看推倒也不至於太突兀,心裡有個思路會清晰很多。

       BP演算法的基本思想是,學習過程由訊號的正向傳播與誤差反向傳播兩個過程組成。正向傳播時,輸入樣本從輸入層傳入,經過各隱層逐層處理後,傳向輸出層。若輸出層的實際輸出與期望輸出不符,則轉入誤差的反向傳播階段。誤差反向傳播是將輸出誤差以某種形式通過隱層向輸入層逐層反傳,並將誤差分攤給各層的所有單元,從而獲得各層的誤差訊號,此誤差訊號即作為修正單元權值的依據。這種訊號正向傳播與誤差反向傳播的各層權值調整過程周而復始的進行,權值不斷調整的過程,也就是網路學習訓練的過程,此過程一直進行到網路輸出的誤差減少到可接受的程度,或進行到預先設定的學習次數為止。

         大家看了是不是有點暈暈的呢,還是不知道到底如何反向傳播的,別急,我們下面通過數學進行說明他到底是如何進行反向傳播的。

我麼知道誤差E的來源就是實際輸出和期望輸出的差值即:

                           E = \frac{1}{2}(d-O)^2 = \frac{1}{2}\sum_{k=1}^{l}(d_k-O_k)^2                                                                                    \left ( 7 \right )

根據\left ( 1 \right ),\left ( 2 \right )式將誤差E式展開到隱層為:

                           E = \frac{1}{2}\sum_{k=1}^{l}(d_k-O_k)^2 =\frac{1}{2}\sum_{k=1}^{l}(d_k - f(net_k))^2

                                                                     = \frac{1}{2}\sum_{k=1}^{l}[d_k-f(\sum_{j=0}^{m}w_{jk}y_j)]^2                                                      (8)

根據(3),(4)式將誤差E進一步展開至輸入層為:

                             E= \frac{1}{2}\sum_{k=1}^{l}\left \{ \right.d_k-f[\sum_{j=0}^{m}w_{jk}f(ne)]\left. \right \}^2

                                  = \frac{1}{2}\sum_{k=1}^{l}\left \{ \right.d_k-f[\sum_{j=0}^{m}w_{jk}f(\sum_{i=0}^{n}v_{ij}x_i)]\left. \right \}^2                                                                 (9)

到此我們把誤差的表示式都帶進去了,我們發現權值w和v都在其中,只要w和v取合適的值就可以使E達到最小,此時的公式即為代價函式或者損失誤差函式,那麼我們怎麼求最優值呢?如果大家機器學習學的比較深入,機會想到使用梯度下降法進行更新權值可以達到最優,那什麼是梯度呢?什麼又是梯度下降呢?為什麼梯度下降就是函式下降最快的方向呢?不懂的請看我的這篇文章,請務必深入理解我提的問題,這裡就不詳細講了,那篇文體我講的很透徹了,這裡就預設大家都深入理解了梯度下降的概念,我們更新權值只需按照梯度下降方向進行更新即可找到最優的權值。

    我們知道一點的梯度就是這裡的一階偏導,因此對w和v求偏導即可:

對輸出層的權值調整量:

                              \Delta w_{jk} = -\eta\frac{\partial E}{\partial w_{jk}}         j=0,1,2,....,m; k= 1,2,....,l                                              \left ( 11 \right )

對隱層的權值調整量:

                               \Delta v_{ij} = -\eta \frac{\partial E}{\partial v_{ij}}            i = 0,1,2,....,n;j=0,1,2,3,...,m                                       \left ( 12 \right )

負號表示梯度下降,\eta為學習係數,從這裡可以看出BP的學習規則是\delta型別的,不懂的請看我的深度學習第一篇文章,好,到這裡我們基本知道是通過什麼進行學習的,但是具體的更新過程還是不知道,我們下面的精力是推倒誤差對權值的偏導公式,等推倒 完以後大家也就知道,權值是如何更新的,同時也明白誤差反向傳播的原理是是什麼,下面開始:

推倒之前大家需要明確下標的意思:

輸入層向量元素是使用x_i進行表示的,下標是i,同時下標的取值範圍為:i = 0,1,2,3,...,n

隱藏層輸出向量元素使用y_j進行表示,下標是j,同時下標的取值範圍為:j = 1,2,3,...,m(注意,不從0開始,原因看圖)

輸入層到隱藏層的權值矩陣元素使用V_{ij}表示,下標ij代表是ij列的元素,因為是矩陣,所以列對應隱藏層的神經元個數,行代表輸入層的個數,所以i = 0,1,2,3,...,nj = 1,2,3,...,m

輸出層的輸出向量元素使用o_k表示,下標是k,同時下標的取值範圍為:k = 1,2,3,...,l

隱藏層到輸出層的權值矩陣元素使用w_{jk}進行表示,下標jk代表的是jk列的元素,因為是矩陣,所以列代表的是輸出層神經元的個數,行代表隱藏層的神經元的個數,所以j = 0,1,2,3,...,m,k = 1,2,3,...,l

請大家一定要搞明白字母和下標代表的含義,這是深入理解的前提,下面開始推倒公式:

對於輸出層,根據\left ( 11 \right )式可得:

                                   \Delta w_{jk} =-\eta\frac{\partial E}{\partial w_{jk}}= -\eta\frac{\partial E}{\partial net_k} \frac{\partial net_k}{\partial w_{jk}}                                                                           \left ( 13 \right )

對於隱層,根據(12)式可得:

                                   \Delta v_{ij} = -\eta \frac{\partial E}{\partial v_{ij}}= -\eta\frac{\partial E}{\partial net_j} \frac{\partial net_j}{\partial v_{ij}}                                                                               \left ( 14 \right )       

為了看起來方便,我們對輸出層和隱層各定義一個誤差訊號err

                                   err_k^o= -\frac{\partial E}{\partial net_k}                                                                                                                 \left ( 15 \right )

                                   err_j^y= -\frac{\partial E}{\partial net_j}                                                                                                                 \left ( 16 \right )

根據\left ( 2 \right )\left ( 13 \right )\left ( 15 \right )輸出層權值向量的調整可寫為:

                                   \Delta w_{jk} = \eta \cdot err^o_k\cdot y_j                                                                                                         \left ( 17 \right )

根據\left ( 4 \right )\left ( 14 \right )\left ( 16 \right )隱藏層權值向量的調整可寫為:                        

                                   \Delta w_{ij} = \eta \cdot err^y_j\cdot x_i                                                                                                         \left ( 18 \right )

通過  \left ( 17 \right )、 \left ( 18 \right )可以看到,我們只需要求出err就可以求出最後的權值調整量,下面就開始求解err:

對於輸出層,根據\left ( 1 \right )\left ( 15\right )使用鏈式求導規則:

                                   err_k^o= -\frac{\partial E}{\partial net_k} = -\frac{\partial E}{\partial o_k}\frac{\partial o_k}{\partial net_k} = -\frac{\partial E}{\partial o_k}f'(net_k)                                                   \left ( 19 \right )

對於隱藏層,根據\left ( 3 \right )\left ( 16 \right )使用鏈式求導規則:

                                   err_j^y= -\frac{\partial E}{\partial net_j} =- \frac{\partial E}{\partial y_j}\frac{\partial y_j}{\partial net_j} = - \frac{\partial E}{\partial y_j}f'(net_j)                                                     \left ( 20 \right )

下面就是求\left ( 19 \right )\left ( 20 \right )式中的偏導:

對於輸出層,此時根據\left ( 7 \right )可得:

                                  \frac{\partial E }{\partial o_k} = -(d_k-o_k)                                                                                                           \left ( 21 \right )

對於輸出層,此時根據(8)可得:

                                 \frac{\partial E}{\partial y_j}= -\sum_{k=1}^{l}(d_k-o_k)f'(net_j)w_{jk}                                                                               \left ( 22 \right )

將 \left ( 21 \right )\left ( 22 \right )分別代入 \left ( 19 \right )\left ( 20 \right ),同時根據  \left ( 6 \right )式的:                                                           

                                err_k^o= -\frac{\partial E}{\partial o_k}f'(net_k) = (d_k-o_k)o_k(1-o_k)                                                         \left ( 23 \right )

                                err_j^y= - \frac{\partial E}{\partial y_j}f'(net_j)=[\sum_{k=1}^{l}(d_k-o_k)f'(net_j)w_{jk}]f'(net_j)

                                          =(\sum_{k=1}^{l} err_k^o)y_j(1-y_j)                                                                                           \left ( 24 \right )

                                                                 

根據\left ( 23 \right )\left ( 24 \right )代入權值調整公式即\left ( 17 \right )\left ( 18 \right )

                                \Delta w_{jk} = \eta \cdot err^o_k\cdot y_j=\eta \cdot (d_k-o_k)\cdot o_k\cdot (1-o_k)\cdot y_j                                             \left ( 25 \right )

                                \Delta v_{ij} = \eta \cdot err^y_j\cdot x_i=\eta \cdot \sum_{k=1}^{l} err_k^o\cdot y_j\cdot (1-y_j)\cdot x_i                                                \left ( 26 \right )

我們就得到了三層感知器的權值調整表示式,從上式我們可以看到輸出層和隱藏層的權值調節過程,調節過程和三個因素有關即:學習率\eta,本層輸出的誤差訊號err以及本層的輸入訊號x或y,其中輸出層的誤差訊號與網路的期望輸出和實際輸出之差有關,直接反映了輸出誤差,而隱層的誤差訊號與前面各層的誤差訊號均有關,且是從輸出層反向傳過來的,大家詳細的看看\left ( 25 \right )\left ( 26 \right )兩式,會發現輸出層的權值調整是期望和真實訊號的差值,乘上學習率\eta和輸出層的輸入訊號(此時就是隱層的輸出訊號),對於隱藏層的權值調整不僅和當前隱層的輸出訊號有關,還和輸出層的誤差訊號有關,如果是多個隱層,那麼隱層的訊號都會和輸出層的誤差訊號err有關,也就是說是通過輸出層的誤差訊號err反向傳播到各層,對於多隱層的神經網路的誤差訊號傳播是不是這樣呢?我們在根據上面三層網路推倒到多隱層的網路。

            對於一般多層感知器,設有h個隱層,按照前行順序,各隱層的節點數分別為記為m_1,m_2,...,m_h,各隱層的輸出分別為計為y^1,y^2,...,y^h,各層權值矩陣分別記為w^1,w^2,...,w^h,w^{h+1},則各層的權值調整公式為:

輸出層:

                                \Delta w _{jk}^{h+1} = \eta \cdot err_k^{h+1}\cdot y_j^h = \eta \cdot (d_k-o_k)\cdot o_k\cdot (1-o_k)\cdot y_j^h                                 \left ( 27 \right )

                                j=0,1,2,...,m_h;          k = 0,1,2,3,...,l

第h隱層:

                                 \Delta w_{ij}^h =\eta \cdot err_j^h\cdot y_i^{h-1}= \eta \cdot (\sum_{k=1}^{l}\cdot err_k^o\cdot w_{jk}^{h+1})\cdot y_j^h\cdot (1-y_j^h)\cdot y_i^{h-1}                \left ( 28 \right )

                                   i = 0,1,2,3,...,m_{h-1};  j = 1,2,3,...,m_{h}

按照上面的規律,第一層的隱藏層的權值調整為:

                                  \Delta w _{pq}^1 = \eta \delta _q^1x_p = \eta (\sum_{r=1}^{m2}err_r^2w_{qr})y_q^1(1-y_q^1)x_p                                                             \left ( 29 \right )

                                   p = 0,1,2,3,...,n;         j = 1,2,3,...,m_1

此時大家應該好好理解一下上式的公式,深入理解他是怎麼反向傳播的,這個反向表現在哪裡?在這裡簡單的解釋一下,對於隱層,根據\left ( 28 \right )式,我們可以看到隱層的權值更新和輸出層的誤差和上一層的權值的乘積有關,這就是反向的來意,所有隱層的權值調整都和輸出層的誤差有關,也就是說所有權值的調整都來源與輸出層的期望值和真實值的差有關,這就是反向傳播的來歷,後面會使用圖來解釋這方面的內容,下面先把\left ( 27 \right )\left ( 28 \right )式使用向量進行表示一下:

對於輸出層;

Y = (y_0,y_1,y_2,...,y_j,...,y_m)^Terr^o = (err_1^o,err_2^o,...,err_k^o,...,err_l^o)則:

                                    \Delta w = \eta (err^oY^T)^T

對於隱層:

x = (x_0,x_1,x_2,...,x_i,...,x_m)^T,err^y = (err_1^y,err_2^y,....,err_j^y,...,err_m^y)^T則:

                                     \Delta V = \eta(err^yx^T)^T

到這裡公式就推倒結束了,下面詳細看看他到底如何反向傳播的,這裡給出誤差訊號流向圖進行解釋:

這裡只畫出了輸出層和第一層隱藏層,是完全按照公式 \left ( 27 \right ) 、\left ( 28 \right )來的,大家結合者這兩個公式好好理解一下,反向誤差的傳播也很清晰d-o一直反向調節權值,這就是反向的來源,請大家務必深入理解,有什麼疑問請留言,本節到此結束,下一節我們看看BP有哪些性質以及優缺點,如何改進等。