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,伪代码或任何语言)算法来查找给定模型的对数似然性,以便我理解变量代表什么吗?这样,在简单的情况下,我可以找到确切的对数似然率,然后将它们与近似值进行比较,以了解近似值的真实程度。
想改善这个问题吗? 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