1. 程式人生 > >一起讀懂傳說中的經典:受限玻爾茲曼機

一起讀懂傳說中的經典:受限玻爾茲曼機

選自DL4J

機器之心編譯

參與:Nurhachu Null、思源

儘管效能沒有流行的生成模型好,但受限玻爾茲曼機還是很多讀者都希望瞭解的內容。這不僅是因為深度學習的復興很大程度上是以它為前鋒,同時它那種逐層訓練與重構的思想也非常有意思。本文介紹了什麼是受限玻爾茲曼機,以及它的基本原理,並以非常簡單的語言描述了它的訓練過程。雖然本文不能給出具體的實現,但這些基本概念還是很有意思的。

定義 & 結構

受限玻爾茲曼機(RBM,Restricted Boltzmann machine)由多倫多大學的 Geoff Hinton 等人提出,它是一種可以用於降維、分類、迴歸、協同過濾、特徵學習以及主題建模的演算法。更多關於如何部署諸如 RBM 這樣的神經網路的具體例子,請參閱 deeplearning4j 關於深度學習用例的內容。

本文將從受限玻爾茲曼機的關係和歷史重要性出發,首先討論什麼是 RBM。隨後,我們會使用圖表和淺顯的語言來描述它們的執行原理。

RBM 是兩層神經網路,這些淺層神經網路是 DBN(深度信念網路)的構建塊。RBM 的第一層被稱為可見層或者輸入層,它的第二層叫做隱藏層。

上圖中的每個圓圈代表一個類似於神經元的節點,這些節點通常是產生計算的地方。相鄰層之間是相連的,但是同層之間的節點是不相連的。

也就是說,不存在層內通訊,這就是 RBM 中的限制所在。每一個節點都是處理輸入資料的單元,每個節點通過隨機決定是否傳遞輸入。隨機意味著「隨機判斷」,這裡修改輸入的引數都是隨機初始化的。

每個輸入單元以資料集樣本中的低階特徵作為輸入。例如,對於一個由灰度圖組成的資料集,每個輸入節點都會接收影象中的一個畫素值。MNIST 資料集有 784 個畫素點,所以處理它們的神經網路必須有 784 個輸入節點。

現在讓我們跟隨單畫素穿過這兩層網路。在隱藏層的節點 1,x 和一個權重相乘,然後再加上一個偏置項。這兩個運算的結果可作為非線性啟用函式的輸入,在給定輸入 x 時啟用函式能給出這個節點的輸出,或者訊號通過它之後的強度。這裡其實和我們常見的神經網路是一樣的過程。

activation f((weight w * input x) + bias b ) = output a

接下來,讓我們看一下多個輸入單元是如何結合在一個隱藏節點的。每個 x 乘以一個獨立的權重,然後相加後再加一個偏置項,最後將結果傳遞到啟用函式來產生輸出。

因為所有可見(或輸入)節點的輸入都被傳遞到所有的隱藏節點了,所以 RBM 可以被定義為對稱二分圖(symmetrical bipartite graph)。

對稱意味著每個可見節點都與一個隱藏節點相連(如下所示)。二分則意味著它具有兩部分,或者兩層。圖是一個數學術語,指的是由節點和邊組成的網路。

在每一個隱藏節點,每個輸入 x 都與對應的權重 w 相乘。也就是說,一個輸入 x 會擁有 12 個權重(4 個輸入節點×3 個輸出節點)。兩層之間的權重總會形成一個矩陣,矩陣的行數等於輸入節點的個數,列數等於輸出節點的個數。

每個隱藏節點會接收 4 個與對應權重相乘的輸入。這些乘積的和再一次與偏置相加,並將結果饋送到啟用函式中以作為隱藏單元的輸出。

如果這兩層是更深網路的一部分,那麼第一個隱藏層的輸出會被傳遞到第二個隱藏層作為輸入,從這裡開始就可以有很多隱藏層,直到它們增加到最終的分類層。對於簡單的前饋網路,RBM 節點起著自編碼器的作用,除此之外,別無其它。

重建(Reconstruction)

但是在本文關於 RBM 的介紹中,我們會集中討論它們如何以一種無監督的方式通過自身來重建資料,這使得在不涉及更深層網路的情況下,可見層和第一個隱藏層之間會存在數次前向和反向傳播。

在重建階段,第一個隱藏層的啟用狀態變成了反向傳遞過程中的輸入。它們與每個連線邊相同的權重相乘,就像 x 在前向傳遞的過程中隨著權重調節一樣。這些乘積的和在每個可見節點處又與可見層的偏置項相加,這些運算的輸出就是一次重建,也就是對原始輸入的一個逼近。這可以通過下圖表達:

因為 RBM 的權重是隨機初始化的,所以,重建結果和原始輸入的差距通常會比較大。你可以將 r 和輸入值之間的差值看做重建誤差,然後這個誤差會沿著 RBM 的權重反向傳播,以一個迭代學習的過程不斷反向傳播,直到達到某個誤差最小值。

正如你所看到的,在前向傳遞過程中,給定權重的情況下 RBM 會使用輸入來預測節點的啟用值,或者輸出的概率 x:p(a|x; w)。

但是在反向傳播的過程中,當啟用值作為輸入並輸出原始資料的重建或者預測時,RBM 嘗試在給定啟用值 a 的情況下估計輸入 x 的概率,它具有與前向傳遞過程中相同的權重引數。這第二個階段可以被表達為 p(x|a; w)。

這兩個概率估計將共同得到關於輸入 x 和啟用值 a 的聯合概率分佈,或者 p(x, a)。重建與迴歸有所不同,也不同於分類。迴歸基於很多輸入來估計一個連續值,分類預測出離散的標籤以應用在給定的輸入樣本上,而重建是在預測原始輸入的概率分佈。

這種重建被稱之為生成學習,它必須跟由分類器執行的判別學習區分開來。判別學習將輸入對映到標籤上,有效地在資料點與樣本之間繪製條件概率。若假設 RBM 的輸入資料和重建結果是不同形狀的正態曲線,它們只有部分重疊。

為了衡量輸入資料的預測概率分佈和真實分佈之間的距離,RBM 使用 KL 散度來度量兩個分佈的相似性。KL 散度測量的是兩條曲線的非重疊區域或者說發散區域,RBM 的優化演算法嘗試最小化這些區域,所以當共享權重與第一個隱藏層的啟用值相乘時就可以得出原始輸入的近似。圖的左邊是一組輸入的概率分佈 p 及其重構分佈 q,圖的右側是它們的差的積分。

迭代地根據它們產生的誤差來調節權重,RBM 學會了逼近原始資料。你可以說權重在慢慢地反映輸入資料的結構,並通過隱藏層的啟用值進行編碼,學習過程就像兩個概率分佈在逐步重合。

概率分佈

讓我們來討論一下概率分佈。如果你在擲兩個骰子,所有結果的概率分佈如下:

也就是說,和為 7 的結果是最有可能出現的,因為相比於 2 到 12 等其它結果,有更多的拋擲組合可以得到 7 這個結果(3+4,1+6,2+5)。

或者舉另一個例子:語言是字母的特定概率分佈,因為每一種語言會使用一些字母較多,而另一些較少。在英語中,字母 e、t 以及 a 是最常見的,然而在冰島語中,最常見的字母是 a、t 和 n。因此嘗試使用基於英語的權重集合來重建冰島語將會導致較大的差異。

同樣,影象資料集擁有畫素值的唯一概率分佈,這取決於資料集中影象的種類。畫素值的分佈取決於資料集中的影象類別,例如 MNIST:

或者 Faces in the Wild 資料集中標記的頭像:

想象一下僅輸入狗和大象圖片的 RBM,它只有兩個輸出節點,每個結點對應一種動物。在前向傳遞的過程中 RBM 會問自己這樣的問題:在給定的這些畫素下,我應該向哪個節點發送更強的訊號呢,大象節點還是狗的節點?在反向傳遞的過程中 RBM 的問題是:給定一頭大象的時候,應該期望那種畫素分佈?

那就是聯合概率分佈:給定 a 時 x 的概率以及給定 x 時 a 的概率,可以根據 RBM 兩層之間的共享權重而確定。

從某種意義上而言,學習重建的過程就是學習在給定的影象集合下,哪些畫素會傾向於同時出現。由深層網路的隱藏層節點所產生的啟用狀態表現出來的共現現象:例如,「非線性灰色管+大的、鬆軟的耳朵+皺紋」可以作為一個分佈。

在上面的兩幅影象中,你看到了用 Deeplearning4j 實現的 RBM。這些重建代表著 RBM 的啟用值所「認為」輸入資料看起來的樣子,Geoff Hinton 將其稱為機器「做夢」。當被呈現在神經網路在訓練過程時,這種視覺化是非常有用的啟發,它讓人確信 RBM 確實在學習。如果不是,那麼它的超引數應該被調整。

最後一點:你會注意到 RBM 有兩個偏置項。這是有別於其它自動編碼器的一個方面。隱藏層的偏置項有助於 RBM 在前向傳遞中獲得非零啟用值,而可見層的偏置有助於 RBM 學習後向傳遞中的重建。

多層受限玻爾茲曼機

一旦 RBM 學到了與第一隱藏層啟用值有關的輸入資料的結構,那麼資料就會沿著網路向下傳遞一層。你的第一個隱藏層就成為了新的可見層或輸入層。這一層的啟用值會和第二個隱藏層的權重相乘,以產生另一組的啟用。

這種通過特徵分組建立啟用值集合序列,並對特徵組進行分組的過程是特徵層次結構的基礎,通過這個過程,神經網路學到了更復雜的、更抽象的資料表徵。

對於每一個新的隱藏層,權重都會通過迭代反覆調整,直至該層能夠逼近來自於前一層的輸入。這是貪婪的、逐層的、無監督的預訓練。它不需要使用標籤來改善網路的權重,這意味著我們可以在無標籤的資料集上進行訓練,而這些資料沒有經過人工處理,這是現實中絕大多數的資料。通常,擁有更多資料的演算法會產生更準確的結果,這也是深層學習演算法崛起的原因之一。

因為這些權重早已接近資料的特徵,所以在使用深度信念網路進行影象分類的時候,後續的監督學習階段可以更簡單地學習。儘管 RBM 有很多用途,但合適的權重初始化以方便以後的分類是其主要優點之一。從某種程度而言,它們完成了某種類似於反向傳播的功能:它們很好地調整了權重,以對資料進行更好的建模。你可以說預訓練和反向傳播是達到相同目的的可替代方法。

為了在一個圖中展示受限玻爾茲曼機,我們需要使用對稱二分雙向圖表示:

對於那些對深入研究 RBM 結構感興趣的人而言,它們是一種無向圖模型,也被稱作馬爾科夫隨機場。

程式碼例項:Stacked RBMS

GitHub 連結:

https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/unsupervised/deepbelief/DeepAutoEncoderExample.java

引數 & K

變數 k 是執行對比散度(Contrastive Divergence)的次數。對比散度是用來計算梯度(該斜率表示網路權重與其誤差之間的關係)的方法,沒有這種方法,學習就無法進行。

在上面的例子中,你可以看到如何將 RBM 建立為具有更通用多層配置的層。在每個點處,你會發現一個可以影響深度神經網路結構和效能的額外引數。大多數這些引數都是在這裡定義的。

引數初始化(weightInit 或者 weightInitialization)表示放大或者抑制到達每個節點的輸入訊號的係數的初始值。合適的權重初始化可以節省大量的訓練時間,因為訓練一個網路只不過是調整係數來傳遞最佳訊號,從而使網路能夠準確分類。

啟用函式(activationFunction)是一組函式中的一個,用於確定每個節點處的啟用閾值,高於閾值的訊號可以通過,低於閾值的訊號就被阻止。如果一個節點傳遞了一個訊號,則它被「啟用」。

優化演算法(optimizationAlgo)指神經網路最小化誤差或者找到最小誤差軌跡的方式,它是一步一步調整引數的。LBFGS 是一種優化演算法,它利用二階導數來計算梯度的斜率,係數將沿著梯度的斜率進行調整。

正則化(regularization)方法(如 L2)有助於防止神經網路中的過擬合。正則化本質上會懲罰較大的係數,因為大系數意味著網路已經學會將結果鎖定在幾個高權值的輸入上了。過強的權重會使網路模型在面對新資料的時候難以泛化。

顯元/隱元(VisibleUnit/HiddenUnit)指神經網路的層。顯元或者可見層,是輸入到達的層,隱元或者隱藏層,是輸入被結合成更復雜特徵的層。這兩種單元都有各自所謂的變換,在這裡,可見層是高斯變換,隱藏層是整流線性單元,它們將來自它們對應層的訊號對映到新的空間。

損失函式(lossFunction)是測量誤差的方法,或者測量網路預測和測試集包含的正確的標籤之間差距的方法。我們在這裡使用的是 SQUARED_ERROR,它使所有的誤差都是正值,因此可以被求和並反向傳播。

學習率(learningRate,如 momentum)會影響神經網路在每次迭代中校正誤差時調整係數的程度。這兩個引數有助於確定網路將梯度降低到區域性最優時的步長。較大的學習率會使網路學習得更快,並且可能越過最佳值。較小的學習率可能減慢學習,而且可能是低效的。

連續 RBM

連續 RBM 是受限玻爾茲曼機的一種形式,它通過不同型別的對比散度取樣接受連續的輸入(也就是比整數切割得更細的數字)。這允許 CRBM 處理影象畫素或字數向量這類被歸一化到 0 到 1 之間的小數的向量。

應該注意,深度學習網路的每一層都需要四個元素:輸入、係數、偏置項以及變換(啟用演算法)。

輸入是數值資料,是一個來自於前面層(或者原始資料)的向量。係數是通過每個節點層的特徵的權重。偏置項確保部分節點無論如何都能夠被啟用。變換是一種額外的演算法,它在資料通過每一層以後以一種使梯度(梯度是網路必須學習的)更容易被計算的方式壓縮資料。

這些額外演算法和它們的組合可以逐層變化。

一種有效的連續 RBM 在可見(或者輸入)層上使用高斯變換,在隱藏層上使用整流線性單元(ReLU)變換。這在面部重建中特別有用。對於處理二進位制資料的 RBM 而言,只需要進行二進位制轉換即可。

高斯變換在 RBM 的隱藏層上的表現不好。相反,使用 ReLU 變換能夠表示比二進位制變換更多的特徵,我們在深度置信網路中使用了它。

總結 & 下一步工作

你可以將 RBM 的輸出解釋為百分比。每次重建的數字不為零,這是 RBM 學習輸入的良好指示。

應當指出的是,RBM 並不能生成所有的淺層前饋網路中最穩定、最一致的結果。在很多情況下,密集層自編碼器效能較好。事實上,業界正在轉向變分自編碼器和 GAN 等工具。

下一步,我們將會展示如何實現深度置信網路(https://deeplearning4j.org/deepbeliefnetwork.html),它由許多受限玻爾茲曼機堆疊而成。

原文連結:https://deeplearning4j.org/restrictedboltzmannmachine.html#params

本文為機器之心編譯,轉載請聯絡本公眾號獲得授權

✄------------------------------------------------

加入機器之心(全職記者/實習生):[email protected]

投稿或尋求報道:content@jiqizhixin.com

廣告&商務合作:[email protected]

相關推薦

一起傳說經典受限

選自DL4J機器之心編譯參與:Nurhachu Null、思源儘管效能沒有流行的生成模型好,但受限玻爾茲曼機還是很多讀者都希望瞭解的內容。這不僅是因為深度學習的復興很大程度上是以它為前鋒,同時它那種逐層訓練與重構的思想也非常有意思。本文介紹了什麼是受限玻爾茲曼機,以及它的基本原理,並以非常簡單的語言描述了它的

深度學習方法受限RBM(三)模型求解,Gibbs sampling

歡迎轉載,轉載請註明:本文出自Bin的專欄blog.csdn.net/xbinworld。  技術交流QQ群:433250724,歡迎對演算法、技術、應用感興趣的同學加入。 接下來重點講一下RBM模型求解方法,其實用的依然是梯度優化方法,但是求解需要用

達觀資料於敬深度學習來一波,受限原理及在推薦系統的應用

深度學習相關技術近年來在工程界可謂是風生水起,在自然語言處理、影象和視訊識別等領域得到極其廣泛的應用,並且在效果上更是碾壓傳統的機器學習。一方面相對傳統的機器學習,深度學習使用更多的資料可以進行更好的擴充套件,並且具有非常優異的自動提取抽象特徵的能力。 另外得益於GPU、SSD儲存、大

受限基礎教程

unit 單個 單元 閾值 導致 相關數 負責 權重 自動編碼器 定義與結構 受限玻爾茲曼機(RBM)由Geoff Hinton發明,是一種用於降維、分類、回歸、協同過濾、特征學習和主題建模的算法。(如需通過實例了解RBM等神經網絡的應用方法,請參閱應用案例)。

受限(RBM)原理總結

guid filter font list cuc spa 得到 aci dcb https://blog.csdn.net/l7H9JA4/article/details/81463954 授權轉發自:劉建平《受限玻爾茲曼機(RBM)原理總結》 地址:http://w

七.RBM受限

1、受限玻爾茲曼機    玻爾茲曼機是一大類的神經網路模型,但是在實際應用中使用最多的則是受限玻爾茲曼機(RBM)。   受限玻爾茲曼機(RBM)是一個隨機神經網路(即當網路的神經元節點被啟用時會有隨機行為,隨機取值)。它包含一層可視層和一層隱藏層。在同一層的神經元之間是相互獨立的,而

深度學習 --- 受限(馬科夫過程、馬科夫鏈)

        上一節我們詳細的探討了玻爾茲曼機,玻爾茲曼機的發明是為了解決Hopfield神經網路的偽吸引子的問題,因此把退火演算法、玻爾茲曼分佈和Hopfield神經網路結合在一起形成了玻爾茲曼機(隨機神經網路)。通過前面幾節我們知道玻爾茲曼機可以很好

RBM(受限)和深層信念網絡(Deep Brief Network)

例如 sha 目標 監督學習 怎麽 繼續 定義 再次 rbm 目錄: 一、RBM 二、Deep Brief Network 三、Deep Autoencoder 一、RBM 1、定義【無監督學習】 RBM記住三個要訣:1)

RBM(受限)和深層信念網路(Deep Brief Network)

 目錄: 一、RBM 二、Deep Brief Network 三、Deep Autoencoder   一、RBM 1、定義【無監督學習】 RBM記住三個要訣:1)兩層結構圖,可視層和隱藏層;【沒輸出層】2)層內無連線,層間全連線;3)二值狀態值,

受限(RBM)原理分析以及在Tensorflow的實現

簡介 受限玻爾茲曼機是一種無監督,重構原始資料的一個簡單的神經網路。  受限玻爾茲曼機先把輸入轉為可以表示它們的一系列輸出;這些輸出可以反向重構這些輸入。通過前向和後向訓練,訓練好的網路能夠提取出輸入中最重要的特徵。 為什麼RBM很重要? 因為它能夠自動地從輸入中提

RBM--- (Restricted Boltzmann Machine,簡稱RBM : 受限 )

當讀論文Explaining and  Harnessing Adversarial Examples的時候,發現裡面有一個概念 pre-training 不懂,就立刻查詢一下,不巧的是,在解釋pre-training的時候,遇到了RBM,又不懂(他大爺,學點知識怎麼就那麼難

受限準備知識——MCMC方法和Gibbs取樣

先點明幾個名詞MCMC方法:馬爾可夫鏈-蒙特卡洛方法  (千萬別叫成梅特羅波利斯蒙特卡羅方法了)Metropolis-Hastings取樣:梅特羅波利斯-哈斯廷斯取樣Gibbs取樣:吉布斯取樣還是介紹一下學習MCMC和Gibbs取樣比較好的一個資料:隨機取樣方法與整理和受限玻

RBM(受限)原理及程式碼

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

深度置信網路(DBN)和受限(RBM)

原部落格於http://blog.163.com/silence_ellen/blog/static/176104222201431710264087/ 本篇非常簡要地介紹了深度信念網路的基本概念。文章先簡要介紹了深度信念網路(包括其應用例項)。接著分別講述了:(1)

受限RBM最通俗易懂的教程

本人來到CSDN已經有一段時間了,寫文章也寫了好幾篇了,本人最喜歡的風格就是用白話講解一些通俗易懂的東西,在之前,我講了不少東西,也不知道大家懂沒懂,但沒關係,你們愛懂不懂,哈哈哈哈哈哈哈哈哈哈。 但這次,我要講的東西我覺得你們都能懂,不懂我認作你爹,哈哈哈哈哈哈哈哈哈哈哈

受限——簡單證明

花了很久看了一下玻爾茲曼機,感覺水有點深,總之一步一步來嘛~~~~ 先說一下一個非常好的參考資料: 受限玻爾茲曼機(RBM)學習筆記 ,有興趣的可以再看看這篇文章的參考文獻或者部落格,寫的也非常好,本文就是基於這篇文章的理解,簡單證明一下RBM 接下來開證,不對之處歡迎指正

乾貨 | 受限基礎教程

定義與結構受限玻爾茲曼機(RBM)由Geoff Hinton發明,是一種用於降維、分類、迴歸、協

Deep Learning 系列(1)RBM(受限)和 DBN(深信度神經網路)

前言:Deep Learning (DL深度學習)是近幾年來最火的一種機器學習方法,由Hinton(多倫多大學)提出。主要有兩分支:Geoffery Hinton和Joshua Bengio這一支用RBM組成deep architecture的研究。另一支是以Yann

推薦 一文R的探索性資料分析(附R程式碼)

作者:Pablo Casas;翻譯:蔣雨暢;校對:車前子;本文約1500字,建議閱讀7分鐘。本文

一步步教你NETIL(圖文詳解)

接觸NET也有1年左右的時間了,NET的內部實現對我產生了很大的吸引力。個人覺得:能對這些底部的實現進行了解和熟練的話,對以後自己寫程式碼是有很大幫助的,好了,廢話不多說,請看下邊: .NET CLR 和 Java VM 都是堆疊式虛擬機器器(Stack-Based VM),