1. 程式人生 > >深度學習 --- BP演算法詳解(BP演算法的優化)

深度學習 --- BP演算法詳解(BP演算法的優化)

上一節我們詳細分析了BP網路的權值調整空間的特點,深入分析了權值空間存在的兩個問題即平坦區和區域性最優值,也詳細探討了出現的原因,本節將根據上一節分析的原因進行改進BP演算法,本節先對BP存在的缺點進行全面的總結,然後給出解決方法和思路,好,下面正式開始本節的內容:

BP演算法可以完成非線性問題,因此具有很大的優勢,但是也存在很大的問題,下面我們就來總結一下:

             (1)易形成區域性極小值而得不到全域性最優

             (2)訓練次數多,使的學習效率降低,收斂速度慢

             (3)隱節點的選取缺乏理論指導

             (4) 訓練時學習新樣本有遺忘舊樣本的趨勢

針對上面的問題,現已有多種解決方法,下面就看看有哪些解決方法:

1.增加動量項

        標準的BP演算法在調整權值時,只按t時刻誤差的梯度方向調整,而沒有考慮t時刻以前的梯度方向,從而容易使訓練過程發生振盪,收斂緩慢,為了提高網路的訓練速度,可以在權值的調整公式增加一動量項,若用W代表某層權矩陣,x代表某層輸入向量,則包含動量項的權值調整向量表示式為:

                                \Delta w(t)=\eta\cdot err\cdot x + \alpha \cdot \Delta w(t-1)

從上式可以看出,增加動量項即從前一次權值調整中取出一部分疊加到本次權值調整量中,\alpha稱為動量係數,一般0< \alpha < 1。動量項代表的物理意義是反映了以前積累的經驗,對於t時刻起到阻尼作用(不懂阻尼請看維基解釋),當權值曲面出現驟然下降時,該動量項可減少振盪趨勢,提高訓練過程,目前BP演算法中都增加了動量項,以至於具有動量項的BP演算法稱為一種新的標準演算法。簡單來說其實就是利用物理的慣性原理,當引數更新時,需要保持之前的方向趨勢,因此可以看做慣性。

2.自適應調節學習率\eta

學習率\eta也稱步長,在標準BP演算法中設定為常數,然而在實際中,很難使用一個確定的值為最佳的學習率,如果可以動態調整學習率就很好了,從權值曲面我們希望在平坦區內\eta是增大的,因為太小會使得訓練次數增加,\eta增大會加速脫離平坦區。而在誤差變化很大的區域,\eta太大會容易跨過較窄的最低點,這個最低點可能是全域性最優點,同時會產生振盪,反而是迭代次數增加,因此為了加速收斂,一個較好的解決思路就是讓學習率\eta根據具體情況進行動態調整,這裡介紹一種實現方法:

在這裡需要給大家說明的是,自適應調節學習率的研究是一個領域,最初是從退火演算法到最優退火演算法進行探索的,最優退火演算法提供了線上學習,為線上學習邁開了重要的一步,但是退火方案的缺點是時間常量\eta_{switch}為先驗的,考慮到實際問題,不同的樣本先驗會發生改變,因此在1998年Murata首次提出了線上學習演算法需要裝備內在機制用於學習率的自適應控制,對學習演算法的學習進行了適當的修正,第一個修正就是統計特性發生變化的情況,第二個就是增加了線上學習演算法的泛化能力。因此解決了退火演算法的先驗問題。但是它是在考慮學習率引數的退火範圍內的次優的解為代價的,其重要的優點在於擴大了線上學習在實際執行方式的適用性。在這裡就不細講這些知識了,有興趣的朋友可以參考《神經網路與機器學習》這本書並結合相關的論文進行理解,在這裡就不細講了,在後面的文章中會詳細討論退火演算法,這裡給大家提一下並給出研究的總體思路。下面就簡單的講一下學習率的動態調整過程:

             設一初始學習率,若經過一批次權值調整後使總誤差E增大了,說明這次調整沒有效果,原因是學習率可能過大,發生振盪了,因此需要減小學習率:\eta (t+1) = \beta \eta (t)(\beta < 1);若經過一批次權值調整後使總誤差E減少了,說明調整是有效的,同時可以加快迭代速度即增加學習率:\eta (t+1) = \Theta \eta (t)(\Theta > 1),下面簡單的介紹幾種具體的調節學習速率的方法。

AdaGrad方法(Adaptive gradient 自適應梯度)

他為每個引數都設定了更新速率,先看錶達式:

                               \Delta w_t = -\frac{\eta }{\sqrt{\sum_{k=1}^{t}g_k^2 + \varepsilon }}g_t

    其中g_t表示當前時刻的梯度,\eta是預設的學習速率,\varepsilon為常數。同過上式不難理解,在同一時刻對於不同的引數,權值更新是不同的,隨著更新距離之和的增加,學習速率也越來越小,這也符合在模型訓練初期的,希望引數變化更多更快,而在模型訓練後期,希望引數變化的更慢且值更小。

Adadelta方法

Adadelta是對Adagrad的擴充套件,最初方案依然是對學習率進行自適應約束,但是進行了計算上的簡化。 Adagrad會累加之前所有的梯度平方,由上面公式可以看出,仍依賴於人工設定一個全域性學習率,η設定過大的話,會使regularizer過於敏感,對梯度的調節太大,中後期,分母上梯度平方的累加將會越來越大,使gradient→0,使得訓練提前結束,因此為了解決後期梯度很小的弊端,提出了Adadelta方法,而Adadelta只累加固定大小的項,並且也不直接儲存這些項,僅僅是近似計算對應的平均值。即:

                                    \Delta w_t = -\frac{\eta }{\sqrt{\lambda *\sum_{k=1}^{t-1}g_K^2+(1-\lambda )g_t^2 + \varepsilon }}*g_t

從上式來看,還是依賴全域性的學習速率,後面人們就繼續做了一定的處理,和近似牛頓迭代法後:

                                     E|g^2|_t = \lambda * E|g^2|_{t-1} + (1-\lambda )*g_t^2

這裡是使用的均值進行處理的,進而可以得到:

                                       \Delta w_t = -\frac{\sqrt{\sum_{\varphi = 1}^{t-1}\Delta w_\varphi }}{\sqrt{E|g^2|_t+\varepsilon }}

上面就沒有全域性的學習速率了,這裡不細講原理了,以後會單獨拿出來詳細的講。

RMSProp方法(梯度的均方根 root mean squared (RMS)

RMSprop可以算作Adadelta的一個特例:

\lambda=0.5時E|g^2|_t = \lambda * E|g^2|_{t-1} + (1-\lambda )*g_t^2就變為了求梯度平方和的平均數。 

如果再求根的話,就變成了RMS(均方根): 

                                           RMS|g|_t = \sqrt{E|g^2|_t+\varepsilon }

此時,這個RMS就可以作為學習率η的一個約束:

                                          \Delta w_t = -\frac{\eta }{RMS|g|_t}*g_t

其實RMSprop依然依賴於全域性學習率,RMSprop算是Adagrad的一種發展,和Adadelta的變體,效果趨於二者之間,並且適合處理非平穩目標,尤其對於RNN效果很好

Adam(Adaptive Moment Estimation)

Adam(Adaptive Moment Estimation)本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每個引數的學習率。Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定範圍,使得引數比較平穩。公式如下:

                                                                                    \Delta w_t = -\frac{\hat{m_t}}{\sqrt{\hat{n_t}}+\varepsilon }*\eta

其中,m_t,n_t分別是對梯度的一階矩估計和二階矩估計,可以看作對期望E|g_t|,E|g_t^2|的估計;\hat{m_t},\hat{n_t}是對m_t,n_t的校正,這樣可以近似為對期望的無偏估計。 
可以看出,直接對梯度的矩估計對記憶體沒有額外的要求,而且可以根據梯度進行動態調整,而\Delta w_t = -\frac{\hat{m_t}}{\sqrt{\hat{n_t}}+\varepsilon }*\eta對學習率形成一個動態約束,而且有明確的範圍。

梯度優化方面的就先到這裡,後面進入深度學習時,還會好好詳細的深入理解這幾個,當然這只是其中的幾個優化,還有很多,後面會單獨講。

3.引入抖度因子

從上節的分析中我們知道,導致平坦區有三種可能情況(不知道的請看這篇文章),後兩種是因為啟用函式的輸入進入到了啟用函式的飽和區,我們知道飽和區的,啟用函式的表示式如下:

                                               o_k = \frac{1}{1+e^{net_k}}

加入抖度因子後的表示式為:

                                                o_k = \frac{1}{1+e^{net_k/\lambda }}

\lambda的取值會影響啟用函式的飽和區間,請看圖:

從上節我們知道當\Delta E接近0時而d_k - o_k仍比較大,此時就進入平坦區了,這時我們令\lambda > 1;當退出平坦區後,再令\lambda =1,從上圖我們看到,隨著\lambda不斷增大,net_k座標被壓縮了 \lambda,,因此可以有效的增加飽和區的範圍,這種方法實際中提高BP收斂的速度十分有效。藍色是原始的啟用函式。

4.從梯度方面進行優化

          我們知道,誤差函式是根據梯度進行調節的,寫出等式可為如下:

                                    E_{err} (w(n)+\Delta w(n)) = E_{err}(w(n)) + g^T(n)\Delta w(n)

其中g^T(n)就是梯度了,其實上式就是平均誤差函式的泰勒公式展開,這樣大家就能理解了,至於梯度為什麼和泰勒公式有聯絡,請參考我的這篇文章(這篇文章主要是講梯度問題,最原始的請參考張賢達的矩陣那本書),我們前面的梯度都是基於上式進行更新的,但是我們只知道當前的梯度,無法預測下面的梯度情況,那麼如果我們可以知道下面的梯度的走勢就可以針對走勢進行調整梯度,使其儘快脫離平坦區,因此,現在是如何參看梯度的變化情況,其實很自然的能想到,對梯度求導就可以了,也就是對原始求二階導,因此可以通過泰勒公式展開保留二階導的式子,展開如下:

                          E_{err} (w(n)+\Delta w(n)) = E_{err}(w(n)) + g^T(n)\Delta w(n) + \frac{1}{2}\Delta w^T(n)H(n)\Delta w(n)

其中H(n )是海森矩陣了,什麼是海森矩陣呢?其實就是矩陣的二階求導,不懂的建議學一下張賢達的矩陣論。為了大家更明白,我把梯度和海森矩陣的表示式單獨寫出來:

    區域性梯度向量g(n),定義為:

                                             g(n)=\frac{\partial E(w)}{\partial w}\mid _{w=w(n)}

    區域性海森矩陣(Hessian)矩陣H(n),表示誤差效能曲面的“曲率”,定義為:

                                              H(n) = \frac{\partial^2 E(w)}{\partial w^2}\mid _{w = w(n)}

   現在我們再好好審視我們前面使用的梯度下降,權值更新如下:

                                              \Delta w(n) = -\eta g(n)x

在學習率和輸入向量不變的情況下,更新權值只依賴於誤差曲面的區域性資訊為唯一來源的梯度向量 g(n),這樣做有好處也有壞處,好處是實現簡單、壞處是收斂速度慢。特別在資料量很大的情況下,收斂想當面,計算量很大,為了更好的收斂,我們在權值更新中加入使用誤差曲面的二階資訊進行處理,因此從新定義權值的更新:

                                            \Delta w^*(n) = H^{-1}(n)g(n)       

其中H^{-1}(n)是Hessian矩陣 H(n)的逆,假設逆是存在的,其實上式就是牛頓法的核心表達了。上式的代價函式保留了二次項,雖然迭代一次就可以達到最優值,但是需要考慮幾個問題:

(1) 牛頓法要求計算Hessian矩陣的逆,這個計算量是很大的

(2)為了使H^{-1}(n)是可計算的,H(n)必須是非奇異矩陣,但是多層感知器誤差曲面的海森矩陣並不總是符合要求的,這使得計算量更加繁瑣

(3) 代價函式是非二階的時候,牛頓法收斂得不到保證。

為了解決上面的問題,我們可以使用擬牛頓法進行求解,擬牛頓法的的修正主要是不經過計算矩陣的逆得到逆矩陣H^{-1}(n)的正定估計,通過這樣的估計,擬牛頓法保證誤差曲面是下降的,但是計算量還是很大,因此擬牛頓法只適合小型規模的資料。

      為了繼續解決上面的問題,另一個方法就是共軛梯度方法,他被認為是介於梯度下降和牛頓法之間的方法,使用共軛梯度方法的動機是期望加速梯度下降法中特別緩慢的收斂速度,同時避免牛頓法要求海森矩陣的估計、儲存和求逆。

牛頓法和共軛梯度法,這裡不再深入講解了,有興趣的可以自行學習,以後用到了,我在深入的講解,本節到此結束,有疑問請留言。