受限Boltzmann机(Restricted Boltzmann Machine)
起源:Boltzmann神經網絡
Boltzmann神經網絡的結構是由Hopfield遞歸神經網絡改良過來的,Hopfield中引入了統計物理學的能量函數的概念。
即,cost函數由統計物理學的能量函數給出,隨著網絡的訓練,能量函數會逐漸變小。
可視為一動力系統,其能量函數的極小值對應系統的穩定平衡點。
Hinton發明的Boltzmann中乘熱打鐵,對神經元輸出引入了隨機概率重構的概念。其想法來自于模擬退火算法:
首先在高溫下進行搜索,由于此時各狀態出現概率相差不大,系統可以很快進入“熱平衡狀態”,是一種快速找到系統概率的低能區的“粗搜索”過程。
隨著溫度逐漸降低,各狀態出現概率的差距逐漸被擴大,搜索精度不斷提高。最后以一較高置信度達到網絡能量函數的全局最小點。
隨機重構則是Metropolis抽樣提出的,作為模擬退火算法的核心:
也就是說,每次重構,都往Δ能量差減少的方向移動,這是RBM的cost函數設計核心,AutoEncoder也是受此啟發。
?
?
Part I:RBM的結構與目標
RBM簡化了Boltzmann網絡,取消了每層神經元之間的連接,即不再是一個遞歸神經網絡,更像是一個MLP。
定義聯合能量函數: E(v,h)=?b′v?c′h?h′Wv
?? (b'、c'分別顯隱bias做矩陣乘法,h'則是h的全部取值,RBM限定了取值范圍{0,1},由激活函數依據概率分布生成)
由此得到v的邊緣概率分布:P(v)=∑he?E(v,h)ZZ=∑v∑he?E(v,h)
Z是歸一化常數,說白了就是保證概率在[0,1]之間湊出的式子,計算cost函數時可以無視。
RBM的目的是算出盡量符合v(即輸入)的概率分布P(v)
,即實現 ??argmaxW∏v?VP(v)
但是問題在于沒有標簽,沒有誤差,無法訓練W,所以無法訓練出P(v)
的概率分布。
所以早期的RBM采用從h重構v'來計算誤差。重構v',說的好像挺簡單,但是需要知道P(v,h)
的聯合概率分布,用這概率分布去生成v'。
通常情況下,聯合概率分布無法計算,但是可以通過條件概率分布+迭代法近似模擬出符合聯合概率的樣本。
RBM中采用的是Gibbs采樣來重構,是MCMC(Monte Carlo?Markov Chain)的一種算法特例。
Monte Carlo是根據概率隨機生成數據的算法統稱,Markov Chain則是符合馬爾可夫鏈的算法統稱。【參考】
這樣,只要通過又臭又長的馬爾可夫鏈,使用Gibbs采樣重構出新樣本v'就好了。
有cost函數:cost=argmaxW∑v?VlogP(v)?argmaxW∑v′?V′logP(v′)
這個cost函數在實際計算時候簡直是折磨,原因有二: ①Z毫無意義且計算麻煩 ②?logP(v)牽扯到E(v,h),E(v,h)的計算也麻煩。
所以Bengio在Learning deep architectures for AI一文中提出了簡化的cost函數——FreeEnergy(自由能量)函數。
定義自由能量函數(無視Z+負對數似然):
FreeEnergy(v)=?log(P(v)?Z)=?log∑he?E(v,h)
重定義E函數:Energy(v)=?b′v?∑i∑hihi(W?v+c),hi?{0,1}
這里的精簡比較神奇,c′h
被刻意X掉了,論文里假設是h只有一個神經元,這樣可有可無。c的梯度可以在后半部分求出,所以無須擔心c無法更新。
盡管此時的cost函數已經崩壞(Z因子,c'項都不見了),但是骨子還在,對于Gradient Descent影響不大。
這樣,參數對稱的兩部分,可以得到簡化P(v) 【推導詳見論文】:P(v)=eb′vZ∏i∑hiehi(W?v+c)
于是有更加簡化的自由能量函數:FreeEnergy(v)=?b′v?∑ilog∑hiehi(W?v+c),hi?{0,1}
由于取值非0即1,再次簡化,?FreeEnergy(v)=?b′v?∑ilog(1+e(W?v+c))
最終,使用FreeEnergy(v)替代logP(v),有簡化cost函數:cost=FreeEnergy(v))?FreeEnergy(v′)
?
?
Part II:重構與Gibbs采樣
由于V層和H層,每層內各個神經元之間并無連接,因而這些神經元的概率分布是獨立的,那么就可以加權通過激活函數計算單個結點的激活概率。
P(hj=1|v)=Sigmoid(Wj?v+cj)P(vi=1|h)=Sigmoid(WTi?h+bi)
注意反向重構時,同AutoEncoder一樣,仍然使用Tied Weight。
這樣,就有了條件概率分布,可以構建馬爾可夫鏈了。
上圖是一條波動的鏈,v0->h0普通的正向傳播,忽略不計。
從h0,正式開始Gibbs采樣,一個step過程為,hn->vn+1->hn+1,即hvh過程。
vn+1=Bernoulli?Sigmoid(WT?hn+b)hn+1=Bernoulli?Sigmoid(W?vn+1+c)
當t→∞
時,有 vt≈v′?
Part III ?K步對比散度算法(CD-K)、可持久化對比散度算法(Persistent CD)
仔細想想RBM中的循環
①外循環:主迭代,訓練W,近似逼近P(v|h)、P(h|v)。
②內循環,Gibbs采樣,近似逼近P(v)
二重壓力下,RBM網絡的計算量實在可怕。
Hinton在2002年的?Training Products of Experts by Minimizing Contrastive Divergence?一文中有這個式子:
???Wij(Q0||Q∞?Q1||Q∞)≈<si,sj>Q0?<si,sj>Q1
即在求v、v'對比相差的cost函數的梯度,用以更新參數時,無限步Gibbs采樣的效果與單步Gibbs采樣效果差距不大。
數學上很難給出解釋,疑似是Gradient Descent與Gibbs Sampling(Gibbs可以看作是GD的先行?)的迭代效果重合。通常取K=1或K=10(更精確)來減少計算量。
?
既然Gibbs Sampling可以看作是Gradient Descent的先行使者,那么每次做梯度法時候,不必重啟馬爾可夫鏈。
而是利用舊鏈尾產生的hk,作為新鏈頭h0。
數學上仍然很難給出解釋,直覺上說,Gradient Descent的小量更新并不會影響馬爾可夫鏈繼續擴展,即便狗尾續貂,效果仍然不錯。
通過測試,可持久化CD在每次鏈長較長時效果比較好(k=15),若k=1,則影響較大,不建議使用,選擇大量梯度比較穩妥。
?
Part IV ?代理似然函數(Proxies to Likelihood)
Bengio的FreeEnerey方法一定程度上減輕了梯度法的計算量,但是為迭代收斂的評估帶來巨大麻煩。
由于歸一化因子Z的省略,若使用FreeEnerey的cost函數做評估,那么不同數據集的收斂值幾乎是千奇百怪的。
所以需要建立一套數據集公用評估標準,即引入代理似然函數。
代理一:交錯熵(or 最小二乘法)
AutoEncoder中使用的cost函數的修改版,Z變成了馬爾可夫鏈尾的h。
cost=v?log(Sigmoid(W?h?1+b))+(1?v)?log(1?Sigmoid(W?h?1+b))
代理二:偽造似然函數(Pseudo?likelihood)
仔細回想一下可持久化CD,馬爾可夫鏈狗尾續貂,徹夜未眠。
這樣,若一直使用鏈尾的h做交錯熵,那么這個交錯熵勢必是不停波動的,并不很直觀的。
因而,引入了偽造似然函數:每次選擇v的某一維度值,取反,偽造成重構的v'。
有對數似然函數:PL(x)=∑ilogP(xi|x?i)
當然并沒有必要那么精確,每次只需隨機抽一個維度進行偽造,乘上N倍即可:
PL(x)=N?logP(xi|x?i)i~Random(0,N)
logP(xi|x?i)
的條件概率計算頗為麻煩,利用條件概率公式+貝葉斯假設:
logP(xi|x?i)≈logP(xi)P(xi)+P(x?i)=loge?FreeEnergy(xi)e?FreeEnergy(xi)+e?FreeEnergy(x?i)≈log(Sigmoid(FreeEnergy(x?i)?FreeEnergy(xi)))
Part V ?與AutoEncoder的關系
準確來說,AutoEncoder是RBM的簡化衍生物。RBM是一個概率生成模型,而AutoEncoder只是一個普通的模型。
神經網絡的本質是訓練岀能夠模擬輸入的W,這樣,在測試的時候,遇到近似的輸入,W能夠做出漂亮的響應。
RBM選擇概率,是因為有概率論的公式支持。這樣優化網絡,能夠達到上述目標。
只是原始目標不好優化,Hinton才提出對比訓練的方法,即繞了個彎子的選擇重構。
能量函數使得W朝更大概率方向優化。但是,正如線性回歸有最小二乘法和高斯分布兩種解釋一樣。
其實,W的訓練大可不必拘泥于概率,AutoEncoder則繞過了這點,直接選擇了加權重構,所以cost函數簡單。
可以這么說,重構的數學理論基礎就是RBM的原始目標函數。而概率重構啟發了直接重構。兩者近似等價。
從馬爾可夫鏈上看,AutoEncoder可看作是鏈長為1的特殊形式,即一次重構,而RBM是多次重構。
能使用直接重構的另一個原因是,Hinton在實驗中發現,梯度法的一次重構效果出奇好。
所以AutoEncoder中摒棄了麻煩的Gibbs采樣過程。
從GPU計算來看,k=1情況下,AutoEncoer的GPU利用率高(70%),RBM利用率低(30%),一開始實現的時候嚇了一跳。
CUDA執行馬爾可夫鏈效率并不高,目測二項分布隨機重構是由CPU執行的(?_(:_」∠)_想想好像GPU沒那么高級 ?)
尤其在把batch_size設為600之后,RBM的GPU利用率居然只有(10%), 所以官方教程把batch_size設為了20,來減小概率生成的計算壓力。
當然k=15時,GPU加速之后仍然十分緩慢。RBM不愧是硬件殺手。
(本圖來自MSI Afterburner,GTX 765M,OC(847/2512/913))
?
Part VI ?Gaussian-Bernoulli RBM
仔細看看Bernoulli-Bernoulli的重構過程:
[0/1]->[0/1]->[0/1].....,由于二項分布是離散概率分布,所以重構生成值要么是0,要么是1,似乎有些不靠譜。
所以,就有了Gaussian-Bernoulli ?RBM,在v層中強制引入連續數值型Gaussian噪聲,主要對原RBM做以下修改:
E(v,h)=∑i(vi?bi)22σi2?c′h?h′WvσP(vi=v|h)=N(bi+σi(W?h),σ2i)P(hi=1|v)=Sigmoid(W?vσ+c)
其中Size(σ)=NVisble
,為正態分布標準差,為正值,一般不作訓練,取定值1,原因有二:
其一:梯度法訓練會產生負值和0,導致訓練失敗
其二:Gaussian過程并不需要精確的范圍,取的只是正態分布的連續特征,提供Gaussian噪聲。
當然,還是有人提出了可訓練σ
的改進方法,個人實際測試并沒有成功, σ在梯度下降過程中,出現了過大數值問題,導致網絡崩潰。參考
Gaussian過程極易產生誤解,由于正態分布的取值范圍是R,所以對比散度樣本不可以再使用由Gaussian分布生成v’
Gaussian過程主要為從二項[0/1]的h,提供一個連續型重構緩沖范圍,而不僅僅把馬爾可夫鏈的運行局限在0/1之間
這樣做的原因是,一般輸入是連續型值,符合的是0~1之間的連續概率分布,而不是簡單的離散二項分布。
然后再把Gaussian分布映射回Bernoulli分布h',最后使用的是h[-1],令:v′=Bernoulli?Sigmoid(W?h[?1]+b)
對比圖如下:
? ? ?
?左圖(Bernoulli-Bernoulli) ? ? 右圖(Gaussian-Bernoulli)
可以看到,Gaussian分布使得參數學習到了更多的特征,但是也帶來了更大的重構誤差,以及更快下降到局部最小值。學習率和Bernoulli-Bernoulli相同情況下,epoch2就過擬合了。
Hinton在?A practical guide to training restricted Boltzmann machines?提到,Gaussian-Bernoulli模型不穩定,由于Gaussian分布的上界不定,
所以,學習率較之于Bernoulli-Bernoulli應該下降1~2個數量級。同時,應當慎用CD-10、Persistent CD,這些會帶來更不穩定的重構。(個人測試情況,似然幾乎無法下降)
from: http://www.cnblogs.com/neopenx/p/4399336.html
總結
以上是生活随笔為你收集整理的受限Boltzmann机(Restricted Boltzmann Machine)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大白话解析模拟退火算法、遗传算法入门
- 下一篇: 第五章 深度神经网络为何很难训练