在DURBAN中实现Backpropagation时的奇怪行为

时间:2014-04-24 09:59:26

标签: math machine-learning

目前,我正试图实施深度信仰网络。但我遇到了一个非常奇怪的问题。我的源代码可以在这里找到:https://github.com/mistree/GoDeep/blob/master/GoDeep/

我首先使用CD实现了RBM,它运行得很好(通过使用Golang的并发功能,它非常快)。然后我开始实现具有反向传播的正常​​前馈网络,然后发生奇怪的事情。看起来很不稳定。当我使用xor gate测试运行时,它有时会失败,只有当我将隐藏层节点设置为10或更多时,它才会失败。以下是我如何计算

步骤1:使用偏差计算所有激活

第2步:计算输出错误

步骤3:将错误传播回每个节点

步骤4:计算具有动量的每个节点的增量权重和偏差

步骤1到步骤4我做了一整批并总结了这些增量权重和偏差

步骤5:应用平均增量权重和偏差

我在这里按照教程http://ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm

如果我给它更多的隐藏层节点,通常它会工作。我的测试代码在https://github.com/mistree/GoDeep/blob/master/Test.go

所以我认为它应该工作并开始通过结合RBM和普通NN来实现DBN。然而,结果变得非常糟糕。它甚至无法在1000次迭代中学习xor门。有时候完全错了。我尝试调试,所以在DBN的PreTrain之后我进行了重建。大多数情况下重建看起来不错,但是当preTrain结果完美时,反向传播甚至会失败。

我真的不知道反向传播有什么问题。我必须误解算法或在实现中犯了一些重大错误。

如果可能,请运行测试代码,您将看到它有多奇怪。它本身的代码非常易读。任何暗示都会很有帮助。谢谢你提前

1 个答案:

答案 0 :(得分:0)

我记得Hinton说你不能训练RBM的XOR,这是关于不允许双层网络工作的矢量空间。更深的网络具有更少的线性属性,使其可以工作。