摘要:儘管性能沒有流行的生成模型好,但受限玻爾茲曼機還是很多讀者都希望了解的內容。 這不僅是因為深度學習的複興很大程度上是以它為前鋒,同時它那種逐層訓練與重構的思想也非常有意思。 本文介紹了什麼是受限玻爾茲曼機
儘管性能沒有流行的生成模型好,但受限玻爾茲曼機還是很多讀者都希望了解的內容。 這不僅是因為深度學習的複興很大程度上是以它為前鋒,同時它那種逐層訓練與重構的思想也非常有意思。 本文介紹了什麼是受限玻爾茲曼機,以及它的基本原理,並以非常簡單的語言描述了它的訓練過程。 雖然本文不能給出具體的實現,但這些基本概念還是很有意思的。
定義 & 結構
受限玻爾茲曼機(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 的權重反向傳播,以一個迭代學習的過程不斷反向傳播,直到達到某個誤差最小值。
關於反向傳播的更全面的解釋請查看機器之心的文章:反向傳播為何飽受質疑? (附完整的 BP 推導)。
正如你所看到的,在前向傳遞過程中,給定權重的情況下 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),它由許多受限玻爾茲曼機堆疊而成。
版權聲明
本文僅代表作者觀點,不代表百度立場。
本文係作者授權百度百家發表,未經許可,不得轉載。