1. 程式人生 > >乾貨 | 受限玻爾茲曼機基礎教程

乾貨 | 受限玻爾茲曼機基礎教程

定義與結構

受限玻爾茲曼機(RBM)由Geoff Hinton發明,是一種用於降維、分類、迴歸、協同過濾、特徵學習和主題建模的演算法。

下載pdf,請後臺回覆關鍵詞:

20180328

目錄:

1. 定義與結構

2. 重構

3. 概率分佈

4. 多層結構

5. 引數與變數k

6. 連續受限玻爾茲曼機

7. 學習資源

我們首先介紹受限玻爾茲曼機這類神經網路,因為它相對簡單且具有重要的歷史意義。下文將以示意圖和通俗的語言解釋其運作原理。

RBM是有兩個層的淺層神經網路,它是組成深度置信網路的基礎部件。RBM的第一個層稱為可見層,又稱輸入層,而第二個層是隱藏層。

0

上圖中每個圓圈都是一個與神經元相似的單元,稱為節點,運算在節點中進行。一個層中的節點與另一層中的所有節點分別連線,但與同一層中的其他節點並不相連。也就是說,層的內部不存在通訊-這就是受限玻爾茲曼機被稱為受限的原因。每個節點對輸入進行處理和運算,判定是否繼續傳輸輸入的資料,而這種判定一開始是隨機的。(“隨機”(stochastic)一詞在此處指與輸入相乘的初始係數是隨機生成的。)

每個可見節點負責處理網路需要學習的資料集中一個專案的一種低層次特徵。舉例來說,如果處理的是一個灰度影象的資料集,則每個可見節點將接收一張影象中每個畫素的畫素值。(MNIST影象有784個畫素,所以處理這類影象的神經網路的一個可見層必須有784個輸入節點。)

接著來看單個畫素值x如何通過這一雙層網路。在隱藏層的節點1中x與一個權重相乘,再與所謂的偏差相加。這兩步運算的結果輸入啟用函式,得到節點的輸出,即輸入為x時通過節點的訊號強度。

啟用函式f((權重w * 輸入x) + 偏差b ) = 輸出a

0

下面來看一個隱藏節點如何整合多項輸入。每個x分別與各自的權重相乘,乘積之和再與偏差相加,其結果同樣經過啟用函式運算得到節點的輸出值。

0

由於每個可見節點的輸入都被傳遞至所有的隱藏節點,所以也可將RBM定義為一種對稱二分圖。

對稱指每個可見節點都與所有的隱藏節點相連線(見下圖)。二分指有兩個部分或層,而這裡的圖是指代節點網路的數學名詞。

在每個隱藏節點中,每一個輸入x都會與其相對應的權重w相乘。也就是說,每個輸入x會對應三個權重,因此總共有12個權重(4個輸入節點 x 3個隱藏節點)。兩層之間的權重始終都是一個行數等於輸入節點數、列數等於輸出節點數的矩陣。

每個隱藏節點會接收四個與對應權重相乘後的輸入值。這些乘積之和與一個偏差值相加(至少能強制讓一部分節點啟用),其結果再經過啟用運算得到每個隱藏節點的輸出a。

0

如果這兩個層屬於一個深度神經網路,那麼第一隱藏層的輸出會成為第二隱藏層的輸入,隨後再通過任意數量的隱藏層,直至到達最終的分類層。(簡單的前饋動作僅能讓RBM節點實現自動編碼器的功能。)

0

重構

但在本教程中,我們將重點關注受限玻爾茲曼機如何在無監督情況下學習重構資料(無監督指測試資料集沒有作為實際基準的標籤),在可見層和第一隱藏層之間進行多次正向和反向傳遞,而無需加大網路的深度。

在重構階段,第一隱藏層的啟用值成為反向傳遞中的輸入。這些輸入值與同樣的權重相乘,每兩個相連的節點之間各有一個權重,就像正向傳遞中輸入x的加權運算一樣。這些乘積的和再與每個可見層的偏差相加,所得結果就是重構值,亦即原始輸入的近似值。這一過程可以用下圖來表示:

0

由於RBM權重初始值是隨機決定的,重構值與原始輸入之間的差別通常很大。可以將r值與輸入值之差視為重構誤差,此誤差值隨後經由反向傳播來修正RBM的權重,如此不斷反覆,直至誤差達到最小。

由此可見,RBM在正向傳遞中使用輸入值來預測節點的啟用值,亦即輸入為加權的x時輸出的概率:p(a|x; w)。

但在反向傳遞時,啟用值成為輸入,而輸出的是對於原始資料的重構值,或者說猜測值。此時RBM則是在嘗試估計啟用值為a時輸入為x的概率,啟用值的加權係數與正向傳遞中的權重相同。 第二個階段可以表示為p(x|a; w)。

上述兩種預測值相結合,可以得到輸入 x 和啟用值 a 的聯合概率分佈,即p(x, a)。

重構與迴歸、分類運算不同。迴歸運算根據許多輸入值估測一個連續值,分類運算是猜測應當為一個特定的輸入樣例新增哪種具體的標籤。而重構則是在猜測原始輸入的概率分佈,亦即同時預測許多不同的點的值。這被稱為生成學習,必須和分類器所進行的判別學習區分開來,後者是將輸入值對映至標籤,用直線將資料點劃分為不同的組。

試想輸入資料和重構資料是形狀不同的常態曲線,兩者僅有部分重疊。RBM用Kullback Leibler散度來衡量預測的概率分佈與輸入值的基準分佈之間的距離。

KL散度衡量兩條曲線下方不重疊(即離散)的面積,而RBM的優化演算法會嘗試將這些離散部分的面積最小化,使共用權重在與第一隱藏層的啟用值相乘後,可以得到與原始輸入高度近似的結果。下圖左半邊是一組原始輸入的概率分佈曲線p,與之並列的是重構值的概率分佈曲線q;右半邊的圖則顯示了兩條曲線之間的差異。

0

RBM根據權重產生的誤差反覆調整權重,以此學習估計原始資料的近似值。可以說權重會慢慢開始反映出輸入的結構,而這種結構被編碼為第一個隱藏層的啟用值。整個學習過程看上去像是兩條概率分佈曲線在逐步重合。

0

概率分佈

下面我們來介紹概率分佈。如果擲兩枚骰子,則所有結果的概率分佈情況如下圖所示:

0

也就是說,7是最有可能出現的結果,因為擲出7的組合方式(3+4、1+6、2+5)要多於擲出2到12之間其他數字的方式。任何預測擲骰子結果的公式都需要考慮到數字7的出現頻率較高。

或另一個例子:語言中的字母也有特定的概率分佈,因為一種語言使用某些字母的頻率會高於其他語言。在英語中,字母e、t和a是最常見的,而冰島語中最常見的字母則是a、r和n。若用處理英語文字的權重來重構冰島語,結果就會出現較大的誤差。

與此類似,影象資料集的畫素值也有獨特的概率分佈,具體取決於資料集所包含影象的類別。資料集可能包括MNIST的手寫數字影象:

0

或是自然臉部檢測資料集(Labeled Faces in the Wild)中的頭像:

0

試想有這樣一個RBM,其輸入資料都是大象和狗的圖片,RBM僅有兩個輸出節點,分別對應一種動物。RBM在正向傳遞中要回答的問題是:在輸入這些畫素時,權重應當向哪個節點發送更強的訊號?大象的節點還是狗的節點?而RBM在反向傳遞中要回答的問題是:如果輸出是大象,則應當預期出現怎樣的畫素分佈?

這就是聯合概率:給定a時x的概率以及給定x時a的概率,用RBM兩層之間的一個共用權重來表示。學習重構資料的過程在某種意義上即是學習一組特定影象中有哪些畫素通常會同時出現。網路深處隱藏層節點產生的啟用值代表了明顯的同現關係,例如:“非直線灰色管 + 大而鬆垂的耳朵 + 皺紋”。

在上面的兩幅圖中,可以看到用Deeplearning4j實施的RBM所學會的重構。這些重構資料代表了原始資料在RBM啟用函式“想象”中的模樣。Geoff Hinton稱之為機器在“做夢”。在神經網路訓練過程中,這類影象是非常有用的示意性方法,可以讓人確信RBM的確是在學習。如果RBM沒有在學習,則應當調整它的超引數,下文將會介紹這一概念。

最後一點:你會發現RBM有兩個偏差值。這是RBM與其他自動編碼器的區別所在。隱藏的偏差值幫助RBM在正向傳遞中生成啟用值(因為偏差設定了下限,所以無論資料有多稀疏,至少有一部分節點會被啟用),而可見層的偏差則幫助RBM通過反向傳遞學習重構資料。

多層結構

RBM根據第一個隱藏層的啟用值學習了輸入資料的結構之後,資料即在網路中繼續向下傳遞一層。第一個隱藏層的作用現在相當於可見層。啟用值實際上相當於輸入,在第二個隱藏層的節點中與權重相乘,得到另一組啟用值。

將特徵分組,再將特徵組分組,由此連續生成多組啟用值的過程是特徵層次分析的基礎,神經網路用這種方法來學習更為複雜且抽象的資料表達形式。

每增加一個隱藏層,其權重都會反覆進行調整,直到該層能較為準確地模擬出來自前一層的輸入。這是無監督的逐層貪婪預訓練方法,不需要標籤就可以改進網路的權重,也就是說可以採用未標記、未經人工處理的資料來訓練,而現實中大部分的資料都屬於這一類別。一般的規律是,演算法接觸的資料越多,產生的結果越準確,這正是深度學習演算法十分厲害的原因之一。

權重能夠近似模擬出資料的特徵後,也就為下一步的學習奠定了良好基礎,比如可以在隨後的有監督學習階段使用深度置信網路來對影象進行分類。

RBM有許多用途,其中最強的功能之一就是對權重進行合理的初始化,為之後的學習和分類做好準備。從某種意義上來說,RBM的作用與反向傳播相似:讓權重能夠有效地模擬資料。可以認為預訓練和反向傳播是實現同一個目的的不同方法,二者可以相互替代。

下面這幅對稱二分二向圖綜合顯示了玻爾茲曼機的運作方式。

0

引數與變數k

變數 'k' 是對比散度演算法執行的次數。對比散度是用於計算梯度(代表網路權重與其誤差之間關係的斜率)的方法,也是網路進行學習的必要條件。

對比散度演算法每執行一次,就是一個組成受限玻爾茲曼機的馬爾可夫鏈的樣本。k的值通常為1。

在上文的示例中,可以看到如何用更為通用的MultiLayerConfiguration來建立多個RBM層。每個點後面都是一項調節深度神經網路結構和效能產生的額外引數。大多數引數的定義都可在本網站內找到。

weightInit或weightInitialization表示用於放大或削弱進入每個節點的輸入的係數的初始值。合理的初始權重可以節約大量訓練時間,因為網路訓練無非是通過調整係數來傳輸最佳的訊號,進而讓網路能進行準確的分類。

activationFunction指一組確定節點訊號傳輸閾值的函式,高於閾值則讓訊號通過節點,反之則阻攔訊號。如果節點讓訊號通過,則該節點被“啟用”。

optimizationAlgo指神經網路逐步調整係數,最小化誤差或求取最小誤差軌跡的方式。LBFGS是一種使用二階導數來計算係數調整所依據的梯度斜率的演算法,其名稱中的每個字母都代表一位發明人的姓。

l2等regularization方法幫助神經網路防止過度擬合。常態化實質上就是懲罰較大的係數,因為較大的係數表明網路在學習過程中將結果與個別權重較大的輸入聯絡起來。權重過大可能導致網路模型無法通用,難以適應新的資料。

VisibleUnit/HiddenUnit指一個神經網路的層。VisibleUnit是節點中接收輸入的層,而HiddenUnit則是對來自更復雜特徵的輸入進行重組的層。這兩種單元都有自己的變換演算法,可見層是高斯變換,而隱藏層則是修正線性變換,用於將這些層輸出的訊號對映至新的空間。

lossFunction用於衡量誤差,而誤差即是網路的猜測與測試資料集中包含的正確標籤之間的差異。這裡我們使用SQUARED_ERROR,可以將所有誤差變為正數,以便於進行求和及反向傳播運算。

learningRate與momentum相似,可以調節神經網路每次根據誤差修正係數時的調整幅度。這兩項引數幫助決定網路用梯度下降求取區域性最佳結果時每一步的幅度。學習速率較高會加快網路的學習速度,但有可能使結果超過最佳值。學習速率較低會減慢學習速度,導致效率低下。

連續受限玻爾茲曼機

連續受限玻爾茲曼機(CRBM)是一種藉由不同的對比散度取樣方式接收連續輸入(即比整數分得更細的數值)的RBM。所以CRBM能夠處理影象畫素或字數向量等標準化至零與一之間的小數。

應當注意的是,深度神經網路的每一層都必須有四個元素:輸入、一組係數、一個偏差以及變換機制(啟用演算法)。

輸入是數值資料、向量,來自前一個層(或原始資料)。係數是通過每個節點層的各類特徵所獲得的權重。偏差確保無論出現怎樣的情況,一個層內都會有一部分節點被啟用。變換機制是對通過每個層後的資料進行擠壓的附加演算法,它能讓梯度更容易計算(梯度是網路學習的必要條件)。

不同層可能採用不同的附加變換演算法及組合方式。有效的連續受限玻爾茲曼機對可見(輸入)層採用高斯變換,而對隱藏層使用修正線性單元變換。這在人臉重構方面特別有效。對於處理二進位制資料的RBM,兩種層都使用二進位制變換即可。

RBM隱藏層使用高斯變換的效果並不理想。而修正線性單元變換則能夠表示的特徵多於二進位制變換,我們將其用於深度置信網路。

學習資源

1. Geoff Hinton談玻爾茲曼機

http://www.scholarpedia.org/article/Boltzmann_machine

2. Deeplearning.net的受限玻爾茲曼機教程

http://deeplearning.net/tutorial/rbm.html

3. 受限玻爾茲曼機訓練實用指南;Geoff Hinton

https://www.cs.toronto.edu/~hinton/absps/guideTR.pdf

歡迎分享給他人讓更多的人受益

原文連結:

https://deeplearning4j.org/cn/restrictedboltzmannmachine

廣告、商業合作

請新增微信:guodongwe1991

(備註:商務合作)