Python 在受限玻尔兹曼机中求对数似然

Python 在受限玻尔兹曼机中求对数似然,python,machine-learning,artificial-intelligence,neural-network,Python,Machine Learning,Artificial Intelligence,Neural Network,我已经研究RBMs几个月了,一直在使用Python,并且已经阅读了你所有的论文。我遇到了一个问题,我想,怎么了?为什么不去源头呢?我想我至少会抓住机会让你有时间回答 我的问题是关于受限Boltzmann机器中的对数可能性。我已经读到,除了非常小的模型外,在所有模型中都很难找到精确的对数似然,因此引入了对比散度、PCD、伪对数似然等。我的问题是,即使是在很小的模型中,如何找到精确的对数似然 我遇到了这个公式的几个定义,所有的定义似乎都不同。在Tielemen 2008年的论文“使用似然梯度近似值训

我已经研究RBMs几个月了,一直在使用Python,并且已经阅读了你所有的论文。我遇到了一个问题,我想,怎么了?为什么不去源头呢?我想我至少会抓住机会让你有时间回答

我的问题是关于受限Boltzmann机器中的对数可能性。我已经读到,除了非常小的模型外,在所有模型中都很难找到精确的对数似然,因此引入了对比散度、PCD、伪对数似然等。我的问题是,即使是在很小的模型中,如何找到精确的对数似然

我遇到了这个公式的几个定义,所有的定义似乎都不同。在Tielemen 2008年的论文“使用似然梯度近似值训练受限Boltzmann机器”中,他进行了对数似然检验,以与其他类型的近似值进行比较,但没有说明他使用的公式。我能找到的最接近的东西是,在配分函数上使用能量函数的概率,但是我还不能编写这个,因为我不完全理解语法

在Bengio等人的“表征学习:回顾和新观点”中,对数可能性的等式为: 求和t=1到t(对数P(X^t,θ)) 等于{0,1}^d_h(P(x^(t),h;θ))中的和 其中T是训练示例。这是第11页的(14)

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


我想我问的是你能给我一个代码(Python、伪代码或任何语言)找到给定模型的对数似然的算法,以便我能够理解变量代表什么?这样,在简单的情况下,我可以找到精确的对数似然,然后将它们与我的近似值进行比较,看看我的近似值到底有多好。

您可以将RBM下数据集的对数似然值计算为b下面(我用本吉奥的符号表示W、b和d)。这是一个计算RBM可能性的实用算法,它是x和h长度的指数,这两个向量都被假定为二进制向量

此外,通过首先计算h上的边际值(参见“自由能公式”),可以得到更有效的和,但这不包括在下文中

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
将numpy导入为np
#获取下一个二进制向量
def公司(x):
对于x范围内的i(len(x)):
x[i]+=1

如果x[i]假设你有v个可见单位,h个隐藏单位,v 因此,您可以循环遍历所有2^v可见单位激活子集。然后计算RBM与此特定激活可见子集的可能性是可处理的,因为隐藏单位是独立的[1]。然后循环遍历每个隐藏单元,并根据可见单元的子集将其处于打开和关闭状态的概率相加。然后将所有这些加起来的打开/关闭隐藏概率相乘,得到特定可见单元子集的概率。将所有子集相加,就完成了

问题是,这在v中是指数的。如果v>h,只需“转置”RBM,假装隐藏的是可见的,反之亦然


[1] 隐藏单位不能相互影响,因为影响必须通过可见单位(无h到h连接),但已修复可见单位。

更适合交叉验证(stats.stackexchange)也许吧?非常感谢你详尽的回答。你能帮我定义几个术语吗?这些是我知道的:x=输入向量(通常表示为v或x),W=权重矩阵,h=隐藏状态向量,b=偏差向量,logZ=配分函数。以下是我不知道的:“d”,“lh”和“lhp”d是与隐藏权重相关联的偏差向量(如Bengio).lh是X中所有观察到的输入的总对数似然。lhp是单个输入的部分对数似然。我终于一行一行地浏览了你的代码,我终于明白了!!!非常感谢。我确实有一个问题:看看文献中的函数,似然应该是部分似然除以BY logZ分区。它是减去logZ(lh+=lhplogz)。你的正确吗?它应该是正确的。
log(exp(-E(x,h))/Z)=-E(x,h)-log(Z)
我试图实现这一点,但似乎失败了。请您再解释一下您的意思,或者将其正式化?特别是,在隐藏单元的第二个循环中做了什么?将$p(h_I=1 | v)和$p(h_I=0 | v)相加始终是1,因此我显然遗漏了一些东西。。