0

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

我的问题是关于受限玻尔兹曼机中的对数似然。我已经读过,除了非常小的模型之外,在所有模型中找到精确的对数似然是难以处理的,因此引入了对比散度、PCD、伪对数似然等。我的问题是,你如何找到精确的对数似然小模型?

我遇到过这个公式的几个定义,而且似乎都不同。在 Tielemen 2008 年的论文“Training Restricted Boltzmann Machines using Approximations To the Likelihood Gradient”中,他执行了一个对数似然版本的测试来与其他类型的近似值进行比较,但没有说明他使用的公式。我能找到的最接近的是使用能量函数而不是分区函数的概率,但我无法编写这个代码,因为我不完全理解语法。

在 Bengio 等人的“Representation Learning: A Review and New Perspectives”中,对数似然的等式是: sum_t=1 to T (log P(X^T, theta)) 等于 sum_t=1 to T( log * sum_h in {0,1}^d_h(P(x^(t), h; theta)) 其中 T 是训练样本。这是第 11 页的 (14)。

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

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

4

2 回答 2

2

您可以计算XRBM 下数据集的对数似然度,如下所示(我将 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
于 2013-06-14T21:08:31.227 回答
0

假设你有 v 个可见单元和 h 个隐藏单元,并且 v < h。关键思想是,一旦您为每个可见单元固定了所有值,隐藏单元就是独立的。

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

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

[1] 隐藏单元不能相互影响,因为你的影响必须通过可见单元(没有 h 到 h 的连接),但是你已经修复了可见单元。

于 2013-06-14T21:18:01.727 回答