簡體   English   中英

約束玻爾茲曼機器中的自由能近似方程

[英]The Free energy approximation Equation in Restriction Boltzmann Machines

根據deeplearning教程

python中的自由能量是

def free_energy(self, v_sample):
    ''' Function to compute the free energy '''
    wx_b = T.dot(v_sample, self.W) + self.hbias
    vbias_term = T.dot(v_sample, self.vbias)
    hidden_term = T.sum(T.log(1 + T.exp(wx_b)), axis=1)
    return -hidden_term - vbias_term

我不是很擅長python,基本上它將每個可見單元的產品專家作為向量wx_b,計算exp和加1,計算log並將其與隱藏項相加。

我認為這與學習深度架構中的自由能方程略有不同:

FreeEnergy(x)= -b'x - ΣlogΣe^ hi(ci + Wix)。

哪里:

  • hi是單位i隱藏層,
  • cii在矢量c隱藏偏壓。

它計算exp和sum,計算log值對和值的影響。 畢竟根據可見單位的數量總結所有產品專家。

上面的等式是來自Learning Deep Architectures for AI(Yoshua Bengio)的eq.5.21

下面是我的java實現草案,vis_v是可見層樣本,hid_v是隱藏層單元樣本。

private double freeEnergy(RealVector vis_v, RealVector hid_v){
 RealVector wx_hb= W.preMultiply(vis_v).add(hBias);
 double vbias_term= vis_v.dotProduct(vBias);
 double sum_hidden_term = 0;
 for(int i=0;i< wx_hb.getDimension();i++){
     RealVector vis_expert = hid_v.mapMultiply(wx_hb.getEntry(i));
     double hidden_term= StatUtils.sum(vis_expert.map(new Exp()).toArray());
     sum_hidden_term+=Math.log(hidden_term);
 }
 return -sum_hidden_term-vbias_term;
}

這是某種近似嗎? 我試圖在java中實現相同的東西,但我對此感到困惑。 在此先感謝您的幫助!

我收集你的困惑是關於參考python代碼中自由能函數的定義。 如果這不是你的要求我道歉。

首先,這不是近似值。 看起來他們假設隱藏單位是二進制值。 請記住,自由能只是能量的(對數),隱藏的變量被邊緣化了。 因此,上面列出的自由能方程中的內部和只是第i個隱藏單元可以采用的值的總和,在這種情況下,是{0,1}。 由於exp(0)= 1,內部和恰好變為1 + exp(...)。 請參閱您提供鏈接中的“帶二進制單位的RBM”部分。

我不熟悉java中的apache commons數學庫所以我不能在那里提供大量的幫助,但實現應該是來自python函數的直接翻譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM