1. 程式人生 > >深度學習 --- BP演算法詳解(流程圖、BP主要功能、BP演算法的侷限性)

深度學習 --- BP演算法詳解(流程圖、BP主要功能、BP演算法的侷限性)

上一節我們詳細推倒了BP演算法的來龍去脈,請把原理一定要搞懂,不懂的請好好理解BP演算法詳解,我們下面就直接把上一節推匯出的權值調整公式拿過來,然後給出程式流程圖,該流程圖是嚴格按照上一節的權值更新過程寫出的,因此稱為標準的BP演算法,標準的BP演算法中,每輸入一個樣本,都要回傳誤差並調整權值,這種對每個樣本輪迴訓練權值的調整方法稱為單樣本訓練,下面先給出權值調整公式,然後給出流程圖:

程式流程圖

 對於一般多層感知器,設有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

在這裡在此提醒,不理解的請好好理解,搞明白公式的符號代表什麼意義,剛開始確實挺難的,但是一定要這樣訓練自己,到後面再去看比這裡更復雜的公式你才能看出門道,強化學習和自然語言處理的數學公式比這裡的複雜多了,所以請大家一定要培養自己閱讀數學公式的素養,數學能說明一切。廢話不多說,下面給出標準BP演算法的流程圖:

說明一下,因為是標準的BP流程圖,因此屬於單樣本訓練,假設總共有樣本個數為P,其中第i個樣本為p,訓練次數用q表示,訓練完成來源是設定的誤差閾值和實際誤差對比,達到要求時結束。具體過程就不細講了,如深入理解了更新過程,一看就會明白。

 上面是標準BP的演算法流程,權值調整方法是是基於單樣本訓練的,但是單樣本訓練遵循的是隻顧眼前的這個資料產生的誤差進行調節權值調整,這樣的後果是當訓練資料很多時,計算量就會急劇增加,導致收斂速度過慢。為了改變這些缺點,我們採用另外一種方法就是在所有樣本輸入以後,計算網路的總誤差E_{all}:

然後根據總誤差計算各層的誤差訊號並調整權值,這種累積的誤差的批處理方式稱為批(batch)訓練或者(epoch)訓練。由於批訓練遵循了以減小全域性誤差為目標的“集體主義”原則也就是所有的訓練樣本。在保證總誤差向減小方向變化時,即使訓練樣本很多,訓練時的收斂速度也是很快的,具體流程如如下:

 BP網路的能力:

(1)非線性的對映能力。

       該能力主要表現在複雜的權值上,而權值的變化就是BP的學習過程,因此可以儲存大量的輸入輸出模式對映關係   ,而無需給出給出具體的對映方程,現實中我們經常遇到這一類問題就是,有大量的輸入輸出的資料,去無法得到一個閉合的數學表示式來表達他們,此時BP神經網路就很有用處了,通過大量資料的訓練,最後會擬合出資料輸入輸出的非線性關係,這一類問題有共同的特點:1.無法得到解析解,2.缺乏專家經驗 3.能夠表示和轉化模式識別或非線性問題,對於這樣性質的問題,BP具有很大的優勢。

(2) 泛化能力         

       BP網路訓練過程(學習過程)就是權值調整過程 ,他從資料中提取非線性對映關係儲存在權值矩陣中,在其後的工作階段,當向網路輸入訓練時未曾見過的非樣本資料時,網路也能完成由輸入空間到輸出空間的正確對映,這種能力稱為多層感知器的泛化能力。

(3)容錯能力

        BP網路的魅力還在於,允許輸入樣本中帶有較大誤差甚至個別錯誤。因為輸入輸出是通過大量的權值進行決定的,反映正確規律的知識來自全樣本,個別樣本的誤差對整體影響不大,因此具有很好的容錯能力。

BP演算法的侷限性

       BP網路的誤差是各層權值和輸入樣本對的函式,因此我們可寫為如下表達式:

                                                              E = F(X^p,W,V,d^p)

      根據下式我麼可以看到,誤差函式可調整引數的個數n_w等於各權值數加上閾值數,即n_w = m\times (n+1)+l\times (m+1)

                                                              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 

         所以,誤差E是n_w+1維空間的一個形狀極為複雜的曲面,該曲面的每個點的高度對應一個誤差值,每個點的座標向量對應著n_w個權值,因此這裡的空間稱為誤差的權空間,如下圖所示:

以二維的權值向量為例,我們看看誤差權值的特點:

(1)存在平坦區

              從上圖我們可以看到,誤差曲面有些區域是比較平坦的,在這些區域中,誤差的梯度變化很小,即使權值調整很大,誤差任然下降很慢,造成這種情況的原因和各節點的淨輸入有關,

                                                        \frac{\partial E}{\partial x} = -err _k^oy_j

              根據上式,我們知道梯度小意味著err _k^o接近0,而err _k^o的表示式為:

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

               從上式可以看出,err _k^o接近0有三種可能情況:

                                      1. 輸出值o_k和期望值d_k很接近,也就是說此時,已經達到谷底了。

                                       2. 輸出值o_k始終接近0

                                       3. 輸出值o_k始終接近於1

我們知道後兩種情況誤差E可以是任意值,但梯度很小就是上圖的平坦區了。然而o_k接近0和1的原因在於Sigmoid轉移函式具有飽和性,我們來詳細看看Sigmoid函式:

                                                          \large f(x)=\frac{1}{1+e^{-x}}

  從上圖我們發現,當輸入|x|> 3時就趨近1或者0了,也就是飽和區。因此這就是平坦的原因,在平坦區即使 (d_k-o_k) 很大,但是由於誤差梯度小,訓練只能以緩慢的速度進行,只要調整方向正確,訓練時間足夠長,總會到達谷底的,然而這樣的做法效率低,下節我們將介紹如何提高訓練速度。

(2)存在多個極小點

在權值空間圖我們可以看到,存在平坦區,也存在谷底區,但是谷底並不是一個,而是多個,因此這些谷底就是區域性最優點,不是全域性最優的,如上圖w1a、w1b、w1c都是解,但前兩個是區域性最優解,第三個才是全域性最優解,因此梯度下降所有這樣的情況,區域性最優點當然不是我們想要的,因此怎麼解決呢?下一篇將詳細解決兩個問題,一是訓練緩慢,而是如何跳出區域性最優點。

(3)梯度消失問題

    梯度消失問題在神經網路層數相對較多的時會遇到,,梯度消失原因是鏈式求導,導致梯度逐層遞減,我們BP第一節推倒公式時就是通過鏈式求導把各層連線起來的,但是因為啟用函式是sigmod函式,取值在1和-1之間,因此每次求導都會比原來小,當層次較多時,就會導致求導結果也就是梯度接近於0。具體如下所示:

        上圖對應的神經網路的定義為y_i = sigmod(z_i),且z_i = w_ix_i+b_i  ,則表示式可為:

        又因為sigmod'(x) = x(1-x),因此最大值才為0.25,隨著網路的加深,,總體的值越小,因此會發生梯度消失問題,一般解決方法是需要從啟用函式或者網路層次著手,如啟用函式考慮ReLU函式代替sigmod函式。

與梯度消失相反的現象稱為梯度爆炸,即反向傳播中,每層都是大於1,導致最後累乘會很大,梯度爆炸容易解決,一般設定閾值就可以解決,但是梯度消失不好解決,在後面的神經網路就是在考慮如何解決梯度消失問題,因此會引出玻爾茲曼機和受限玻爾茲曼機,進而引入深度信念網路,緊接著就是CNN和RNN了,因此後面我們會詳細探討,好,本節到這裡結束,下一節我們說說改進的BP網路。