這篇博客主要用來簡單介紹下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方法。
參考資料:
http://202.197.191.225:8080/30/text/chapter06/6_2t24.htm
http://deeplearning.net/tutorial/rbm.html
http://edchedch.wordpress.com/2011/07/18/introduction-to-restricted-boltzmann-machines/