受限玻爾茲曼機基礎教程
定義與結構
受限玻爾茲曼機(RBM)由Geoff Hinton發明,是一種用於降維、分類、回歸、協同過濾、特征學習和主題建模的算法。(如需通過實例了解RBM等神經網絡的應用方法,請參閱應用案例)。
我們首先介紹受限玻爾茲曼機這類神經網絡,因為它相對簡單且具有重要的歷史意義。下文將以示意圖和通俗的語言解釋其運作原理。
RBM是有兩個層的淺層神經網絡,它是組成深度置信網絡的基礎部件。RBM的第一個層稱為可見層,又稱輸入層,而第二個層是隱藏層。
上圖中每個圓圈都是一個與神經元相似的單元,稱為節點,運算在節點中進行。一個層中的節點與另一層中的所有節點分別連接,但與同一層中的其他節點並不相連。
也就是說,層的內部不存在通信-這就是受限玻爾茲曼機被稱為受限的原因。每個節點對輸入進行處理和運算,判定是否繼續傳輸輸入的數據,而這種判定一開始是隨機的。(“隨機”(stochastic)一詞在此處指與輸入相乘的初始系數是隨機生成的。)
每個可見節點負責處理網絡需要學習的數據集中一個項目的一種低層次特征。舉例來說,如果處理的是一個灰度圖像的數據集,則每個可見節點將接收一張圖像中每個像素的像素值。(MNIST圖像有784個像素,所以處理這類圖像的神經網絡的一個可見層必須有784個輸入節點。)
接著來看單個像素值x如何通過這一雙層網絡。在隱藏層的節點1中x與一個權重相乘,再與所謂的偏差
激活函數f((權重w * 輸入x) + 偏差b ) = 輸出a
下面來看一個隱藏節點如何整合多項輸入。每個x分別與各自的權重相乘,乘積之和再與偏差相加,其結果同樣經過激活函數運算得到節點的輸出值。
由於每個可見節點的輸入都被傳遞至所有的隱藏節點,所以也可將RBM定義為一種對稱二分圖。
對稱指每個可見節點都與所有的隱藏節點相連接(見下圖)。二分指有兩個部分或層,而這裏的圖是指代節點網絡的數學名詞。
在每個隱藏節點中,每一個輸入x都會與其相對應的權重w相乘。也就是說,每個輸入x會對應三個權重,因此總共有12個權重(4個輸入節點 x 3個隱藏節點)。兩層之間的權重始終都是一個行數等於輸入節點數、列數等於輸出節點數的矩陣。
每個隱藏節點會接收四個與對應權重相乘後的輸入值。這些乘積之和與一個偏差值相加(至少能強制讓一部分節點激活),其結果再經過激活運算得到每個隱藏節點的輸出a。
如果這兩個層屬於一個深度神經網絡,那麽第一隱藏層的輸出會成為第二隱藏層的輸入,隨後再通過任意數量的隱藏層,直至到達最終的分類層。(簡單的前饋動作僅能讓RBM節點實現自動編碼器的功能。)
重構
但在本教程中,我們將重點關註受限玻爾茲曼機如何在無監督情況下學習重構數據(無監督指測試數據集沒有作為實際基準的標簽),在可見層和第一隱藏層之間進行多次正向和反向傳遞,而無需加大網絡的深度。
在重構階段,第一隱藏層的激活值成為反向傳遞中的輸入。這些輸入值與同樣的權重相乘,每兩個相連的節點之間各有一個權重,就像正向傳遞中輸入x的加權運算一樣。這些乘積的和再與每個可見層的偏差相加,所得結果就是重構值,亦即原始輸入的近似值。這一過程可以用下圖來表示:
由於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;右半邊的圖則顯示了兩條曲線之間的差異。
RBM根據權重產生的誤差反復調整權重,以此學習估計原始數據的近似值。可以說權重會慢慢開始反映出輸入的結構,而這種結構被編碼為第一個隱藏層的激活值。整個學習過程看上去像是兩條概率分布曲線在逐步重合。
概率分布
下面我們來介紹概率分布。如果擲兩枚骰子,則所有結果的概率分布情況如下圖所示:
也就是說,7是最有可能出現的結果,因為擲出7的組合方式(3+4、1+6、2+5)要多於擲出2到12之間其他數字的方式。任何預測擲骰子結果的公式都需要考慮到數字7的出現頻率較高。
或另一個例子:語言中的字母也有特定的概率分布,因為一種語言使用某些字母的頻率會高於其他語言。在英語中,字母e、t和a是最常見的,而冰島語中最常見的字母則是a、r和n。若用處理英語文本的權重來重構冰島語,結果就會出現較大的誤差。
與此類似,圖像數據集的像素值也有獨特的概率分布,具體取決於數據集所包含圖像的類別。數據集可能包括MNIST的手寫數字圖像:
或是自然臉部檢測數據集(Labeled Faces in the Wild)中的頭像:
試想有這樣一個RBM,其輸入數據都是大象和狗的圖片,RBM僅有兩個輸出節點,分別對應一種動物。RBM在正向傳遞中要回答的問題是:在輸入這些像素時,權重應當向哪個節點發送更強的信號?大象的節點還是狗的節點?而RBM在反向傳遞中要回答的問題是:如果輸出是大象,則應當預期出現怎樣的像素分布?
這就是聯合概率:給定a時x的概率以及給定x時a的概率,用RBM兩層之間的一個共用權重來表示。
學習重構數據的過程在某種意義上即是學習一組特定圖像中有哪些像素通常會同時出現。網絡深處隱藏層節點產生的激活值代表了明顯的同現關系,例如:“非直線灰色管 + 大而松垂的耳朵 + 皺紋”。
在上面的兩幅圖中,可以看到用Deeplearning4j實施的RBM所學會的重構。這些重構數據代表了原始數據在RBM激活函數“想象”中的模樣。Geoff Hinton稱之為機器在“做夢”。在神經網絡訓練過程中,這類圖像是非常有用的示意性方法,可以讓人確信RBM的確是在學習。如果RBM沒有在學習,則應當調整它的超參數,下文將會介紹這一概念。
最後一點:你會發現RBM有兩個偏差值。這是RBM與其他自動編碼器的區別所在。隱藏的偏差值幫助RBM在正向傳遞中生成激活值(因為偏差設定了下限,所以無論數據有多稀疏,至少有一部分節點會被激活),而可見層的偏差則幫助RBM通過反向傳遞學習重構數據。
多層結構
RBM根據第一個隱藏層的激活值學習了輸入數據的結構之後,數據即在網絡中繼續向下傳遞一層。第一個隱藏層的作用現在相當於可見層。激活值實際上相當於輸入,在第二個隱藏層的節點中與權重相乘,得到另一組激活值。
將特征分組,再將特征組分組,由此連續生成多組激活值的過程是特征層次分析的基礎,神經網絡用這種方法來學習更為復雜且抽象的數據表達形式。
每增加一個隱藏層,其權重都會反復進行調整,直到該層能較為準確地模擬出來自前一層的輸入。這是無監督的逐層貪婪預訓練方法,不需要標簽就可以改進網絡的權重,也就是說可以采用未標記、未經人工處理的數據來訓練,而現實中大部分的數據都屬於這一類別。一般的規律是,算法接觸的數據越多,產生的結果越準確,這正是深度學習算法十分厲害的原因之一。
權重能夠近似模擬出數據的特征後,也就為下一步的學習奠定了良好基礎,比如可以在隨後的有監督學習階段使用深度置信網絡來對圖像進行分類。
RBM有許多用途,其中最強的功能之一就是對權重進行合理的初始化,為之後的學習和分類做好準備。從某種意義上來說,RBM的作用與反向傳播相似:讓權重能夠有效地模擬數據。可以認為預訓練和反向傳播是實現同一個目的的不同方法,二者可以相互替代。
下面這幅對稱二分二向圖綜合顯示了玻爾茲曼機的運作方式。
深度RBM是一種有向無環圖(DAG),如有興趣可點擊鏈接了解其結構。
代碼示例:堆疊式受限玻爾茲曼機
請參考這裏
參數與變量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隱藏層使用高斯變換的效果並不理想。而修正線性單元變換則能夠表示的特征多於二進制變換,我們將其用於深度置信網絡。
總結與後續內容
你可以將RBM的輸出數值視為百分數。重構的數值只要不為零就都是良好的現象,表明RBM在學習這一輸入。如需從另一角度了解受限玻爾茲曼機的運作機制,請點擊此處。
應當註意的是,RBM並不是效果最穩定、最一致的淺層前饋網絡。許多情況下,包含稠密層的自動編碼器效果更好。整個行業也確實越來越傾向於使用變分自動編碼器等工具。
下面我們將演示如何實施深度置信網絡,其實質就是將許多受限玻爾茲曼機堆疊起來。
受限玻爾茲曼機基礎教程