如何找到为什么RBM无法正常工作

How to find why a RBM does not work correctly?

本文关键字:常工作 工作 何找 为什么 RBM      更新时间:2023-10-16

我正在尝试实现RBM,并且正在MNIST数据集上进行测试。但是,它似乎没有融合。

我有28x28可见单元和100个隐藏单元。我正在使用50号尺寸的迷你批次。对于每个时期,我都遍历整个数据集。我的学习率为0.01,动量为0.5。权重是基于平均0.0的高斯分布和0.01的高斯分布随机生成的。可见的和隐藏的偏差初始化为0。我使用的是逻辑sigmoid函数作为激活。

每个时期后,我计算所有迷你批次的平均重建误差,这是我遇到的错误:

epoch 0: Reconstruction error average: 0.0481795
epoch 1: Reconstruction error average: 0.0350295
epoch 2: Reconstruction error average: 0.0324191
epoch 3: Reconstruction error average: 0.0309714
epoch 4: Reconstruction error average: 0.0300068

我绘制了要检查的权重的直方图(从左到右:HIDDENS,权重,Visibles。顶部:权重,底部:更新):

epoch 3之后的权重直方图时期之后的权重直方图3 http://baptiste-wicht.com/static/finals/histogram_epoch_3.png

epoch 4之后的权重直方图段4 http://baptiste-wicht.com/static/finals/histogram_epoch_4.png

但是,除了隐藏的偏见看起来有些怪异之外,剩下的似乎还可以。

我还试图绘制隐藏的权重:

epoch 3

之后

epoch之后的权重http://baptiste-wicht.com/static/finals/hiddens_weights_epoch_3.png

epoch 4

之后的权重

epoch之后的权重http://baptiste-wicht.com/static/finals/hiddens_weights_epoch_4.png

(使用该功能,它们以两种颜色绘制:

static_cast<size_t>(value > 0 ? (static_cast<size_t>(value * 255.0) << 8) : (static_cast<size_t>(-value * 255.)0) << 16) << " ";

在这里,它们根本没有意义...

如果我走得更远,重建误差会增加一点,但不要超过0.025。即使我改变了一段时间后,它也会更高,然后下降一点,但并不有趣。此外,在更多时代之后,权重没有意义。在我看到的大多数示例实现中,重复完成完整数据集后两到三次,权重是有意义的。

我还尝试从可见单元重建图像,但结果似乎几乎是随机的。

我该怎么做才能检查实施中出了什么问题?权重应该在一定范围内吗?数据中似乎真的很奇怪吗?

完成代码:https://github.com/wichtounet/dbn/blob/master/include/rbm.hpp

您使用的学习率很小。在大多数由SGD培训的NN中,您从更高的学习率开始,然后随着时间的流逝而衰减。搜索学习率或自适应学习率,以查找有关此信息的更多信息。

第二,在实施一种新算法时,我建议找到引入它并重现其结果的论文。好的纸张应包括使用的大多数设置 - 或用于确定设置的方法。

如果纸张不可用,或者在您无法访问的数据集上进行了测试,请找到工作实现并在使用相同设置时比较输出。如果实现不兼容实现,请关闭未共享的尽可能多的功能。