我正在尝试实现RBM,并且正在MNIST数据集上进行测试。但是,它似乎没有融合。
我有28x28可见单元和100个隐藏单元。我正在使用50号尺寸的迷你批次。对于每个时期,我都遍历整个数据集。我的学习率为0.01,动量为0.5。权重是基于平均0.0的高斯分布和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
我绘制了要检查的权重的直方图(从左到右:HIDDENS,权重,Visibles。顶部:权重,底部:更新):
epoch 3之后的权重直方图时期之后的权重直方图3 http://baptiste-wicht.com/static/finals/histogram_epoch_3.png
epoch 4之后的权重直方图段4 http://baptiste-wicht.com/static/finals/histogram_epoch_4.png
但是,除了隐藏的偏见看起来有些怪异之外,剩下的似乎还可以。
我还试图绘制隐藏的权重:
epoch 3
之后epoch之后的权重http://baptiste-wicht.com/static/finals/hiddens_weights_epoch_3.png
epoch 4
之后的权重epoch之后的权重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中,您从更高的学习率开始,然后随着时间的流逝而衰减。搜索学习率或自适应学习率,以查找有关此信息的更多信息。
第二,在实施一种新算法时,我建议找到引入它并重现其结果的论文。好的纸张应包括使用的大多数设置 - 或用于确定设置的方法。
如果纸张不可用,或者在您无法访问的数据集上进行了测试,请找到工作实现并在使用相同设置时比较输出。如果实现不兼容实现,请关闭未共享的尽可能多的功能。