我一直在研究RBM几个月,一路上使用Python,并阅读了所有论文。我有问题,我想,嘿嘿?为什么不去源头?我想我至少会抓住你有时间回答的机会。
我的问题是关于受限玻尔兹曼机器中的对数似然。我已经读过在所有但非常小的模型中找到确切的对数似然是难以处理的,因此引入了对比差异,PCD,伪对数似然等等。我的问题是,你如何找到确切的对数似然性甚至是小模特?
我遇到过这个公式的几个定义,但似乎都有所不同。在Tielemen 2008年的论文“训练限制玻尔兹曼机器使用近似到似然梯度”中,他执行测试的对数似然版本以与其他类型的近似进行比较,但没有说明他使用的公式。我能找到的最接近的是使用能量函数而不是分区函数的概率,但我无法编码,因为我不完全理解语法。
在Bengio等人的“Representation Learning:A Review and New Perspectives”中,对数似然的等式是: sum_t = 1到T(log P(X ^ T,theta)) 等于sum_t = 1到T({0,1} ^ d_h中的log * sum_h(P(x ^(t),h; theta)) 其中T是训练样例。这是第11页的(14)。
唯一的问题是没有定义任何其他变量。我假设x是训练数据实例,但是什么是上标(t)?我还假设theta是潜在变量h,W,v ......但是你如何将它转化为代码呢?
我想我问的是你能给我一个代码(Python,伪代码或任何语言)算法来查找给定模型的对数似然,这样我就可以理解变量的含义了吗?这样,在简单的情况下,我可以找到确切的对数似然,然后将它们与我的近似值进行比较,看看我的近似值是多么好。
答案 0 :(得分:2)
您可以在RBM下计算数据集X
的对数似然性,如下所示(我使用的是带有W,b和d的Bengio表示法)。这是不用于计算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
答案 1 :(得分:0)
假设您有v个可见单位和h个隐藏单位,并且v&lt; H。关键的想法是,一旦你修复了每个可见单元的所有值,隐藏单元就是独立的。
因此,您循环浏览可见单位激活的所有2 ^ v子集。然后计算具有此特定激活的可见子集的RBM的可能性是易处理的,因为隐藏单元是独立的[1]。然后循环遍历每个隐藏单元,并将其开启和关闭的概率加起来以您的可见单元子集为条件。然后将所有这些相加的开/关隐藏概率相乘,得到可见单位的特定子集的概率。添加所有子集,您就完成了。
问题是这在v中是指数的。如果v&gt; h,只是“转置”你的RBM,假装隐藏是可见的,反之亦然。
[1]隐藏单位不能相互影响,因为你的影响必须通过可见单位(没有h到h连接),但是你已经修复了可见单位。