2

我正在尝试实现 RBM,并在 MNIST 数据集上对其进行测试。然而,它似乎并没有收敛。

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

在每个 epoch 之后,我计算所有 mini-batch 的平均重建误差,以下是我得到的误差:

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

我绘制了要检查的权重直方图(从左到右:隐藏、权重、可见。顶部:权重,底部:更新):

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

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

但是,除了隐藏的偏见看起来有点奇怪,其余的似乎都还可以。

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

epoch 3 之后的权重

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

epoch 4 之后的权重

epoch 4 之后的权重 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

4

1 回答 1

3

您正在使用非常小的学习率。在大多数由 SGD 训练的 NN 中,您从较高的学习率开始,并随着时间的推移而衰减。搜索学习率或自适应学习率以找到更多信息。

其次,在实现一种新算法时,我建议找到介绍它的论文并重现他们的结果。一篇好的论文应该包括大部分使用的设置 - 或用于确定设置的方法。

如果论文不可用,或者它在您无权访问的数据集上进行了测试 - 找到一个有效的实现并在使用相同设置时比较输出。如果实现与功能不兼容,请尽可能多地关闭未共享的功能。

于 2014-01-23T00:51:02.160 回答