一起读懂传说中的经典:受限玻尔兹曼机
盡管性能沒有流行的生成模型好,但受限玻爾茲曼機還是很多讀者都希望了解的內(nèi)容。這不僅是因為深度學習的復興很大程度上是以它為前鋒,同時它那種逐層訓練與重構(gòu)的思想也非常有意思。本文介紹了什么是受限玻爾茲曼機,以及它的基本原理,并以非常簡單的語言描述了它的訓練過程。雖然本文不能給出具體的實現(xiàn),但這些基本概念還是很有意思的。
>>>>?
定義 & 結(jié)構(gòu)
受限玻爾茲曼機(RBM,Restricted Boltzmann machine)由多倫多大學的 Geoff Hinton 等人提出,它是一種可以用于降維、分類、回歸、協(xié)同過濾、特征學習以及主題建模的算法。更多關(guān)于如何部署諸如 RBM 這樣的神經(jīng)網(wǎng)絡(luò)的具體例子,請參閱 deeplearning4j 關(guān)于深度學習用例的內(nèi)容。
本文將從受限玻爾茲曼機的關(guān)系和歷史重要性出發(fā),首先討論什么是 RBM。隨后,我們會使用圖表和淺顯的語言來描述它們的運行原理。
RBM 是兩層神經(jīng)網(wǎng)絡(luò),這些淺層神經(jīng)網(wǎng)絡(luò)是 DBN(深度信念網(wǎng)絡(luò))的構(gòu)建塊。RBM 的第一層被稱為可見層或者輸入層,它的第二層叫做隱藏層。
上圖中的每個圓圈代表一個類似于神經(jīng)元的節(jié)點,這些節(jié)點通常是產(chǎn)生計算的地方。相鄰層之間是相連的,但是同層之間的節(jié)點是不相連的。
也就是說,不存在層內(nèi)通信,這就是 RBM 中的限制所在。每一個節(jié)點都是處理輸入數(shù)據(jù)的單元,每個節(jié)點通過隨機決定是否傳遞輸入。隨機意味著「隨機判斷」,這里修改輸入的參數(shù)都是隨機初始化的。
每個輸入單元以數(shù)據(jù)集樣本中的低級特征作為輸入。例如,對于一個由灰度圖組成的數(shù)據(jù)集,每個輸入節(jié)點都會接收圖像中的一個像素值。MNIST 數(shù)據(jù)集有 784 個像素點,所以處理它們的神經(jīng)網(wǎng)絡(luò)必須有 784 個輸入節(jié)點。
現(xiàn)在讓我們跟隨單像素穿過這兩層網(wǎng)絡(luò)。在隱藏層的節(jié)點 1,x 和一個權(quán)重相乘,然后再加上一個偏置項。這兩個運算的結(jié)果可作為非線性激活函數(shù)的輸入,在給定輸入 x 時激活函數(shù)能給出這個節(jié)點的輸出,或者信號通過它之后的強度。這里其實和我們常見的神經(jīng)網(wǎng)絡(luò)是一樣的過程。
接下來,讓我們看一下多個輸入單元是如何結(jié)合在一個隱藏節(jié)點的。每個 x 乘以一個獨立的權(quán)重,然后相加后再加一個偏置項,最后將結(jié)果傳遞到激活函數(shù)來產(chǎn)生輸出。
因為所有可見(或輸入)節(jié)點的輸入都被傳遞到所有的隱藏節(jié)點了,所以 RBM 可以被定義為對稱二分圖(symmetrical bipartite graph)。
對稱意味著每個可見節(jié)點都與一個隱藏節(jié)點相連(如下所示)。二分則意味著它具有兩部分,或者兩層。圖是一個數(shù)學術(shù)語,指的是由節(jié)點和邊組成的網(wǎng)絡(luò)。
在每一個隱藏節(jié)點,每個輸入 x 都與對應的權(quán)重 w 相乘。也就是說,一個輸入 x 會擁有 12 個權(quán)重(4 個輸入節(jié)點×3 個輸出節(jié)點)。兩層之間的權(quán)重總會形成一個矩陣,矩陣的行數(shù)等于輸入節(jié)點的個數(shù),列數(shù)等于輸出節(jié)點的個數(shù)。
每個隱藏節(jié)點會接收 4 個與對應權(quán)重相乘的輸入。這些乘積的和再一次與偏置相加,并將結(jié)果饋送到激活函數(shù)中以作為隱藏單元的輸出。
如果這兩層是更深網(wǎng)絡(luò)的一部分,那么第一個隱藏層的輸出會被傳遞到第二個隱藏層作為輸入,從這里開始就可以有很多隱藏層,直到它們增加到最終的分類層。對于簡單的前饋網(wǎng)絡(luò),RBM 節(jié)點起著自編碼器的作用,除此之外,別無其它。
重建(Reconstruction)
但是在本文關(guān)于 RBM 的介紹中,我們會集中討論它們?nèi)绾我砸环N無監(jiān)督的方式通過自身來重建數(shù)據(jù),這使得在不涉及更深層網(wǎng)絡(luò)的情況下,可見層和第一個隱藏層之間會存在數(shù)次前向和反向傳播。
在重建階段,第一個隱藏層的激活狀態(tài)變成了反向傳遞過程中的輸入。它們與每個連接邊相同的權(quán)重相乘,就像 x 在前向傳遞的過程中隨著權(quán)重調(diào)節(jié)一樣。這些乘積的和在每個可見節(jié)點處又與可見層的偏置項相加,這些運算的輸出就是一次重建,也就是對原始輸入的一個逼近。這可以通過下圖表達:
因為 RBM 的權(quán)重是隨機初始化的,所以,重建結(jié)果和原始輸入的差距通常會比較大。你可以將 r 和輸入值之間的差值看做重建誤差,然后這個誤差會沿著 RBM 的權(quán)重反向傳播,以一個迭代學習的過程不斷反向傳播,直到達到某個誤差最小值。
正如你所看到的,在前向傳遞過程中,給定權(quán)重的情況下 RBM 會使用輸入來預測節(jié)點的激活值,或者輸出的概率 x:p(a|x; w)。
但是在反向傳播的過程中,當激活值作為輸入并輸出原始數(shù)據(jù)的重建或者預測時,RBM 嘗試在給定激活值 a 的情況下估計輸入 x 的概率,它具有與前向傳遞過程中相同的權(quán)重參數(shù)。這第二個階段可以被表達為 p(x|a; w)。
這兩個概率估計將共同得到關(guān)于輸入 x 和激活值 a 的聯(lián)合概率分布,或者 p(x, a)。重建與回歸有所不同,也不同于分類。回歸基于很多輸入來估計一個連續(xù)值,分類預測出離散的標簽以應用在給定的輸入樣本上,而重建是在預測原始輸入的概率分布。
這種重建被稱之為生成學習,它必須跟由分類器執(zhí)行的判別學習區(qū)分開來。判別學習將輸入映射到標簽上,有效地在數(shù)據(jù)點與樣本之間繪制條件概率。若假設(shè) RBM 的輸入數(shù)據(jù)和重建結(jié)果是不同形狀的正態(tài)曲線,它們只有部分重疊。
為了衡量輸入數(shù)據(jù)的預測概率分布和真實分布之間的距離,RBM 使用 KL 散度來度量兩個分布的相似性。KL 散度測量的是兩條曲線的非重疊區(qū)域或者說發(fā)散區(qū)域,RBM 的優(yōu)化算法嘗試最小化這些區(qū)域,所以當共享權(quán)重與第一個隱藏層的激活值相乘時就可以得出原始輸入的近似。圖的左邊是一組輸入的概率分布 p 及其重構(gòu)分布 q,圖的右側(cè)是它們的差的積分。
迭代地根據(jù)它們產(chǎn)生的誤差來調(diào)節(jié)權(quán)重,RBM 學會了逼近原始數(shù)據(jù)。你可以說權(quán)重在慢慢地反映輸入數(shù)據(jù)的結(jié)構(gòu),并通過隱藏層的激活值進行編碼,學習過程就像兩個概率分布在逐步重合。
概率分布
讓我們來討論一下概率分布。如果你在擲兩個骰子,所有結(jié)果的概率分布如下:
也就是說,和為 7 的結(jié)果是最有可能出現(xiàn)的,因為相比于 2 到 12 等其它結(jié)果,有更多的拋擲組合可以得到 7 這個結(jié)果(3+4,1+6,2+5)。
或者舉另一個例子:語言是字母的特定概率分布,因為每一種語言會使用一些字母較多,而另一些較少。在英語中,字母 e、t 以及 a 是最常見的,然而在冰島語中,最常見的字母是 a、t 和 n。因此嘗試使用基于英語的權(quán)重集合來重建冰島語將會導致較大的差異。
同樣,圖像數(shù)據(jù)集擁有像素值的唯一概率分布,這取決于數(shù)據(jù)集中圖像的種類。像素值的分布取決于數(shù)據(jù)集中的圖像類別,例如 MNIST:
或者 Faces in the Wild 數(shù)據(jù)集中標記的頭像:
想象一下僅輸入狗和大象圖片的 RBM,它只有兩個輸出節(jié)點,每個結(jié)點對應一種動物。在前向傳遞的過程中 RBM 會問自己這樣的問題:在給定的這些像素下,我應該向哪個節(jié)點發(fā)送更強的信號呢,大象節(jié)點還是狗的節(jié)點?在反向傳遞的過程中 RBM 的問題是:給定一頭大象的時候,應該期望那種像素分布?
那就是聯(lián)合概率分布:給定 a 時 x 的概率以及給定 x 時 a 的概率,可以根據(jù) RBM 兩層之間的共享權(quán)重而確定。
從某種意義上而言,學習重建的過程就是學習在給定的圖像集合下,哪些像素會傾向于同時出現(xiàn)。由深層網(wǎng)絡(luò)的隱藏層節(jié)點所產(chǎn)生的激活狀態(tài)表現(xiàn)出來的共現(xiàn)現(xiàn)象:例如,「非線性灰色管+大的、松軟的耳朵+皺紋」可以作為一個分布。
在上面的兩幅圖像中,你看到了用 Deeplearning4j 實現(xiàn)的 RBM。這些重建代表著 RBM 的激活值所「認為」輸入數(shù)據(jù)看起來的樣子,Geoff Hinton 將其稱為機器「做夢」。當被呈現(xiàn)在神經(jīng)網(wǎng)絡(luò)在訓練過程時,這種可視化是非常有用的啟發(fā),它讓人確信 RBM 確實在學習。如果不是,那么它的超參數(shù)應該被調(diào)整。
最后一點:你會注意到 RBM 有兩個偏置項。這是有別于其它自動編碼器的一個方面。隱藏層的偏置項有助于 RBM 在前向傳遞中獲得非零激活值,而可見層的偏置有助于 RBM 學習后向傳遞中的重建。
多層受限玻爾茲曼機
一旦 RBM 學到了與第一隱藏層激活值有關(guān)的輸入數(shù)據(jù)的結(jié)構(gòu),那么數(shù)據(jù)就會沿著網(wǎng)絡(luò)向下傳遞一層。你的第一個隱藏層就成為了新的可見層或輸入層。這一層的激活值會和第二個隱藏層的權(quán)重相乘,以產(chǎn)生另一組的激活。
這種通過特征分組創(chuàng)建激活值集合序列,并對特征組進行分組的過程是特征層次結(jié)構(gòu)的基礎(chǔ),通過這個過程,神經(jīng)網(wǎng)絡(luò)學到了更復雜的、更抽象的數(shù)據(jù)表征。
對于每一個新的隱藏層,權(quán)重都會通過迭代反復調(diào)整,直至該層能夠逼近來自于前一層的輸入。這是貪婪的、逐層的、無監(jiān)督的預訓練。它不需要使用標簽來改善網(wǎng)絡(luò)的權(quán)重,這意味著我們可以在無標簽的數(shù)據(jù)集上進行訓練,而這些數(shù)據(jù)沒有經(jīng)過人工處理,這是現(xiàn)實中絕大多數(shù)的數(shù)據(jù)。通常,擁有更多數(shù)據(jù)的算法會產(chǎn)生更準確的結(jié)果,這也是深層學習算法崛起的原因之一。
因為這些權(quán)重早已接近數(shù)據(jù)的特征,所以在使用深度信念網(wǎng)絡(luò)進行圖像分類的時候,后續(xù)的監(jiān)督學習階段可以更簡單地學習。盡管 RBM 有很多用途,但合適的權(quán)重初始化以方便以后的分類是其主要優(yōu)點之一。從某種程度而言,它們完成了某種類似于反向傳播的功能:它們很好地調(diào)整了權(quán)重,以對數(shù)據(jù)進行更好的建模。你可以說預訓練和反向傳播是達到相同目的的可替代方法。
為了在一個圖中展示受限玻爾茲曼機,我們需要使用對稱二分雙向圖表示:
對于那些對深入研究 RBM 結(jié)構(gòu)感興趣的人而言,它們是一種無向圖模型,也被稱作馬爾科夫隨機場。
代碼實例:Stacked RBMS
GitHub 鏈接:
https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/unsupervised/deepbelief/DeepAutoEncoderExample.java
參數(shù) & K
變量 k 是運行對比散度(Contrastive Divergence)的次數(shù)。對比散度是用來計算梯度(該斜率表示網(wǎng)絡(luò)權(quán)重與其誤差之間的關(guān)系)的方法,沒有這種方法,學習就無法進行。
在上面的例子中,你可以看到如何將 RBM 創(chuàng)建為具有更通用多層配置的層。在每個點處,你會發(fā)現(xiàn)一個可以影響深度神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)和性能的額外參數(shù)。大多數(shù)這些參數(shù)都是在這里定義的。
參數(shù)初始化(weightInit 或者 weightInitialization)表示放大或者抑制到達每個節(jié)點的輸入信號的系數(shù)的初始值。合適的權(quán)重初始化可以節(jié)省大量的訓練時間,因為訓練一個網(wǎng)絡(luò)只不過是調(diào)整系數(shù)來傳遞最佳信號,從而使網(wǎng)絡(luò)能夠準確分類。
激活函數(shù)(activationFunction)是一組函數(shù)中的一個,用于確定每個節(jié)點處的激活閾值,高于閾值的信號可以通過,低于閾值的信號就被阻止。如果一個節(jié)點傳遞了一個信號,則它被「激活」。
優(yōu)化算法(optimizationAlgo)指神經(jīng)網(wǎng)絡(luò)最小化誤差或者找到最小誤差軌跡的方式,它是一步一步調(diào)整參數(shù)的。LBFGS 是一種優(yōu)化算法,它利用二階導數(shù)來計算梯度的斜率,系數(shù)將沿著梯度的斜率進行調(diào)整。
正則化(regularization)方法(如 L2)有助于防止神經(jīng)網(wǎng)絡(luò)中的過擬合。正則化本質(zhì)上會懲罰較大的系數(shù),因為大系數(shù)意味著網(wǎng)絡(luò)已經(jīng)學會將結(jié)果鎖定在幾個高權(quán)值的輸入上了。過強的權(quán)重會使網(wǎng)絡(luò)模型在面對新數(shù)據(jù)的時候難以泛化。
顯元/隱元(VisibleUnit/HiddenUnit)指神經(jīng)網(wǎng)絡(luò)的層。顯元或者可見層,是輸入到達的層,隱元或者隱藏層,是輸入被結(jié)合成更復雜特征的層。這兩種單元都有各自所謂的變換,在這里,可見層是高斯變換,隱藏層是整流線性單元,它們將來自它們對應層的信號映射到新的空間。
損失函數(shù)(lossFunction)是測量誤差的方法,或者測量網(wǎng)絡(luò)預測和測試集包含的正確的標簽之間差距的方法。我們在這里使用的是 SQUARED_ERROR,它使所有的誤差都是正值,因此可以被求和并反向傳播。
學習率(learningRate,如 momentum)會影響神經(jīng)網(wǎng)絡(luò)在每次迭代中校正誤差時調(diào)整系數(shù)的程度。這兩個參數(shù)有助于確定網(wǎng)絡(luò)將梯度降低到局部最優(yōu)時的步長。較大的學習率會使網(wǎng)絡(luò)學習得更快,并且可能越過最佳值。較小的學習率可能減慢學習,而且可能是低效的。
連續(xù) RBM
連續(xù) RBM 是受限玻爾茲曼機的一種形式,它通過不同類型的對比散度采樣接受連續(xù)的輸入(也就是比整數(shù)切割得更細的數(shù)字)。這允許 CRBM 處理圖像像素或字數(shù)向量這類被歸一化到 0 到 1 之間的小數(shù)的向量。
應該注意,深度學習網(wǎng)絡(luò)的每一層都需要四個元素:輸入、系數(shù)、偏置項以及變換(激活算法)。
輸入是數(shù)值數(shù)據(jù),是一個來自于前面層(或者原始數(shù)據(jù))的向量。系數(shù)是通過每個節(jié)點層的特征的權(quán)重。偏置項確保部分節(jié)點無論如何都能夠被激活。變換是一種額外的算法,它在數(shù)據(jù)通過每一層以后以一種使梯度(梯度是網(wǎng)絡(luò)必須學習的)更容易被計算的方式壓縮數(shù)據(jù)。
這些額外算法和它們的組合可以逐層變化。
一種有效的連續(xù) RBM 在可見(或者輸入)層上使用高斯變換,在隱藏層上使用整流線性單元(ReLU)變換。這在面部重建中特別有用。對于處理二進制數(shù)據(jù)的 RBM 而言,只需要進行二進制轉(zhuǎn)換即可。
高斯變換在 RBM 的隱藏層上的表現(xiàn)不好。相反,使用 ReLU 變換能夠表示比二進制變換更多的特征,我們在深度置信網(wǎng)絡(luò)中使用了它。
總結(jié) & 下一步工作
你可以將 RBM 的輸出解釋為百分比。每次重建的數(shù)字不為零,這是 RBM 學習輸入的良好指示。
應當指出的是,RBM 并不能生成所有的淺層前饋網(wǎng)絡(luò)中最穩(wěn)定、最一致的結(jié)果。在很多情況下,密集層自編碼器性能較好。事實上,業(yè)界正在轉(zhuǎn)向變分自編碼器和 GAN 等工具。
下一步,我們將會展示如何實現(xiàn)深度置信網(wǎng)絡(luò)
https://deeplearning4j.org/deepbeliefnetwork.html
它由許多受限玻爾茲曼機堆疊而成。
機器之心編譯
版權(quán)歸原作者所有,轉(zhuǎn)載僅供學習使用,不用于任何商業(yè)用途,如有侵權(quán)請留言聯(lián)系刪除,感謝合作。
數(shù)據(jù)與算法之美
用數(shù)據(jù)解決不可能
長按掃碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的一起读懂传说中的经典:受限玻尔兹曼机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 近期资料分享汇总,还不快来看看你漏了哪份
- 下一篇: 从一个骗局谈生活中的基础算法