Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,因此它是on-topic,用于堆栈溢出。
                        
                        6年前关闭。
                                                                                            
                
        
我一直在研究RBMs几个月,一直使用Python,并阅读了所有论文。我遇到了问题,我想,嘿?为什么不去源头?我以为我至少会借此机会让您有时间回复。

我的问题是关于受限玻尔兹曼机中的对数似然的。我已经读过,除了很小的模型外,在所有模型中都很难找到准确的对数似然性,因此引入了对比散度,PCD,伪对数似然性等。我的问题是,即使在小模型?

我遇到了这个公式的几个定义,而且似乎都不同。在Tielemen在2008年发表的论文“使用近似到梯度来训练受限的Boltzmann机器”中,他执行了该测试的对数似然版本以与其他类型的近似进行比较,但没有说明他使用的公式。我能找到的最接近的东西是使用能量函数而不是分区函数的概率,但由于无法完全理解其语法,因此我无法对此进行编码。

在Bengio等人的“表征学习:回顾和新观点”中,对数似然的方程式为:
 sum_t = 1至T(log P(X ^ T,theta))
等于sum_t = 1到T({0,1} ^ d_h(P(x ^(t),h; theta))中的log * sum_h
 其中T是训练示例。这是第11页的(14)。

唯一的问题是没有其他变量被定义。我假设x是训练数据实例,但是上标(t)是什么?我还假设theta是潜在变量h,W,v ...但是如何将其转换为代码?

我想我要问的是,您能给我一个代码(Python,伪代码或任何语言)算法来查找给定模型的对数似然性,以便我理解变量代表什么吗?这样,在简单的情况下,我可以找到确切的对数似然率,然后将它们与近似值进行比较,以了解近似值的真实程度。

最佳答案

您可以按以下方式在RBM下计算数据集X的对数似然率(我将Bengio的符号与W,b和d一起使用)。这不是用于计算RBM可能性的实用算法-它在x和h的长度上呈指数关系,它们均假定为二进制向量。

同样,可以通过首先计算h上的边际来获得更有效的总和(请参见http://www.deeplearning.net/tutorial/rbm.html#rbm-“自由能公式”),但这在下面不包括在内。

import numpy as np

# get the next binary vector
def inc(x):
 for i in xrange(len(x)):
  x[i]+=1
  if x[i]<=1: return True
  x[i]=0

 return False

#compute the energy for a single x,h pair
def lh_one(x,h):
 return -np.dot(np.dot(x,W),h)-np.dot(b,x)-np.dot(d,h)

#input is a list of 1d arrays, X
def lh(X):
 K=len(X[0])
 x=np.zeros(K)
 h=np.zeros(K)

 logZ=-np.inf

 #compute the normalizing constant
 while True:
  while True:
   logZ=np.logaddexp(logZ,lh_one(x,h))
   if not inc(h): break
  if not inc(x): break

 #compute the log-likelihood
 lh=0
 for x in X: # iterate over elements in the dataset
  lhp=-np.inf
  while True: #sum over all possible values of h
   lhp=np.logaddexp(lhp,lh_one(x,h))
   if not inc(h): break
  lh+=lhp-logZ

 return lh

10-02 21:30