如何在受限玻尔兹曼机 (RBM) 中将隐藏层变为二进制?

数据挖掘 机器学习 神经网络 深度学习 无监督学习 RBM
2022-02-19 06:35:40

在 RBM 中,在更新隐藏层(也应该是二进制的)的正阶段,[实际上考虑 h1 ∈ H(隐藏层向量)的节点] 使 h1 成为二进制数,我们计算打开隐藏层的概率通过在总输入上操作激活函数来单位(在激活函数操作之后,我们将获得介于 0 和 1 之间的值,因为我正在使用激活函数 - sigmoid)。我的疑问是我们如何通过利用计算的概率使其二进制化。我不认为如果 P>=0.5,将其设为 1,否则 0 是一种合适的工作方法。

通过一些文献评论,我在第 3.1 节找到了这个文件(由 Hinton 撰写):他说“如果这个概率大于均匀分布在 0 和 1 之间的随机数,则隐藏单元打开”。这实际上意味着什么?而且在这个链接中,他们说“如果在 0 和 1 之间选择 s 均匀分布的随机数,我们发现它的值小于 sig[j],那么第 j 个单元是打开的。否则它是关闭的。” 这个我其实没看懂。对于所有 h ∈ H 生成的随机数是否相同?另一个问题是,下一次采样迭代中的随机数呢?

我看到了这个视频只需按照链接观看该点的视频即可。您如何获得该采样数?我们是否必须在 Matlab 中运行 rand() 并获得它?每个 h(i) 是否应该不同(哦不!我认为机器不会正确学习)?每次迭代的随机数是否应该不同,或者所有迭代都可以使用相同的随机数进行比较?

1个回答

正如你所说的那样,我们计算隐藏单元的概率hj 成为一,然后使其成为二进制。该概率由下式给出

p(hj=1)=σ(bj+i=1Vwijvi)
在哪里σ是 sigmoid 函数,bj是隐藏单元的偏差hj,V是可见单位的数量,vi是可见单元的(二进制!)状态i, 和wij是权重。

因此,用于获取概率的 MATLAB 代码hidden_probs是这样的(我们通过进行矩阵乘法来隐式写入总和):

hidden_probs = sigmoid(hidden_bias + data * weights)

现在,我们有概率p(hj=1)对于每个隐藏单元j[1,H]. 现在,这只是一个概率。我们需要一个二进制数,要么0要么1所以我们唯一能做的就是从概率分布中选择一个随机样本hj,这是一个伯努利分布

由于所有隐藏单元都是独立的,我们需要为每个隐藏单元独立获取一个样本。而且,在每个训练步骤中,我们都需要抽取新样本。

binornd要从伯努利分布中抽取这些样本,您可以使用 MATLAB ( ) 或 Python ( ) 等内置函数numpy.random.binomial请注意,这些函数是从二项分布中采样的,但伯努利分布只是二项分布的一个特例N=1在 MATLAB 中,这将类似于

hidden_states = binornd(1, hidden_probs)

hidden_states这将创建包含0或的向量,1为 中的每个概率随机绘制hidden_probs

您可能已经注意到,没有人这样做!例如,在他的RBM 训练实用指南中将其描述为

如果此概率大于均匀分布在 0 和 1 之间的随机数,则隐藏单元打开。

这正是 Hinton 在他的RBM 代码中所做的:他为每个使用的隐藏单元获取一个随机数rand,即从它们之间的均匀分布中随机抽样[0,1]然后他做了比较:

hidden_states = hidden_probs > rand(1, H)

这相当于 using binornd,但可能更快。例如,要生成一个与 相关的随机数1p=0.9您可以从 中获得一个随机数[0,1]现在,在 90% 的情况下,这个随机数小于 0.9,在 10% 的情况下大于 0.9。1因此,要获得与 相关的随机数p=0.9,您可以调用0.9 > rand(1)- 这正是他们所做的。

tl;dr:[0,1]在每次迭代中从每个隐藏单元的范围中选择一个新的随机数。将其与您的概率进行比较hidden_probs > rand(1,H)以使其成为二进制。