我正在尝试实现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
最佳答案
您正在使用非常小的学习率。在大多数由SGD训练的NN中,您会以较高的学习率入手,并随着时间的推移而逐渐降低。搜索学习率或自适应学习率,以查找有关此信息的更多信息。
其次,在实现新算法时,我建议您找到介绍该算法的论文并复制其结果。一份好的论文应该包括大多数使用的设置-或用于确定设置的方法。
如果没有可用的纸张,或者该纸张已在您无权访问的数据集上进行过测试-请找到可行的实现,并在使用相同设置时比较输出。如果实现与功能不兼容,请关闭所有不共享的功能。