1. 程式人生 > >Deep learning:十九(RBM簡單理解)

Deep learning:十九(RBM簡單理解)

 這篇部落格主要用來簡單介紹下RBM網路,因為deep learning中的一個重要網路結構DBN就可以由RBM網路疊加而成,所以對RBM的理解有利於我們對DBN演算法以及deep learning演算法的進一步理解。Deep learning是從06年開始火得,得益於大牛Hinton的文章,不過這位大牛的文章比較晦澀難懂,公式太多,對於我這種菜鳥級別來說讀懂它的paper壓力太大。縱觀大部分介紹RBM的paper,都會提到能量函式。因此有必要先了解下能量函式的概念。參考網頁http://202.197.191.225:8080/30/text/chapter06/6_2t24.htm關於能量函式的介紹:

  一個事物有相應的穩態,如在一個碗內的小球會停留在碗底,即使受到擾動偏離了碗底,在擾動消失後,它會回到碗底。學過物理的人都知道,穩態是它勢能最低的狀態。因此穩態對應與某一種能量的最低狀態。將這種概念引用到Hopfield網路中去,Hopfield構造了一種能量函式的定義。這是他所作的一大貢獻。引進能量函式概念可以進一步加深對這一類動力系統性質的認識,可以把求穩態變成一個求極值與優化的問題,從而為Hopfield網路找到一個解優化問題的應用。

  下面來看看RBM網路,其結構圖如下所示:

   

  可以看到RBM網路共有2層,其中第一層稱為可視層,一般來說是輸入層,另一層是隱含層,也就是我們一般指的特徵提取層。在一般的文章中,都把這2層的節點看做是二值的,也就是隻能取0或1,當然了,RBM中節點是可以取實數值的,這裡取二值只是為了更好的解釋各種公式而已。在前面一系列的博文中可以知道,我們設計一個網路結構後,接下來就應該想方設法來求解網路中的引數值。而這又一般是通過最小化損失函式值來解得的,比如在autoencoder中是通過重構值和輸入值之間的誤差作為損失函式(當然了,一般都會對引數進行規制化的);在logistic迴歸中損失函式是與輸出值和樣本標註值的差有關。那麼在RBM網路中,我們的損失函式的表示式是什麼呢,損失函式的偏導函式又該怎麼求呢?

  在瞭解這個問題之前,我們還是先從能量函數出發。針對RBM模型而言,輸入v向量和隱含層輸出向量h之間的能量函式值為:

   

  而這2者之間的聯合概率為:

   

  其中Z是歸一化因子,其值為:

   

  這裡為了習慣,把輸入v改成函式的自變數x,則關於x的概率分佈函式為:

   

  令一箇中間變數F(x)為:

   

  則x的概率分佈可以重新寫為:

   

  這時候它的偏導函式取負後為:

   

  從上面能量函式的抽象介紹中可以看出,如果要使系統(這裡即指RBM網路)達到穩定,則應該是系統的能量值最小,由上面的公式可知,要使能量E最小,應該使F(x)最小,也就是要使P(x)最大。因此此時的損失函式可以看做是-P(x),且求導時需要是加上負號的。

  另外在圖RBM中,可以很容易得到下面的概率值公式:

   

  此時的F(v)為(也就是F(x)):

  

  這個函式也被稱做是自由能量函式。另外經過一些列的理論推導,可以求出損失函式的偏導函式公式為:

   

  很明顯,我們這裡是吧-P(v)當成了損失函數了。另外,估計大家在看RBM相關文章時,一定會介紹Gibbs取樣的知識,關於Gibbs內容可以簡單參考上一篇博文:Deep learning:十八(關於隨機取樣)。那麼為什麼要用隨機採用來得到資料呢,我們不是都有訓練樣本資料了麼?其實這個問題我也一直沒弄明白。在看過一些簡單的RBM程式碼後,暫時只能這麼理解:在上面文章最後的求偏導公式裡,是兩個數的減法,按照一般paper上所講,這個被減數等於輸入樣本資料的自由能量函式期望值,而減數是模型產生樣本資料的自由能量函式期望值。而這個模型樣本資料就是利用Gibbs取樣獲得的,大概就是用原始的資料v輸入到網路,計算輸出h(1),然後又反推v(1),繼續計算h(2),…,當最後反推出的v(k)和k比較接近時停止,這個時候的v(k)就是模型資料樣本了。

  也可以參考博文淺談Deep Learning的基本思想和方法來理解:假設有一個二部圖,每一層的節點之間沒有連結,一層是可視層,即輸入資料層(v),一層是隱藏層(h),如果假設所有的節點都是二值變數節點(只能取0或者1值),同時假設全概率分佈p(v, h)滿足Boltzmann 分佈,我們稱這個模型是Restrict  Boltzmann Machine (RBM)。下面我們來看看為什麼它是Deep Learning方法。首先,這個模型因為是二部圖,所以在已知v的情況下,所有的隱藏節點之間是條件獨立的,即p(h|v) =p(h1|v).....p(hn|v)。同理,在已知隱藏層h的情況下,所有的可視節點都是條件獨立的,同時又由於所有的v和h滿足Boltzmann 分佈,因此,當輸入v的時候,通過p(h|v) 可以得到隱藏層h,而得到隱藏層h之後,通過p(v|h) 又能得到可視層,通過調整引數,我們就是要使得從隱藏層得到的可視層v1與原來的可視層v如果一樣,那麼得到的隱藏層就是可視層另外一種表達,因此隱藏層可以作為可視層輸入資料的特徵,所以它就是一種Deep Learning方法。

  參考資料: