如何找出 RBM 无法正常工作的原因?
Posted
技术标签:
【中文标题】如何找出 RBM 无法正常工作的原因?【英文标题】:How to find why a RBM does not work correctly? 【发布时间】:2014-02-12 16:29:09 【问题描述】:我正在尝试实现 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 之后权重的直方图 Histogram of the weights after epoch 3 http://baptiste-wicht.com/static/finals/histogram_epoch_3.png
epoch 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
【问题讨论】:
【参考方案1】:您正在使用非常小的学习率。在大多数由 SGD 训练的 NN 中,您从较高的学习率开始,并随着时间的推移而衰减。搜索学习率或自适应学习率以找到更多信息。
其次,在实施新算法时,我建议找到介绍它的论文并重现他们的结果。一篇好的论文应该包括大部分使用的设置 - 或用于确定设置的方法。
如果论文不可用,或者它在您无权访问的数据集上进行了测试 - 找到一个可行的实现并在使用相同设置时比较输出。如果实现与功能不兼容,请尽可能多地关闭未共享的功能。
【讨论】:
以上是关于如何找出 RBM 无法正常工作的原因?的主要内容,如果未能解决你的问题,请参考以下文章
如何找出Android logcat消息“跳过n帧。主线程工作太多”的原因