1. 程式人生 > >DeepLearning(深度學習)原理與實現(一)

DeepLearning(深度學習)原理與實現(一)

       經過三年的狂刷理論,覺得是時候停下來做些有用的東西了,因此決定開博把他們寫下來,一是為了整理學過的理論,二是監督自己並和大家分享。先從DeepLearning談起吧,因為這個有一定的實用性(大家口頭傳的“和錢靠的很近”大笑),國內各個大牛也都談了不少,我儘量從其他方面解釋一下。

        DeepLearning算是多倫多大學Geoffery hinton教授第二春吧,第一春就是傳統神經網路,由於傳統的多層感知機很容易陷入區域性最小,直接用反向傳播演算法(Back Propagation)求取的分類效果並不如意,原因一是特徵是手工的,二就是區域性最小問題。而DeepLearning引入了概率圖模型裡的生成模型,他可以直接自動的從訓練集裡提取所需要的特徵,典型的模型為有限制玻爾茲曼機(Restricted Boltzmann Machines,簡稱RBM),自動提取的特徵解決了手工特徵考慮不周的因素,而且很好的初始化了神經網路權重,接著可以採用反向傳播演算法進行分類,實驗得出了很好的效果。 因此DeepLearning被喻為下一代神經網路。今天的話題就來討論下RBM:

       再說RBM之前,我們先提一下基於能量的模型(Engery based model),能量方法來源於熱動力學,分子在高溫中運動劇烈,能夠克服區域性約束(分子之間的一些物理約束,比如鍵值吸引力等),在逐步降到低溫時,分子最終會排列出有規律的結構,此時也是低能量狀態。受此啟發,早期的模擬退火演算法就是在高溫中試圖跳出區域性最小。隨機場作為物理模型之一,也引入了此方法。在馬爾科夫隨機場(MRF)中能量模型主要扮演著兩個作用:一、全域性解的度量(目標函式);二、能量最小時的解(各種變數對應的配置)為目標解,能否把最優解嵌入到能量函式中至關重要,決定著我們具體問題求解的好壞。統計模式識別主要工作之一就是捕獲變數之間的相關性,同樣能量模型也要捕獲變數之間的相關性,變數之間的相關程度決定了能量的高低。把變數的相關關係用圖表示出來,並引入概率測度方式就夠成了概率圖模型的能量模型,其實實際中也可以不用概率表示,比如立體匹配中直接用兩個畫素點的畫素差作為能量,所有畫素對之間的能量和最小時的配置即為目標解。RBM作為一種概率圖模型,引入概率就是為了方便取樣,因為在CD(contrastive divergence)演算法中取樣部分扮演著模擬求解梯度的角色。


先來看一下RBM模型定義(圖一)和能量的定義(公式一):

       圖一)      

              

(公式一)


        其中v表示實際樣本節點,以下叫可視節點,h表示隱藏節點資料,theta={W,b,a},W表示網路權重,b表示可視節點偏移,a表示隱藏節點偏移。這些引數是需要我們求解的,一般開始時我們隨機初始化這些引數,對於16*16的二值影象,可視節點有256個,每個節點可能的狀態有兩個(0,1);隱藏節點的數目由自己制定,每個節點的狀態也有兩個(0,1)。當每個節點都有一個指定的狀態時,此時的RBM有一個對應的能量。此時所有節點對應某個狀態的組合成為一個配置。窮舉所有配置對應的能量之和就構成了歸一化常量Z(配分函式-partition function)。每個配置能量除以常量Z即為當前配置的概率。在一般計算時,為了避免數值計算問題,我們常常引入極家族函式(對數函式和指數函式),那麼模型概率定義為(公式二):

   (公式二)

        由於RBM是一種生成模型(generative model),我們的目標使得概率p(x)最大時對應的引數theta,常規思路應該使用最大似然法,在求最大似然函式的極值時,我們需要用到梯度法,梯度推導如(圖二)所示(大家不要被公式嚇倒,CD演算法不用它,=、=,只是證明求梯度有點難度):

(圖二)

公式雖然這麼寫,但是實際中計算歸一化分割函式Z時不可取的,因為組合狀態是NP-complete的。但是這個公式給出了Contrastive divergence演算法的原型(公式三):
(公式三)
        alpha是學習率,括號中第一項是訓練資料集期望分佈,第二項是模型期望分佈,CD演算法的核心是計算(或逼近)出這兩項的數值,下面分別說出下面計算上式中兩個期望分佈,需要用到取樣方法(我先給出步驟,然後解釋,步驟是大家最關心的):

       第一項(資料相關期望項):利用可視節點v1乘上權重,然後用sigmoid函式計算出隱藏節點h每個節點的概率,通過此概率對隱藏節點取樣,得出隱藏節點狀態h1,然後用能量公式計算出所有節點的期望能量(<v1*h1>)作為第一項。

       第二項(模型期望項):根據第一項中隱藏節點h1乘上權重,然後用sigmoid函式計算出可視節點v2的概率,在此通過取樣得出v2 狀態,同樣用v2計算出h2的狀態,用能量公式計算出所有節點的期望能量(<v2*h2>)。套用上面公式,就可以求出deltaW,


      有了類梯度,那麼就可以做權重更新咯,迭代就行了,b,a類似求解。
      這是用CD演算法模擬梯度,關鍵在於使用什麼取樣方法,基於MCMC的各種取樣方法(如Gibbs,MH,拒絕取樣等)請酌情使用,深度理解取樣方法有助於我們理解為什麼CD可以模擬梯度,用hinton的話來說:這是個驚人的事實。我概括了這麼一句話來給我們一個直觀的理解:資料期望分佈是我們整個資料的分佈中心,可以看成最小點,模型期望是取樣出來的,具有一定的隨機性,分佈在中心點周圍,二者相減正好可以模擬梯度。其實求解引數theta的方法不止這一種,比如在Russlan的論文中也給出另外一種方法:用隨機逼近過程來估計模型期望,用變分方法來估計資料相關期望等。礙於作者水平有限,就不講了。 

     另外對DBN這個生成模型(generative model)對引數求導時,得出的結果也和CD公式相似,DBN的訓練方法也可以用類似方法訓練,具體可參考russlan的程式碼。

      DBM訓練方法其實就是層層通過對RBM分別訓練。對於russlan論文中提到的其他衍生應用和技巧大家可以根據自己所需詳細閱讀。比如估計分割函式(Z)是圖模型裡一個重要的基石部分;autoencoders的神奇作用其實是模擬了神經科學裡神經分散式描述,相當於找到了低維流形;深度網路的微調部分(fine-tune),其實通過上述方法做了無監督預訓練後,結合標籤部分用BP等方法做了權重微更新,值得一提的識別可以用生成模型(generative model),也可以是判別模型(discriminative model),針對具體應用大家可以試著採用不同方法。
     我想我要說的基本說完了,整個深度學習除了需要概率圖模型和神經網路基礎支撐外,也用到了大量的trick。
     哦,對了,hinton也說過,神經網路幾乎可以模擬現在絕大多數的機器學習方法,包括SVM,Adaboost,當然也包括概率圖模型的那一套(其中有結構化學習),這有點把圖模型收編的味道,作者視野有限,不敢不認同,也不敢認同。就講到這裡吧,作者寫的輕浮一些,公式都是從別人paper上扣下來的,
而且作者水平有限,可能有些會說錯,希望大家多多指正。

       最後附加一點:概率圖模型的能量和概率之間的關係可以參閱gibbs measureHammersley–Clifford theorem,他們倆在能量模型到概率之間的轉換上扮演著很重要的角色。還有為什麼最大化P(x)或者p(v)可以使得能量最小?這個問題一開始我沒搞明白,後來一個做事嚴謹網友(北流浪子)的花了好長時間找到答案,並且無私的與俺分享:對(圖二)中的公式(5.7)兩邊同時取對數得到:lnp(v)=-FreeEnergy(v)-lnZ,這樣當p(v)最大時,自由能FreeEnergy(v)最小,而自由能最小決定了系統達到統計平衡,詳細可以參考:Gibbs free energy

參考文獻:

         [1]  Learning Deep Generative models.Ruslan Salakhutdinov

         [2]  Learning Deep Architectures for AI.Yoshua Bengio

         [3] A Tutorial on Energy-Based Models. yann lecun