1. 程式人生 > >RBM(受限玻爾茲曼機)原理及程式碼

RBM(受限玻爾茲曼機)原理及程式碼

EBMs 的隱藏神經元

在很多情況下, 我們看不到部分的隱藏單元 x , 或者我們要引入一些不可見的參量來增強模型的能力.所以我們考慮一些可見的神經元(依然表示為 x) 和 隱藏的部分 h. 我們可以這樣寫我們的表示式:

                                                 P(x) = \sum_h P(x,h) = \sum_h \frac{e^{-E(x,h)}}{Z}.                                                                                         (2)

在這種情況下,公式類似於 (1), 我們引入符號, 自由能量, 定義如下:

                                                      \mathcal{F}(x) = - \log \sum_h e^{-E(x,h)}

                                                                                                   (3)

也可以這麼寫,

&P(x) = \frac{e^{-\mathcal{F}(x)}}{Z} \text{ with } Z=\sum_x e^{-\mathcal{F}(x)}.

資料的負極大似然梯度表示為.

                                                                      - \frac{\partial  \log p(x)}{\partial \theta} &= \frac{\partial \mathcal{F}(x)}{\partial \theta} -       \sum_{\tilde{x}} p(\tilde{x}) \           \frac{\partial \mathcal{F}(\tilde{x})}{\partial \theta}.                                                           (4)

注意上面的梯度表示為兩個部分,涉及到正面的部分和負面的部分.正面和負面的不表示等式中每部分的符號,而是表示對模型中概率密度的影響. 第一部分增加訓練資料的概率 (通過降低相應的自由能量), 第二部分降低模型確定下降梯度通常是很困難的, 因為他涉及到計算E_P [ \frac{\partial \mathcal{F}(x)} {\partial \theta} ]

. 這無非在所有配置下x的期望 (符合由模型生成的概率分佈 P) !

第一步是計算估計固定數量的模型樣本的期望. 用來表示負面部分梯度的表示為負粒子, 表示為 \mathcal{N}. 梯度可以謝偉:

                                                                                     - \frac{\partial \log p(x)}{\partial \theta} &\approx  \frac{\partial \mathcal{F}(x)}{\partial \theta} -   \frac{1}{|\mathcal{N}|}\sum_{\tilde{x} \in \mathcal{N}} \   \frac{\partial \mathcal{F}(\tilde{x})}{\partial \theta}.                             (5)

我們想 根據 P取樣元素\tilde{x} of \mathcal{N}  (例如. 我們可以做 蒙特卡羅方法). 通過上面的公式, 我們幾乎可以使用隨機粒子演算法來學習EBM模型. 唯一缺少的就是如何提取這些負粒子T \mathcal{N}

. 統計學上有許多抽樣方法, 馬爾可夫鏈蒙特卡羅方法特別適合用於模型如受限玻爾茲曼機 (RBM), 一種特殊的 EBM.

受限玻爾茲曼機 (RBM)

玻爾茲曼機(BMS)是一種特殊的對數線性馬爾可夫隨機場(MRF)的形式,即,其能量函式在其自由引數的線性空間裡。使他們強大到足以代表複雜的分佈,我們考慮到一些變數是沒有觀察到(他們稱為隱藏)。通過更多的隱藏變數(也稱為隱藏的單位),我們可以增加的玻爾茲曼機的建模能力(BM)。受限玻爾茲曼機進一步限制BMS中那些可見-可見和隱藏-隱藏的連線。下面是一個RBM的圖形描述

_images/rbm.png

RBM能量方程 E(v,h) 定義為 :

   E(v,h) = - b'v - c'h - h'Wv                               (6)

W 表示隱藏單元和可見單元連線的權重, bc 是可見層和隱藏層的偏置.

轉化成下面的自由能量公式:

\mathcal{F}(v)= - b'v - \sum_i \log \sum_{h_i} e^{h_i (c_i + W_i v)}.

由於RBM的特殊結構, 可見和隱藏單元 是條件獨立的. 利用這個特性, 我們可以得出:

p(h|v) &= \prod_i p(h_i|v) \\p(v|h) &= \prod_j p(v_j|h).

二值化的RBMs 

在通常的情況下使用二值化單元 (v_jh_i \in\{0,1\}), 我們從公式. (6) and (2)得到, 概率版本的常用神經元啟用函式:

 P(h_i=1|v) = sigm(c_i + W_i v) \\                                       (7)

 P(v_j=1|h) = sigm(b_j + W'_j h)                                      (8)

二值RBM的自由能量可以更簡單的表示為:

 \mathcal{F}(v)= - b'v - \sum_i \log(1 + e^{(c_i + W_i v)}).                          (9)

二值RBM的引數更新方程

結合等式 (5) 和 (9), 我們得到下面的對數似然梯度方程:

                                - \frac{\partial{ \log p(v)}}{\partial W_{ij}} &=    E_v[p(h_i|v) \cdot v_j]    - v^{(i)}_j \cdot sigm(W_i \cdot v^{(i)} + c_i) \\-\frac{\partial{ \log p(v)}}{\partial c_i} &=    E_v[p(h_i|v)] - sigm(W_i \cdot v^{(i)})  \\-\frac{\partial{ \log p(v)}}{\partial b_j} &=    E_v[p(v_j|h)] - v^{(i)}_j                      (10)

RBM中的取樣

樣本 p(x) 可以通過執行Markov chain收斂得到,使用gibbs取樣作為轉移操作.

N隨機變數的Gibbs取樣的聯合概率S=(S_1, ... , S_N)可以通過一系列的取樣得到S_i \sim p(S_i | S_{-i}) ,其中S_{-i} 包含 N-1 個 S中其他的隨機引數但不包括S_i.

對於RBM,S包含一組可見或者不可見單元,由於他們是條件獨立的你可以執行塊Gibbs取樣。在這種背景下對可見單元同時取樣來得到隱藏單元的值. 同樣的可以對隱藏單元同時取樣,得到可見單元的值。 一步Markov chainA 由下面公式得到:

h^{(n+1)} &\sim sigm(W'v^{(n)} + c) \\v^{(n+1)} &\sim sigm(W h^{(n+1)} + b),

其中h^{(n)} 表示是指在Markov chain第n步h^{(n)} 的所有隱藏單元. 意思是, 例如, h^{(n+1)}_i 是根據概率sigm(W_i'v^{(n)} + c_i)隨機選擇為1(或者0), 相似的, v^{(n+1)}_j 是根據概率sigm(W_{.j} h^{(n+1)} + b_j)隨機選擇為1(或者0).

這可以用下圖說明

_images/markov_chain.png

當 t \rightarrow \infty, 樣本(v^{(t)}, h^{(t)}) 保證處於真實樣本下 p(v,h).

理論下,每個引數的獲取都必須執行這樣一個鏈知道收斂,不用說這樣做代價是十分昂貴的。因此,大家為RBM設計了不少演算法,為了在學習過程中得到在概率分佈p(v,h)下的有效樣本。

Contrastive Divergence(中文有時稱為對比散度)

(CD-k)

CD使用兩個技巧來加速取樣過程 :

  • 由於我們最終想要得到 p(v) \approx p_{train}(v) (真實的處於資料分佈的樣本), 我們把馬爾科夫鏈初始化為一個訓練樣本(即,我們要使一個分佈靠近p,那麼我們的鏈應該已經收斂到最後的分佈p)
  • CD不需要等待鏈收斂,樣本結果k步gibbs取樣得到,在實踐中,k=1工作的出奇的好。

Persistent CD

Persistent CD [Tieleman08] 使用另一種方法近似p(v,h)下的樣本,他依賴於一個擁有持續性的馬爾科夫鏈, (i.e.,不為每個可見樣本重新計算鏈 ). 對於每一個參量更新,我們簡單的執行k-步鏈生成新的樣本。 鏈的狀態需要儲存用來計算以後步驟的參量更新.

一般的直覺是,如果參量更新對於鏈的混合速率足夠小,馬爾科夫鏈應該可以察覺到模型的改變。

下面我們需要用程式碼來實現RBM(使用c語言)