我正在尝试实施RBM,我正在MNIST数据集上进行测试。然而,它似乎并没有收敛。
我有28x28个可见单位和100个隐藏单位。我正在使用50号小批量。对于每个时代,我遍历整个数据集。我的学习率为0.01,动量为0.5。基于平均值0.0和stdev为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
我绘制了要检查的权重的直方图(从左到右:隐藏,重量,可见。顶部:重量,底部:更新):
第3纪元后的权重直方图 Histogram of the weights after epoch 3 http://baptiste-wicht.com/static/finals/histogram_epoch_3.png
时代4后的权重直方图 Histogram of the weights after epoch 4 http://baptiste-wicht.com/static/finals/histogram_epoch_4.png
但是,除了看起来有点奇怪的隐藏偏见外,剩下的似乎还可以。
我还尝试绘制隐藏的权重:
第3纪元后的权重
Weights after epoch 3 http://baptiste-wicht.com/static/finals/hiddens_weights_epoch_3.png
第4纪元后的权重
Weights after 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
答案 0 :(得分:3)
您使用的学习率非常低。在由SGD培训的大多数NN中,您开始时具有更高的学习率并且随着时间推移而衰减。搜索学习率或自适应学习率以查找更多信息。
其次,在实施新算法时,我建议找到引入它的论文并重现它们的结果。好的纸张应包括大多数使用的设置 - 或用于确定设置的方法。
如果纸张不可用,或者在您无权访问的数据集上进行了测试 - 请查找工作实施并在使用相同设置时比较输出。如果实现不兼容功能,请关闭尽可能多的未共享功能。