我正在尝试实现 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