约束玻尔兹曼机器中的自由能近似方程

时间:2012-03-30 14:07:54

标签: java python machine-learning artificial-intelligence rbm

根据a deeplearning tutorial

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,计算日志并将其与隐藏项进行求和。

我认为这与学习深度架构中的自由能方程略有不同:

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

其中:

  • hi是单位i隐藏图层
  • ci是向量c中的i隐藏偏差。

计算exp和sum,计算log值对和值的影响。毕竟根据可见单位的数量总结所有产品专家。

上述等式是来自Learning Deep Architectures for AI (Yoshua Bengio)

的等式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中实现相同的东西,但我对此感到困惑。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我收集你的困惑是关于参考python代码中自由能函数的定义。如果这不是你的要求我道歉。

首先,这是不是的近似值。看起来他们假设隐藏单位是二进制值。请记住,自由能只是能量的(对数),隐藏的变量被边缘化了。因此,上面列出的自由能方程中的内部和只是第i个隐藏单元可以采用的值的总和,在这种情况下,是{0,1}。由于exp(0)= 1,内部和恰好变为1 + exp(...)。请参阅link you provided中的“带二进制单位的RBM”部分。

我不熟悉java中的apache commons数学库,所以我不能提供大量的帮助,但实现应该是python函数的直接翻译。