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