我已经在r中编写了一个具有二进制隐藏/可见单元的RBM的工作实现。我一直在寻找一段时间,但只是无法弄清楚如何将二进制单元更改为高斯或relu。
如果我想让我的输入数据是实数,我要改变可见单位和隐藏单位吗?或者仅仅是可见光单位?
假设我想改变这两个。目前,我正在使用逻辑sigmoid函数(1/(1+e^(-x)))计算隐藏/可见概率。ReLU使用max(0, x + N(0,1))。根据我目前的理解,我会将逻辑sigmoid函数的所有出现与ReLU max函数交换。然而,这并不能产生有意义的结果。所以我不确定我到底应该改变什么
您可以更改可见单元激活而不更改隐藏单元激活。所以你可以有伯努利隐藏单位和高斯可见单位。如果对深度网络进行预训练,最好使用与最终网络相同的激活函数(通常是relus)。
我也写过RBM代码,获得更好结果的一个技巧是不要对视觉重构或白日梦进行采样(当使用CD-1时)。如果不看看你的代码或让你为你的结果澄清"一点意义",我将无法提供更多帮助。
关于培训rbm的技巧的一个很好的指南可以在Hinton写的A practical guide to training rbm中找到。
另一个技巧是使用持久对比发散,它假设权重更新足够小,不会改变马尔可夫链。在代码中,它等同于激活来自最后一个白日梦的视觉单元和来自视觉重建的白日梦。根据我的经验,训练花费的时间要少得多,原始论文:http://www.machinelearning.org/archive/icml2008/papers/638.pdf
还是那句话,把你的代码和结果贴出来,我愿意帮你看一看。